diff --git a/Core/src/org/sleuthkit/autopsy/actions/AddBlackboardArtifactTagAction.java b/Core/src/org/sleuthkit/autopsy/actions/AddBlackboardArtifactTagAction.java index 2568ba2936..91dc25193c 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/AddBlackboardArtifactTagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/AddBlackboardArtifactTagAction.java @@ -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,21 +62,26 @@ public class AddBlackboardArtifactTagAction extends AddTagAction { @Override protected void addTag(TagName tagName, String comment) { - Collection selectedArtifacts = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class); - 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 - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddBlackboardArtifactTagAction.unableToTag.msg", - artifact.getDisplayName()), - NbBundle.getMessage(this.getClass(), - "AddBlackboardArtifactTagAction.taggingErr"), - JOptionPane.ERROR_MESSAGE); - } - } + final Collection 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", + artifact.getDisplayName()), + NbBundle.getMessage(this.getClass(), + "AddBlackboardArtifactTagAction.taggingErr"), + JOptionPane.ERROR_MESSAGE); + }); + } + } + }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/actions/AddContentTagAction.java b/Core/src/org/sleuthkit/autopsy/actions/AddContentTagAction.java index cff35af7c1..6f1b493ecf 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/AddContentTagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/AddContentTagAction.java @@ -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,81 +65,98 @@ public class AddContentTagAction extends AddTagAction { @Override protected void addTag(TagName tagName, String comment) { - Collection selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class); - for (AbstractFile file : selectedFiles) { - try { - // Handle the special cases of current (".") and parent ("..") directory entries. - if (file.getName().equals(".")) { - Content parentFile = file.getParent(); - if (parentFile instanceof AbstractFile) { - file = (AbstractFile)parentFile; - } - else { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.unableToTag.msg", - parentFile.getName()), - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.cannotApplyTagErr"), - JOptionPane.WARNING_MESSAGE); - continue; - } - } - else if (file.getName().equals("..")) { - Content parentFile = file.getParent(); - if (parentFile instanceof AbstractFile) { - parentFile = (AbstractFile)((AbstractFile)parentFile).getParent(); + final Collection selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class); + + new Thread(() -> { + for (AbstractFile file : selectedFiles) { + try { + // Handle the special cases of current (".") and parent ("..") directory entries. + if (file.getName().equals(".")) { + Content parentFile = file.getParent(); if (parentFile instanceof AbstractFile) { file = (AbstractFile)parentFile; } else { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.unableToTag.msg", - parentFile.getName()), - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.cannotApplyTagErr"), - JOptionPane.WARNING_MESSAGE); + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), + "AddContentTagAction.unableToTag.msg", + parentFile.getName()), + NbBundle.getMessage(this.getClass(), + "AddContentTagAction.cannotApplyTagErr"), + JOptionPane.WARNING_MESSAGE); + }); continue; } } - else { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.unableToTag.msg", - parentFile.getName()), - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.cannotApplyTagErr"), - JOptionPane.WARNING_MESSAGE); - continue; - } - } - // check if the same tag is being added for the same abstract file. - TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); - List contentTagList = tagsManager.getContentTagsByContent(file); - for (ContentTag contentTag : contentTagList) { - if (contentTag.getName().getDisplayName().equals(tagName.getDisplayName())) { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.tagExists", - file.getName(), tagName.getDisplayName()), - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.cannotApplyTagErr"), - JOptionPane.WARNING_MESSAGE); - return; + else if (file.getName().equals("..")) { + Content parentFile = file.getParent(); + if (parentFile instanceof AbstractFile) { + parentFile = (AbstractFile)((AbstractFile)parentFile).getParent(); + if (parentFile instanceof AbstractFile) { + file = (AbstractFile)parentFile; + } + else { + final Content parentFileCopy = parentFile; + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), + "AddContentTagAction.unableToTag.msg", + 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", + parentFileCopy.getName()), + NbBundle.getMessage(this.getClass(), + "AddContentTagAction.cannotApplyTagErr"), + JOptionPane.WARNING_MESSAGE); + }); + continue; + } } + // check if the same tag is being added for the same abstract file. + TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); + List 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", + fileCopy.getName(), tagName.getDisplayName()), + NbBundle.getMessage(this.getClass(), + "AddContentTagAction.cannotApplyTagErr"), + JOptionPane.WARNING_MESSAGE); + }); + return; + } + } + tagsManager.addContentTag(file, tagName, comment); } - tagsManager.addContentTag(file, tagName, comment); - } - catch (TskCoreException ex) { - Logger.getLogger(AddContentTagAction.class.getName()).log(Level.SEVERE, "Error tagging result", ex); //NON-NLS - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "AddContentTagAction.unableToTag.msg2", - file.getName()), - NbBundle.getMessage(this.getClass(), "AddContentTagAction.taggingErr"), - JOptionPane.ERROR_MESSAGE); - } - } - } + 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", + fileCopy.getName()), + NbBundle.getMessage(this.getClass(), "AddContentTagAction.taggingErr"), + JOptionPane.ERROR_MESSAGE); + }); + } + } + }).start(); + } } \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/actions/DeleteBlackboardArtifactTagAction.java b/Core/src/org/sleuthkit/autopsy/actions/DeleteBlackboardArtifactTagAction.java index ac9e29fe59..51482c0928 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/DeleteBlackboardArtifactTagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/DeleteBlackboardArtifactTagAction.java @@ -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,22 +56,26 @@ public class DeleteBlackboardArtifactTagAction extends AbstractAction { @Override public void actionPerformed(ActionEvent event) { - Collection selectedTags = Utilities.actionsGlobalContext().lookupAll(BlackboardArtifactTag.class); - 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 - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "DeleteBlackboardArtifactTagAction.unableToDelTag.msg", - tag.getName()), - NbBundle.getMessage(this.getClass(), - "DeleteBlackboardArtifactTagAction.tagDelErr"), - JOptionPane.ERROR_MESSAGE); - } - } + final Collection 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", + tag.getName()), + NbBundle.getMessage(this.getClass(), + "DeleteBlackboardArtifactTagAction.tagDelErr"), + JOptionPane.ERROR_MESSAGE); + }); + } + } + }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/actions/DeleteContentTagAction.java b/Core/src/org/sleuthkit/autopsy/actions/DeleteContentTagAction.java index c716311eea..f215df8a40 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/DeleteContentTagAction.java +++ b/Core/src/org/sleuthkit/autopsy/actions/DeleteContentTagAction.java @@ -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 selectedTags = Utilities.actionsGlobalContext().lookupAll(ContentTag.class); - 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 - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "DeleteContentTagAction.unableToDelTag.msg", - tag.getName()), - NbBundle.getMessage(this.getClass(), "DeleteContentTagAction.tagDelErr"), - JOptionPane.ERROR_MESSAGE); - } - } + final Collection 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(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java index d9479c5a6d..2633d0f74e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardIngestConfigPanel.java @@ -238,7 +238,9 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel { + Case.getCurrentCase().notifyAddingNewDataSource(dataSourceId); + }).start(); DataSourceProcessorCallback cbObj = new DataSourceProcessorCallback () { @Override public void doneEDT(DataSourceProcessorCallback.DataSourceProcessorResult result, List errList, List contents) { @@ -258,8 +260,10 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel { + Case.getCurrentCase().notifyFailedAddingNewDataSource(dataSourceId); + }).start(); + dsProcessor.cancel(); } /* @@ -307,11 +311,13 @@ class AddImageWizardIngestConfigPanel implements WizardDescriptor.Panel { + if (!newContents.isEmpty()) { + Case.getCurrentCase().notifyNewDataSource(newContents.get(0), dataSourceId); + } else { + Case.getCurrentCase().notifyFailedAddingNewDataSource(dataSourceId); + } + }).start(); // Start ingest if we can diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index f28acaae03..3b33f047cc 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -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); - RecentCases.getInstance().addRecentCase(currentCase.name, currentCase.configFilePath); // update the recent cases + 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()) { - 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); + 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()) { - 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); + 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); + }); } } @@ -645,6 +652,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 @@ -657,6 +666,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. */ @@ -667,6 +678,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 @@ -679,6 +692,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 */ @@ -688,6 +703,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 */ @@ -697,6 +714,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 */ @@ -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 */ @@ -774,6 +795,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 @@ -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)); - updateMainWindowTitle(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); } @@ -794,6 +823,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 @@ -810,6 +841,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,44 +1500,61 @@ public class Case { if (IngestManager.getInstance().isRunningInteractively()) { // enable these menus - 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 + 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 - CoreComponentControl.openCoreWindows(); + SwingUtilities.invokeLater(() -> { + CoreComponentControl.openCoreWindows(); + }); } else { // close all top components - CoreComponentControl.closeCoreWindows(); + SwingUtilities.invokeLater(() -> { + CoreComponentControl.closeCoreWindows(); + }); } } if (IngestManager.getInstance().isRunningInteractively()) { - updateMainWindowTitle(currentCase.name); + SwingUtilities.invokeLater(() -> { + updateMainWindowTitle(currentCase.name); + }); } else { - Frame f = WindowManager.getDefault().getMainWindow(); - f.setTitle(Case.getAppName()); // set the window name to just application name + 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()) { - // close all top components first - CoreComponentControl.closeCoreWindows(); - - // disable these menus - CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu - 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 + + SwingUtilities.invokeLater(() -> { + // close all top components first + CoreComponentControl.closeCoreWindows(); + + // disable these menus + CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu + 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 - MessageNotifyUtil.Notify.clear(); + SwingUtilities.invokeLater(() -> { + MessageNotifyUtil.Notify.clear(); + }); - Frame f = WindowManager.getDefault().getMainWindow(); - f.setTitle(Case.getAppName()); // set the window name to just application name + 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(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index ad0b4cc952..702162b987 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java @@ -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(); - try { - result.closeCase(); - } catch (Exception ex) { - Logger.getLogger(CaseCloseAction.class.getName()).log(Level.SEVERE, "Error closing case.", ex); //NON-NLS - } - - EventQueue.invokeLater(new Runnable() { + new SwingWorker() { + @Override - public void run() { + protected Void doInBackground() throws Exception { + try{ + Case result = Case.getCurrentCase(); + result.closeCase(); + } catch (CaseActionException | IllegalStateException ex){ + Logger.getLogger(CaseCloseAction.class.getName()).log(Level.SEVERE, "Error closing case.", ex); //NON-NLS + } + return null; + } + + @Override + protected void done() { StartupWindowProvider.getInstance().open(); } - }); + }.execute(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index f767efcf09..5bae094395 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -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,20 +99,27 @@ 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 } - try { - Case.open(path); // open the case - } catch (CaseActionException ex) { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), - "CaseOpenAction.msgDlg.cantOpenCase.msg", path, - ex.getMessage()), - NbBundle.getMessage(this.getClass(), - "CaseOpenAction.msgDlg.cantOpenCase.title"), - JOptionPane.ERROR_MESSAGE); - logger.log(Level.WARNING, "Error opening case in folder " + path, ex); //NON-NLS + + new Thread(() -> { + // Create case. + try{ + Case.open(path); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), + "CaseOpenAction.msgDlg.cantOpenCase.msg", path, + ex.getMessage()), + NbBundle.getMessage(this.getClass(), + "CaseOpenAction.msgDlg.cantOpenCase.title"), + JOptionPane.ERROR_MESSAGE); - StartupWindowProvider.getInstance().open(); - } + + StartupWindowProvider.getInstance().open(); + }); + logger.log(Level.WARNING, "Error opening case in folder " + path, ex); //NON-NLS + } + }).start(); } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index bc9cdea275..aad75a51c0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -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,44 +92,71 @@ import org.sleuthkit.datamodel.TskData.DbType; dialog.setVisible(true); dialog.toFront(); + if(wizardDescriptor.getValue() == WizardDescriptor.FINISH_OPTION){ + new SwingWorker() { - 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. + + 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 - // 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)); - CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo(); - if ((currentCaseType==CaseType.SINGLE_USER_CASE) || ((info.getDbType() != DbType.SQLITE) && info.canConnect())) { - AddImageAction addImageAction = SystemAction.get(AddImageAction.class); - addImageAction.actionPerformed(null); - } else { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem1.text"), - NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem2.text"), - JOptionPane.ERROR_MESSAGE); - isCancelled = true; - } + 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); + addImageAction.actionPerformed(null); + } else { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem1.text"), + NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem2.text"), + JOptionPane.ERROR_MESSAGE); + 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) { - 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 - Case.deleteCaseDirectory(new File(createdDirectory)); - } - } - panels = null; // reset the panel } + + private void doFailedCaseCleanup(WizardDescriptor wizardDescriptor){ + String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS + + if (createdDirectory != null) { + logger.log(Level.INFO, "Deleting a created case directory due to an error, dir: " + createdDirectory); //NON-NLS + Case.deleteCaseDirectory(new File(createdDirectory)); + } + } /** * Initialize panels representing individual wizard's steps and sets diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 98a972a5af..f3edbe0370 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -171,33 +171,12 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel { + // Create case. + try{ + Case.open(casePath); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.msg", caseName, ex.getMessage()), NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); - logger.log(Level.WARNING, "Error: couldn't open case: " + caseName, ex); //NON-NLS + }); + logger.log(Level.WARNING, "Error: couldn't open case: " + caseName, ex); //NON-NLS + } + }).start(); } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 43de7bbb7f..763dfe59d2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -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 { - try { - Case.open(casePath); // open the case - } catch (CaseActionException ex) { - JOptionPane.showMessageDialog(null, + new Thread(() -> { + // Create case. + try{ + 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 - } + }); + Logger.getLogger(RecentItems.class.getName()).log(Level.WARNING, "Error: Couldn't open recent case at " + casePath, ex); //NON-NLS + } + }).start(); } } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java index d38e58525e..14da528efc 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Installer.java @@ -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 - try { - Case.open(caseFile); - return; - } catch (Exception e) { - } + + new Thread(() -> { + // Create case. + try{ + Case.open(caseFile); + } 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() { - try { - if (Case.isCaseOpen()) - Case.getCurrentCase().closeCase(); - } - catch (CaseActionException ex) { - logger.log(Level.WARNING, "Error closing case. ", ex); //NON-NLS - } + new Thread(() -> { + try { + if (Case.isCaseOpen()) + Case.getCurrentCase().closeCase(); + } + catch (CaseActionException | IllegalStateException ex) { + logger.log(Level.WARNING, "Error closing case. ", ex); //NON-NLS + } + }).start(); } private void setupLAF() { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 791272d57b..d93f3d1ba8 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -567,8 +567,10 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat */ try { Case.getCurrentCase(); - CoreComponentControl.openCoreWindows(); - SwingUtilities.invokeLater(this::componentOpened); + SwingUtilities.invokeLater(() -> { + CoreComponentControl.openCoreWindows(); + componentOpened(); + }); } catch (IllegalStateException notUsed) { /** * Case is closed, do nothing. diff --git a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java index dde382e397..01e47342ae 100644 --- a/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java +++ b/Core/src/org/sleuthkit/autopsy/events/RemoteEventPublisher.java @@ -169,7 +169,9 @@ final class RemoteEventPublisher { if (object instanceof AutopsyEvent) { AutopsyEvent event = (AutopsyEvent) object; event.setSourceType(AutopsyEvent.SourceType.REMOTE); - localPublisher.publish(event); + new Thread(() -> { + localPublisher.publish(event); + }).start(); } } } catch (Exception ex) {