From c8508ecdf37494a7aaadf045213256157a59699c Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 3 Mar 2014 17:23:55 -0500 Subject: [PATCH 1/2] Added call to get() to retrieve keyword search errors in background thread --- .../keywordsearch/KeywordSearchIngestModule.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java index 7220d4d485..a4f0b78921 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchIngestModule.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; @@ -44,7 +45,6 @@ import org.netbeans.api.progress.aggregate.AggregateProgressFactory; import org.netbeans.api.progress.aggregate.AggregateProgressHandle; import org.netbeans.api.progress.aggregate.ProgressContributor; import org.openide.util.Cancellable; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -1183,6 +1183,18 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile { return null; } + + @Override + protected void done() { + // call get to see if there were any errors + try { + get(); + } + catch (InterruptedException | ExecutionException e) { + logger.log(Level.SEVERE, "Error performing keyword search: " + e.getMessage()); + services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, "Error performing keyword search", e.getMessage())); + } + } /** * Sync-up the updated keywords from the currently used lists in the XML From 8f0bf32fb813045c95fd06c3969815b895b39c11 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Tue, 4 Mar 2014 00:04:49 -0500 Subject: [PATCH 2/2] Ensured that all SwingWorkers all call get() to check for exceptions --- .../autopsy/casemodule/AddImageTask.java | 4 +-- .../DataResultViewerThumbnail.java | 16 ++++++++++- .../autopsy/corecomponents/GstVideoPanel.java | 15 ++++++++++ .../autopsy/directorytree/ExtractAction.java | 10 ++++--- .../directorytree/ExtractUnallocAction.java | 14 ++++++++-- .../autopsy/report/ReportGenerator.java | 28 +++++++++++++++++++ .../autopsy/hashdatabase/HashDbManager.java | 15 ++++++++++ .../hashdatabase/HashDbSearchThread.java | 3 +- .../keywordsearch/ExtractedContentPanel.java | 16 +++++++++-- .../KeywordSearchResultFactory.java | 12 ++++++++ 10 files changed, 118 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java index dc1a65b009..0057aa689f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java @@ -37,7 +37,7 @@ import org.sleuthkit.datamodel.TskDataException; import org.sleuthkit.datamodel.TskException; /* - * A background task (swingworker) that adds the given image to + * A background task that adds the given image to * database using the Sleuthkit JNI interface. * * It updates the given ProgressMonitor as it works through adding the image, @@ -74,7 +74,7 @@ import org.sleuthkit.datamodel.TskException; boolean noFatOrphans; /* - * A Swingworker that updates the progressMonitor with the name of the + * A thread that updates the progressMonitor with the name of the * directory currently being processed by the AddImageTask */ private class CurrentDirectoryFetcher implements Runnable { diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java index bdbe02a4f1..c1557e37dd 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java @@ -24,6 +24,7 @@ import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.JOptionPane; import org.sleuthkit.autopsy.coreutils.Logger; @@ -31,6 +32,8 @@ import javax.swing.ListSelectionModel; import javax.swing.SwingWorker; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; import org.openide.explorer.ExplorerManager; import org.openide.explorer.view.IconView; import org.openide.nodes.AbstractNode; @@ -40,6 +43,7 @@ import org.openide.nodes.NodeEvent; import org.openide.nodes.NodeListener; import org.openide.nodes.NodeMemberEvent; import org.openide.nodes.NodeReorderEvent; +import org.openide.util.Exceptions; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.datamodel.AbstractFile; @@ -421,7 +425,17 @@ import org.sleuthkit.datamodel.TskCoreException; protected void done() { progress.finish(); setCursor(null); - updateControls(); + updateControls(); + // see if any exceptions were thrown + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + NotifyDescriptor d = + new NotifyDescriptor.Message("Error making thumbnails: " + ex.getMessage(), + NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notify(d); + logger.log(Level.SEVERE, "Error making thumbnails: " + ex.getMessage()); + } } }.execute(); diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java index 8317221553..b28ba880f2 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/GstVideoPanel.java @@ -29,6 +29,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import javax.swing.BoxLayout; @@ -50,6 +51,8 @@ import org.gstreamer.elements.RGBDataSink; import org.gstreamer.swing.VideoComponent; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; import org.openide.util.Cancellable; import org.openide.util.lookup.ServiceProvider; import org.openide.util.lookup.ServiceProviders; @@ -659,6 +662,18 @@ public class GstVideoPanel extends MediaViewVideoPanel { return null; } + + + @Override + protected void done() { + // see if any exceptions were thrown + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.WARNING, "Error updating video progress: " + ex.getMessage()); + infoLabel.setText("Error updating video progress: " + ex.getMessage()); + } + } } //end class progress worker /* Thread that extracts and plays a file */ diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java index d645441fbc..7d6719c5fb 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractAction.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.AbstractAction; @@ -225,17 +226,18 @@ public final class ExtractAction extends AbstractAction { @Override protected void done() { + boolean msgDisplayed = false; try { super.get(); } - catch (CancellationException | InterruptedException ex) { - } catch (Exception ex) { logger.log(Level.SEVERE, "Fatal error during file extraction", ex); - } + MessageNotifyUtil.Message.info("Error extracting files: " + ex.getMessage()); + msgDisplayed = true; + } finally { progress.finish(); - if (!this.isCancelled()) { + if (!this.isCancelled() && !msgDisplayed) { MessageNotifyUtil.Message.info("File(s) extracted."); } } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java index 5469db6581..ae642a5a23 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExtractUnallocAction.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JFileChooser; @@ -37,6 +38,7 @@ import javax.swing.SwingWorker; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; +import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -294,9 +296,15 @@ import org.sleuthkit.datamodel.VolumeSystem; for (UnallocStruct u : lus) { lockedVols.remove(u.getFileName()); } - if (!canceled && !lus.isEmpty()) { - MessageNotifyUtil.Notify.info("Completed extraction of unallocated space.", "Files were extracted to " + lus.get(0).getFile().getParent()); - } + + try { + get(); + if (!canceled && !lus.isEmpty()) { + MessageNotifyUtil.Notify.info("Completed extraction of unallocated space.", "Files were extracted to " + lus.get(0).getFile().getParent()); + } + } catch (InterruptedException | ExecutionException ex) { + MessageNotifyUtil.Notify.error("Error Extracting", "Error extracting unallocated space: " + ex.getMessage()); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java index 4406cbda0d..d7cb217697 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java @@ -41,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.HashSet; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.JDialog; import javax.swing.JFrame; @@ -251,6 +252,15 @@ import org.sleuthkit.datamodel.TskException; return 0; } + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "failed to generate reports", ex); + } + } + } /** @@ -336,6 +346,15 @@ import org.sleuthkit.datamodel.TskException; return Collections.EMPTY_LIST; } } + + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "failed to generate reports", ex); + } + } } /** @@ -574,6 +593,15 @@ import org.sleuthkit.datamodel.TskException; } } + @Override + protected void done() { + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "failed to generate reports", ex); + } + } + /** * Generate the tables for the tagged artifacts */ diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java index 394b7461c3..172a37e0ae 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java @@ -40,6 +40,7 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.SwingWorker; @@ -47,6 +48,7 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FileUtils; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; +import org.openide.util.Exceptions; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; @@ -942,6 +944,9 @@ public class HashDbManager implements PropertyChangeListener { } } + /** + * Worker thread to make an index of a database + */ private class HashDbIndexer extends SwingWorker { private ProgressHandle progress = null; private HashDb hashDb = null; @@ -977,6 +982,16 @@ public class HashDbManager implements PropertyChangeListener { hashDb.indexing = false; progress.finish(); + // see if we got any errors + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "Error creating index", ex); + MessageNotifyUtil.Notify.show("Error creating index", + "Error creating index: " + ex.getMessage(), + MessageNotifyUtil.MessageType.ERROR); + } + try { hashDb.propertyChangeSupport.firePropertyChange(HashDb.Event.INDEXING_DONE.toString(), null, hashDb); } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbSearchThread.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbSearchThread.java index 10ce6bfae4..2add51a845 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbSearchThread.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbSearchThread.java @@ -32,13 +32,12 @@ import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.FsContent; class HashDbSearchThread extends SwingWorker { private Logger logger = Logger.getLogger(HashDbSearchThread.class.getName()); private ProgressHandle progress; private Map> map; - private ArrayList hashes = new ArrayList(); + private ArrayList hashes = new ArrayList<>(); private AbstractFile file; HashDbSearchThread(AbstractFile file) { diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index bbad85160f..1718e7cd31 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -26,6 +26,8 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; @@ -43,6 +45,7 @@ import javax.swing.text.html.HTMLEditorKit.HTMLFactory; import javax.swing.text.html.StyleSheet; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; +import org.openide.util.Exceptions; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.TextUtil; @@ -386,7 +389,7 @@ class ExtractedContentPanel extends javax.swing.JPanel { * @return currently available sources on the panel */ public List getSources() { - ArrayList sources = new ArrayList(); + ArrayList sources = new ArrayList<>(); for (int i = 0; i < sourceComboBox.getItemCount(); ++i) { sources.add((MarkupSource) sourceComboBox.getItemAt(i)); } @@ -695,6 +698,15 @@ class ExtractedContentPanel extends javax.swing.JPanel { protected void done() { //super.done(); progress.finish(); + + // see if there are any errors + try { + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "Error getting marked up text" ); + } + + if (markup != null) { setPanelText(markup, true); } else { @@ -703,8 +715,6 @@ class ExtractedContentPanel extends javax.swing.JPanel { updateControls(source); scrollToCurrentHit(source); - - } } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index dbd03d5f07..4682ad09d4 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; @@ -36,6 +37,7 @@ import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.util.Cancellable; +import org.openide.util.Exceptions; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; @@ -613,6 +615,16 @@ class KeywordSearchResultFactory extends ChildFactory { return null; } + + @Override + protected void done() { + try { + // test if any exceptions were thrown + get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "Error querying ", ex); + } + } private static synchronized void registerWriter(ResultWriter writer) { writers.add(writer);