mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-19 19:14:55 +00:00
Merge pull request #1442 from APriestman/caseEDT
Move event publishing and case open/close off EDT
This commit is contained in:
commit
08ae7fbff7
@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.actions;
|
||||
import java.util.Collection;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.Utilities;
|
||||
@ -61,13 +62,16 @@ public class AddBlackboardArtifactTagAction extends AddTagAction {
|
||||
|
||||
@Override
|
||||
protected void addTag(TagName tagName, String comment) {
|
||||
Collection<? extends BlackboardArtifact> selectedArtifacts = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class);
|
||||
final Collection<? extends BlackboardArtifact> selectedArtifacts = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class);
|
||||
|
||||
new Thread(() -> {
|
||||
for (BlackboardArtifact artifact : selectedArtifacts) {
|
||||
try {
|
||||
Case.getCurrentCase().getServices().getTagsManager().addBlackboardArtifactTag(artifact, tagName, comment);
|
||||
}
|
||||
catch (TskCoreException ex) {
|
||||
Logger.getLogger(AddBlackboardArtifactTagAction.class.getName()).log(Level.SEVERE, "Error tagging result", ex); //NON-NLS
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddBlackboardArtifactTagAction.unableToTag.msg",
|
||||
@ -75,7 +79,9 @@ public class AddBlackboardArtifactTagAction extends AddTagAction {
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddBlackboardArtifactTagAction.taggingErr"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.Utilities;
|
||||
@ -64,7 +65,9 @@ public class AddContentTagAction extends AddTagAction {
|
||||
|
||||
@Override
|
||||
protected void addTag(TagName tagName, String comment) {
|
||||
Collection<? extends AbstractFile> selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class);
|
||||
final Collection<? extends AbstractFile> selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class);
|
||||
|
||||
new Thread(() -> {
|
||||
for (AbstractFile file : selectedFiles) {
|
||||
try {
|
||||
// Handle the special cases of current (".") and parent ("..") directory entries.
|
||||
@ -74,6 +77,7 @@ public class AddContentTagAction extends AddTagAction {
|
||||
file = (AbstractFile)parentFile;
|
||||
}
|
||||
else {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.unableToTag.msg",
|
||||
@ -81,6 +85,7 @@ public class AddContentTagAction extends AddTagAction {
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.cannotApplyTagErr"),
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -92,24 +97,30 @@ public class AddContentTagAction extends AddTagAction {
|
||||
file = (AbstractFile)parentFile;
|
||||
}
|
||||
else {
|
||||
final Content parentFileCopy = parentFile;
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.unableToTag.msg",
|
||||
parentFile.getName()),
|
||||
parentFileCopy.getName()),
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.cannotApplyTagErr"),
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
final Content parentFileCopy = parentFile;
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.unableToTag.msg",
|
||||
parentFile.getName()),
|
||||
parentFileCopy.getName()),
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.cannotApplyTagErr"),
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -118,13 +129,16 @@ public class AddContentTagAction extends AddTagAction {
|
||||
List<ContentTag> contentTagList = tagsManager.getContentTagsByContent(file);
|
||||
for (ContentTag contentTag : contentTagList) {
|
||||
if (contentTag.getName().getDisplayName().equals(tagName.getDisplayName())) {
|
||||
AbstractFile fileCopy = file;
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.tagExists",
|
||||
file.getName(), tagName.getDisplayName()),
|
||||
fileCopy.getName(), tagName.getDisplayName()),
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.cannotApplyTagErr"),
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -132,13 +146,17 @@ public class AddContentTagAction extends AddTagAction {
|
||||
}
|
||||
catch (TskCoreException ex) {
|
||||
Logger.getLogger(AddContentTagAction.class.getName()).log(Level.SEVERE, "Error tagging result", ex); //NON-NLS
|
||||
AbstractFile fileCopy = file;
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"AddContentTagAction.unableToTag.msg2",
|
||||
file.getName()),
|
||||
fileCopy.getName()),
|
||||
NbBundle.getMessage(this.getClass(), "AddContentTagAction.taggingErr"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
@ -23,6 +23,7 @@ import java.util.Collection;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.Utilities;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
@ -55,13 +56,15 @@ public class DeleteBlackboardArtifactTagAction extends AbstractAction {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
Collection<? extends BlackboardArtifactTag> selectedTags = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifactTag.class);
|
||||
final Collection<? extends BlackboardArtifactTag> selectedTags = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifactTag.class);
|
||||
new Thread(() -> {
|
||||
for (BlackboardArtifactTag tag : selectedTags) {
|
||||
try {
|
||||
Case.getCurrentCase().getServices().getTagsManager().deleteBlackboardArtifactTag(tag);
|
||||
}
|
||||
catch (TskCoreException ex) {
|
||||
Logger.getLogger(AddContentTagAction.class.getName()).log(Level.SEVERE, "Error deleting tag", ex); //NON-NLS
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"DeleteBlackboardArtifactTagAction.unableToDelTag.msg",
|
||||
@ -69,8 +72,10 @@ public class DeleteBlackboardArtifactTagAction extends AbstractAction {
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"DeleteBlackboardArtifactTagAction.tagDelErr"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ import java.util.Collection;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.Utilities;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
@ -55,20 +56,24 @@ public class DeleteContentTagAction extends AbstractAction {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Collection<? extends ContentTag> selectedTags = Utilities.actionsGlobalContext().lookupAll(ContentTag.class);
|
||||
final Collection<? extends ContentTag> selectedTags = Utilities.actionsGlobalContext().lookupAll(ContentTag.class);
|
||||
new Thread(() -> {
|
||||
for (ContentTag tag : selectedTags) {
|
||||
try {
|
||||
Case.getCurrentCase().getServices().getTagsManager().deleteContentTag(tag);
|
||||
}
|
||||
catch (TskCoreException ex) {
|
||||
Logger.getLogger(AddContentTagAction.class.getName()).log(Level.SEVERE, "Error deleting tag", ex); //NON-NLS
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"DeleteContentTagAction.unableToDelTag.msg",
|
||||
tag.getName()),
|
||||
NbBundle.getMessage(this.getClass(), "DeleteContentTagAction.tagDelErr"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
@ -238,7 +238,9 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel<WizardDe
|
||||
// get the selected DSProcessor
|
||||
dsProcessor = dataSourcePanel.getComponent().getCurrentDSProcessor();
|
||||
|
||||
new Thread(() -> {
|
||||
Case.getCurrentCase().notifyAddingNewDataSource(dataSourceId);
|
||||
}).start();
|
||||
DataSourceProcessorCallback cbObj = new DataSourceProcessorCallback () {
|
||||
@Override
|
||||
public void doneEDT(DataSourceProcessorCallback.DataSourceProcessorResult result, List<String> errList, List<Content> contents) {
|
||||
@ -258,7 +260,9 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel<WizardDe
|
||||
* Cancels the data source processing - in case the users presses 'Cancel'
|
||||
*/
|
||||
private void cancelDataSourceProcessing(UUID dataSourceId) {
|
||||
new Thread(() -> {
|
||||
Case.getCurrentCase().notifyFailedAddingNewDataSource(dataSourceId);
|
||||
}).start();
|
||||
dsProcessor.cancel();
|
||||
}
|
||||
|
||||
@ -307,11 +311,13 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel<WizardDe
|
||||
newContents.addAll(contents);
|
||||
|
||||
//notify the UI of the new content added to the case
|
||||
new Thread(() -> {
|
||||
if (!newContents.isEmpty()) {
|
||||
Case.getCurrentCase().notifyNewDataSource(newContents.get(0), dataSourceId);
|
||||
} else {
|
||||
Case.getCurrentCase().notifyFailedAddingNewDataSource(dataSourceId);
|
||||
}
|
||||
}).start();
|
||||
|
||||
|
||||
// Start ingest if we can
|
||||
|
@ -44,6 +44,7 @@ import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.actions.CallableSystemAction;
|
||||
import org.openide.util.actions.SystemAction;
|
||||
@ -328,7 +329,9 @@ public class Case {
|
||||
currentCase = newCase;
|
||||
Logger.setLogDirectory(currentCase.getLogDirectoryPath());
|
||||
doCaseChange(currentCase);
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
RecentCases.getInstance().addRecentCase(currentCase.name, currentCase.configFilePath); // update the recent cases
|
||||
});
|
||||
if (CaseType.MULTI_USER_CASE == newCase.getCaseType()) {
|
||||
try {
|
||||
/**
|
||||
@ -523,20 +526,24 @@ public class Case {
|
||||
String dbPath = caseDir + File.separator + "autopsy.db"; //NON-NLS
|
||||
db = SleuthkitCase.openCase(dbPath);
|
||||
if (null != db.getBackupDatabasePath()) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg",
|
||||
db.getBackupDatabasePath()),
|
||||
NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"),
|
||||
JOptionPane.INFORMATION_MESSAGE);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
db = SleuthkitCase.openCase(xmlcm.getDatabaseName(), UserPreferences.getDatabaseConnectionInfo(), caseDir);
|
||||
if (null != db.getBackupDatabasePath()) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg",
|
||||
db.getBackupDatabasePath()),
|
||||
NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"),
|
||||
JOptionPane.INFORMATION_MESSAGE);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -646,6 +653,8 @@ public class Case {
|
||||
* Notifies case event subscribers (property change listeners) that a data
|
||||
* source is being added to the case database.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param dataSourceId A unique identifier for the data source. This UUID
|
||||
* should be used to call notifyNewDataSource() after the
|
||||
* data source is added.
|
||||
@ -658,6 +667,8 @@ public class Case {
|
||||
* Notifies case event subscribers (property change listeners) that a data
|
||||
* source failed to be added to the case database.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param dataSourceId A unique identifier for the data source.
|
||||
*/
|
||||
public void notifyFailedAddingNewDataSource(UUID dataSourceId) {
|
||||
@ -668,6 +679,8 @@ public class Case {
|
||||
* Notifies case event subscribers (property change listeners) that a data
|
||||
* source is being added to the case database.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param newDataSource New data source added.
|
||||
* @param dataSourceId A unique identifier for the data source. Should be
|
||||
* the same UUID used to call notifyAddingNewDataSource() when the process
|
||||
@ -680,6 +693,8 @@ public class Case {
|
||||
/**
|
||||
* Notifies the UI that a new ContentTag has been added.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param newTag new ContentTag added
|
||||
*/
|
||||
public void notifyContentTagAdded(ContentTag newTag) {
|
||||
@ -689,6 +704,8 @@ public class Case {
|
||||
/**
|
||||
* Notifies the UI that a ContentTag has been deleted.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param deletedTag ContentTag deleted
|
||||
*/
|
||||
public void notifyContentTagDeleted(ContentTag deletedTag) {
|
||||
@ -698,6 +715,8 @@ public class Case {
|
||||
/**
|
||||
* Notifies the UI that a new BlackboardArtifactTag has been added.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param newTag new BlackboardArtifactTag added
|
||||
*/
|
||||
public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag) {
|
||||
@ -705,7 +724,9 @@ public class Case {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the UI that a BlackboardArtifactTag has been.
|
||||
* Notifies the UI that a BlackboardArtifactTag has been deleted.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param deletedTag BlackboardArtifactTag deleted
|
||||
*/
|
||||
@ -775,6 +796,8 @@ public class Case {
|
||||
/**
|
||||
* Updates the case name.
|
||||
*
|
||||
* This should not be called from the EDT.
|
||||
*
|
||||
* @param oldCaseName the old case name that wants to be updated
|
||||
* @param oldPath the old path that wants to be updated
|
||||
* @param newCaseName the new case name
|
||||
@ -784,9 +807,15 @@ public class Case {
|
||||
try {
|
||||
xmlcm.setCaseName(newCaseName); // set the case
|
||||
name = newCaseName; // change the local value
|
||||
RecentCases.getInstance().updateRecentCase(oldCaseName, oldPath, newCaseName, newPath); // update the recent case
|
||||
eventPublisher.publish(new AutopsyEvent(Events.NAME.toString(), oldCaseName, newCaseName));
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
try{
|
||||
RecentCases.getInstance().updateRecentCase(oldCaseName, oldPath, newCaseName, newPath); // update the recent case
|
||||
updateMainWindowTitle(newCaseName);
|
||||
} catch (Exception e) {
|
||||
Logger.getLogger(CasePropertiesForm.class.getName()).log(Level.WARNING, "Error: problem updating case name.", e); //NON-NLS
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
throw new CaseActionException(NbBundle.getMessage(this.getClass(), "Case.updateCaseName.exception.msg"), e);
|
||||
}
|
||||
@ -795,6 +824,8 @@ public class Case {
|
||||
/**
|
||||
* Updates the case examiner
|
||||
*
|
||||
* This should not be called from the EDT.
|
||||
*
|
||||
* @param oldExaminer the old examiner
|
||||
* @param newExaminer the new examiner
|
||||
*/
|
||||
@ -811,6 +842,8 @@ public class Case {
|
||||
/**
|
||||
* Updates the case number
|
||||
*
|
||||
* This should not be called from the EDT.
|
||||
*
|
||||
* @param oldCaseNumber the old case number
|
||||
* @param newCaseNumber the new case number
|
||||
*/
|
||||
@ -1467,29 +1500,41 @@ public class Case {
|
||||
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
// enable these menus
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu
|
||||
});
|
||||
|
||||
if (toChangeTo.hasData()) {
|
||||
// open all top components
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
CoreComponentControl.openCoreWindows();
|
||||
});
|
||||
} else {
|
||||
// close all top components
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
updateMainWindowTitle(currentCase.name);
|
||||
});
|
||||
} else {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
Frame f = WindowManager.getDefault().getMainWindow();
|
||||
f.setTitle(Case.getAppName()); // set the window name to just application name
|
||||
});
|
||||
}
|
||||
|
||||
} else { // case is closed
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
// close all top components first
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
|
||||
@ -1498,13 +1543,18 @@ public class Case {
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu
|
||||
});
|
||||
}
|
||||
|
||||
//clear pending notifications
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
MessageNotifyUtil.Notify.clear();
|
||||
});
|
||||
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
Frame f = WindowManager.getDefault().getMainWindow();
|
||||
f.setTitle(Case.getAppName()); // set the window name to just application name
|
||||
});
|
||||
|
||||
//try to force gc to happen
|
||||
System.gc();
|
||||
|
@ -27,6 +27,7 @@ import java.util.logging.Level;import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.openide.util.HelpCtx;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.actions.CallableSystemAction;
|
||||
@ -70,19 +71,24 @@ import org.openide.util.actions.Presenter;
|
||||
return;
|
||||
}
|
||||
|
||||
Case result = Case.getCurrentCase();
|
||||
new SwingWorker<Void, Void>() {
|
||||
|
||||
@Override
|
||||
protected Void doInBackground() throws Exception {
|
||||
try{
|
||||
Case result = Case.getCurrentCase();
|
||||
result.closeCase();
|
||||
} catch (Exception ex) {
|
||||
} catch (CaseActionException | IllegalStateException ex){
|
||||
Logger.getLogger(CaseCloseAction.class.getName()).log(Level.SEVERE, "Error closing case.", ex); //NON-NLS
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
protected void done() {
|
||||
StartupWindowProvider.getInstance().open();
|
||||
}
|
||||
});
|
||||
}.execute();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -23,9 +23,12 @@ import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import org.openide.util.NbBundle;
|
||||
@ -76,7 +79,7 @@ public final class CaseOpenAction implements ActionListener {
|
||||
int retval = fc.showOpenDialog(WindowManager.getDefault().getMainWindow());
|
||||
|
||||
if (retval == JFileChooser.APPROVE_OPTION) {
|
||||
String path = fc.getSelectedFile().getPath();
|
||||
final String path = fc.getSelectedFile().getPath();
|
||||
String dirPath = fc.getSelectedFile().getParent();
|
||||
ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator)));
|
||||
// check if the file exists
|
||||
@ -96,9 +99,13 @@ public final class CaseOpenAction implements ActionListener {
|
||||
// no need to show the error message to the user.
|
||||
logger.log(Level.WARNING, "Error closing startup window.", ex); //NON-NLS
|
||||
}
|
||||
|
||||
new Thread(() -> {
|
||||
// Create case.
|
||||
try{
|
||||
Case.open(path); // open the case
|
||||
Case.open(path);
|
||||
} catch (CaseActionException ex) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.msg", path,
|
||||
@ -106,10 +113,13 @@ public final class CaseOpenAction implements ActionListener {
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.title"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
logger.log(Level.WARNING, "Error opening case in folder " + path, ex); //NON-NLS
|
||||
|
||||
|
||||
StartupWindowProvider.getInstance().open();
|
||||
}
|
||||
});
|
||||
logger.log(Level.WARNING, "Error opening case in folder " + path, ex); //NON-NLS
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,10 @@ import java.awt.Dialog;
|
||||
import java.io.File;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.logging.Level;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.DialogDescriptor;
|
||||
import org.openide.DialogDisplayer;
|
||||
import org.openide.NotifyDescriptor;
|
||||
@ -81,7 +84,7 @@ import org.sleuthkit.datamodel.TskData.DbType;
|
||||
* The method to perform new case creation
|
||||
*/
|
||||
private void newCaseAction() {
|
||||
WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
|
||||
final WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
|
||||
// {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
|
||||
wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
|
||||
wizardDescriptor.setTitle(NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.newCase.windowTitle.text"));
|
||||
@ -89,15 +92,28 @@ import org.sleuthkit.datamodel.TskData.DbType;
|
||||
dialog.setVisible(true);
|
||||
dialog.toFront();
|
||||
|
||||
if(wizardDescriptor.getValue() == WizardDescriptor.FINISH_OPTION){
|
||||
new SwingWorker<Void, Void>() {
|
||||
|
||||
boolean finished = wizardDescriptor.getValue() == WizardDescriptor.FINISH_OPTION; // check if it finishes (it's not cancelled)
|
||||
boolean isCancelled = wizardDescriptor.getValue() == WizardDescriptor.CANCEL_OPTION; // check if the "Cancel" button is pressed
|
||||
@Override
|
||||
protected Void doInBackground() throws Exception {
|
||||
// Create case.
|
||||
|
||||
// if the finish button is pressed (not cancelled)
|
||||
if (finished) {
|
||||
// now start the 'Add Image' wizard
|
||||
//TODO fix for local
|
||||
CaseType currentCaseType = CaseType.fromString(ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, ModuleSettings.CURRENT_CASE_TYPE));
|
||||
String caseNumber = (String) wizardDescriptor.getProperty("caseNumber"); //NON-NLS
|
||||
String examiner = (String) wizardDescriptor.getProperty("caseExaminer"); //NON-NLS
|
||||
final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS
|
||||
String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS
|
||||
CaseType caseType = CaseType.values()[(int)wizardDescriptor.getProperty("caseType")]; //NON-NLS
|
||||
|
||||
Case.create(createdDirectory, caseName, caseNumber, examiner, caseType);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void done() {
|
||||
try {
|
||||
get();
|
||||
CaseType currentCaseType = CaseType.values()[(int)wizardDescriptor.getProperty("caseType")]; //NON-NLS
|
||||
CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo();
|
||||
if ((currentCaseType==CaseType.SINGLE_USER_CASE) || ((info.getDbType() != DbType.SQLITE) && info.canConnect())) {
|
||||
AddImageAction addImageAction = SystemAction.get(AddImageAction.class);
|
||||
@ -107,26 +123,40 @@ import org.sleuthkit.datamodel.TskData.DbType;
|
||||
NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem1.text"),
|
||||
NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem2.text"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
isCancelled = true;
|
||||
doFailedCaseCleanup(wizardDescriptor);
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception ex) {
|
||||
final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null, NbBundle.getMessage(this.getClass(),
|
||||
"CaseCreateAction.msgDlg.cantCreateCase.msg")+" "+caseName,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.title"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
doFailedCaseCleanup(wizardDescriptor);
|
||||
}
|
||||
}
|
||||
}.execute();
|
||||
|
||||
|
||||
} else {
|
||||
new Thread(() -> {
|
||||
doFailedCaseCleanup(wizardDescriptor);
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
// if Cancel button is pressed
|
||||
if (isCancelled) {
|
||||
private void doFailedCaseCleanup(WizardDescriptor wizardDescriptor){
|
||||
String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS
|
||||
// if there's case opened, close the case
|
||||
if (Case.existsCurrentCase()) {
|
||||
// close the previous case if there's any
|
||||
CaseCloseAction closeCase = SystemAction.get(CaseCloseAction.class);
|
||||
closeCase.actionPerformed(null);
|
||||
}
|
||||
|
||||
if (createdDirectory != null) {
|
||||
logger.log(Level.INFO, "Deleting a created case directory due to isCancelled set, dir: " + createdDirectory); //NON-NLS
|
||||
logger.log(Level.INFO, "Deleting a created case directory due to an error, dir: " + createdDirectory); //NON-NLS
|
||||
Case.deleteCaseDirectory(new File(createdDirectory));
|
||||
}
|
||||
}
|
||||
panels = null; // reset the panel
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize panels representing individual wizard's steps and sets
|
||||
|
@ -171,33 +171,12 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel<WizardDesc
|
||||
*/
|
||||
@Override
|
||||
public void storeSettings(WizardDescriptor settings) {
|
||||
NewCaseVisualPanel2 currentComponent = getComponent();
|
||||
settings.putProperty("caseNumber", currentComponent.getCaseNumber());
|
||||
settings.putProperty("caseExaminer", currentComponent.getExaminer());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate() throws WizardValidationException {
|
||||
|
||||
NewCaseVisualPanel2 currentComponent = getComponent();
|
||||
final String caseNumber = currentComponent.getCaseNumber();
|
||||
final String examiner = currentComponent.getExaminer();
|
||||
try {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Case.create(createdDirectory, caseName, caseNumber, examiner, caseType);
|
||||
} catch (Exception ex) {
|
||||
JOptionPane.showMessageDialog(null, NbBundle.getMessage(this.getClass(),
|
||||
"CaseCreateAction.msgDlg.cantCreateCase.msg")+" "+caseName,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.title"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception ex) {
|
||||
throw new WizardValidationException(this.getComponent(),
|
||||
NbBundle.getMessage(this.getClass(), "NewCaseWizardPanel2.validate.errCreateCase.msg"), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,9 +24,12 @@ import java.awt.EventQueue;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.File;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
@ -187,8 +190,8 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
||||
logger.log(Level.INFO, "No Case paths exist, cannot open the case"); //NON-NLS
|
||||
return;
|
||||
}
|
||||
String casePath = casePaths[imagesTable.getSelectedRow()];
|
||||
String caseName = caseNames[imagesTable.getSelectedRow()];
|
||||
final String casePath = casePaths[imagesTable.getSelectedRow()];
|
||||
final String caseName = caseNames[imagesTable.getSelectedRow()];
|
||||
if (!casePath.equals("")) {
|
||||
// Close the startup menu
|
||||
try {
|
||||
@ -198,7 +201,6 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
||||
logger.log(Level.WARNING, "Error: couldn't open case: " + caseName, ex); //NON-NLS
|
||||
}
|
||||
// Open the recent cases
|
||||
try {
|
||||
if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
@ -215,9 +217,12 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
||||
}
|
||||
|
||||
} else {
|
||||
Case.open(casePath); // open the case
|
||||
}
|
||||
new Thread(() -> {
|
||||
// Create case.
|
||||
try{
|
||||
Case.open(casePath);
|
||||
} catch (CaseActionException ex) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.msg", caseName,
|
||||
@ -225,8 +230,11 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
||||
NbBundle.getMessage(this.getClass(),
|
||||
"CaseOpenAction.msgDlg.cantOpenCase.title"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
logger.log(Level.WARNING, "Error: couldn't open case: " + caseName, ex); //NON-NLS
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
|
@ -23,9 +23,12 @@ import java.awt.EventQueue;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
@ -35,8 +38,8 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
*/
|
||||
class RecentItems implements ActionListener {
|
||||
|
||||
String caseName;
|
||||
String casePath;
|
||||
final String caseName;
|
||||
final String casePath;
|
||||
private JPanel caller; // for error handling
|
||||
|
||||
/** the constructor */
|
||||
@ -76,15 +79,20 @@ class RecentItems implements ActionListener {
|
||||
}
|
||||
}
|
||||
else {
|
||||
new Thread(() -> {
|
||||
// Create case.
|
||||
try{
|
||||
Case.open(casePath); // open the case
|
||||
Case.open(casePath);
|
||||
} catch (CaseActionException ex) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.msg", casePath,
|
||||
ex.getMessage()), NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
});
|
||||
Logger.getLogger(RecentItems.class.getName()).log(Level.WARNING, "Error: Couldn't open recent case at " + casePath, ex); //NON-NLS
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,10 +24,12 @@ import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UIManager.LookAndFeelInfo;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.netbeans.spi.sendopts.OptionProcessor;
|
||||
import org.netbeans.swing.tabcontrol.plaf.DefaultTabbedContainerUI;
|
||||
import org.openide.modules.ModuleInstall;
|
||||
@ -74,13 +76,18 @@ public class Installer extends ModuleInstall {
|
||||
for (OptionProcessor processor : processors) {
|
||||
if (processor instanceof OpenFromArguments) {
|
||||
OpenFromArguments argsProcessor = (OpenFromArguments) processor;
|
||||
String caseFile = argsProcessor.getDefaultArg();
|
||||
final String caseFile = argsProcessor.getDefaultArg();
|
||||
if (caseFile != null && !caseFile.equals("") && caseFile.endsWith(".aut") && new File(caseFile).exists()) { //NON-NLS
|
||||
|
||||
new Thread(() -> {
|
||||
// Create case.
|
||||
try{
|
||||
Case.open(caseFile);
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
} catch(Exception ex){
|
||||
logger.log(Level.WARNING, "Error opening case. ", ex); //NON-NLS
|
||||
}
|
||||
}).start();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -99,13 +106,15 @@ public class Installer extends ModuleInstall {
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
if (Case.isCaseOpen())
|
||||
Case.getCurrentCase().closeCase();
|
||||
}
|
||||
catch (CaseActionException ex) {
|
||||
catch (CaseActionException | IllegalStateException ex) {
|
||||
logger.log(Level.WARNING, "Error closing case. ", ex); //NON-NLS
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
private void setupLAF() {
|
||||
|
@ -567,8 +567,10 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
CoreComponentControl.openCoreWindows();
|
||||
SwingUtilities.invokeLater(this::componentOpened);
|
||||
componentOpened();
|
||||
});
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
|
@ -169,7 +169,9 @@ final class RemoteEventPublisher {
|
||||
if (object instanceof AutopsyEvent) {
|
||||
AutopsyEvent event = (AutopsyEvent) object;
|
||||
event.setSourceType(AutopsyEvent.SourceType.REMOTE);
|
||||
new Thread(() -> {
|
||||
localPublisher.publish(event);
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user