From c6ce9575cfa05a238ad79f463bb48f20d77c2261 Mon Sep 17 00:00:00 2001 From: adam-m Date: Wed, 15 Feb 2012 12:33:18 -0500 Subject: [PATCH] keyword search: when done from GUI, use background thread to write results to BB not to block the GUI thread for huge queries --- .../KeywordSearchResultFactory.java | 24 +++++++++++++------ .../autopsy/keywordsearch/LuceneQuery.java | 21 +++++++++------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java index 481cc9ec60..3f8652cde8 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchResultFactory.java @@ -247,8 +247,10 @@ public class KeywordSearchResultFactory extends ChildFactory { int resID = 0; - Collection na = new ArrayList(); - for (FsContent f : fsContents) { + final Collection na = new ArrayList(); + final int numFsContents = fsContents.size(); + int cur = 0; + for (final FsContent f : fsContents) { //get unique match result files Map resMap = new LinkedHashMap(); AbstractFsContentNode.fillPropertyMap(resMap, f); @@ -258,12 +260,20 @@ public class KeywordSearchResultFactory extends ChildFactory { setCommonProperty(resMap, CommonPropertyTypes.CONTEXT, snippet); } toPopulate.add(new KeyValueContent(f.getName(), resMap, ++resID, f, highlightQueryEscaped)); - + //write to bb - na.addAll(tcq.writeToBlackBoard(f)); - } - //notify bb viewers - IngestManager.fireServiceDataEvent(new ServiceDataEvent(KeywordSearchIngestService.MODULE_NAME, ARTIFACT_TYPE.TSK_KEYWORD_HIT, na)); + final boolean sendDataEvent = (cur == numFsContents-1?true:false); + new Thread() { + @Override + public void run() { + na.addAll(tcq.writeToBlackBoard(f)); + if (sendDataEvent == true) { + IngestManager.fireServiceDataEvent(new ServiceDataEvent(KeywordSearchIngestService.MODULE_NAME, ARTIFACT_TYPE.TSK_KEYWORD_HIT, na)); + } + } + }.start(); + cur++; + } return true; } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index 416e25e432..f01ac05fea 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -153,7 +153,7 @@ public class LuceneQuery implements KeywordSearchQuery { @Override public void execute() { escape(); - List matches = performQuery(); + final List matches = performQuery(); String pathText = "Keyword query: " + query; @@ -162,14 +162,19 @@ public class LuceneQuery implements KeywordSearchQuery { TopComponent searchResultWin = DataResultTopComponent.createInstance("Keyword search", pathText, filteredRootNode, matches.size()); searchResultWin.requestActive(); // make it the active top component - + //write to bb - Collection na = new ArrayList(); - for (FsContent newHit : matches) { - na.addAll(writeToBlackBoard(newHit)); - } - //notify bb viewers - IngestManager.fireServiceDataEvent(new ServiceDataEvent(KeywordSearchIngestService.MODULE_NAME, ARTIFACT_TYPE.TSK_KEYWORD_HIT, na)); + new Thread() { + @Override + public void run() { + Collection na = new ArrayList(); + for (FsContent newHit : matches) { + na.addAll(writeToBlackBoard(newHit)); + } + //notify bb viewers + IngestManager.fireServiceDataEvent(new ServiceDataEvent(KeywordSearchIngestService.MODULE_NAME, ARTIFACT_TYPE.TSK_KEYWORD_HIT, na)); + } + }.start(); } @Override