mirror of
https://github.com/elisspace/autopsy.git
synced 2026-09-04 06:50:00 +00:00
Merge pull request #2405 from zhhl/2050-NPEinRegexSearch
2050 handle the KeywordSearchException while call KeywordSearchQuery:performQuery()
This commit is contained in:
@@ -31,6 +31,8 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.apache.solr.client.solrj.SolrQuery;
|
||||
import org.apache.solr.client.solrj.SolrRequest.METHOD;
|
||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.Version;
|
||||
import org.sleuthkit.autopsy.datamodel.TextMarkupLookup;
|
||||
import org.sleuthkit.autopsy.keywordsearch.KeywordQueryFilter.FilterType;
|
||||
@@ -100,6 +102,7 @@ class HighlightedText implements IndexedText, TextMarkupLookup {
|
||||
* The main goal of this method is to figure out which pages / chunks have
|
||||
* hits.
|
||||
*/
|
||||
@Messages({"HighlightedText.query.exception.msg=Could not perform the query to get chunk info and get highlights:"})
|
||||
private void loadPageInfo() {
|
||||
if (isPageInfoLoaded) {
|
||||
return;
|
||||
@@ -143,8 +146,9 @@ class HighlightedText implements IndexedText, TextMarkupLookup {
|
||||
chunksQuery.addFilter(new KeywordQueryFilter(FilterType.CHUNK, this.objectId));
|
||||
try {
|
||||
hits = chunksQuery.performQuery();
|
||||
} catch (NoOpenCoreException ex) {
|
||||
logger.log(Level.INFO, "Could not get chunk info and get highlights", ex); //NON-NLS
|
||||
} catch (KeywordSearchModuleException | NoOpenCoreException ex) {
|
||||
logger.log(Level.SEVERE, "Could not perform the query to get chunk info and get highlights:" + keywordQuery.getSearchTerm(), ex); //NON-NLS
|
||||
MessageNotifyUtil.Notify.error(Bundle.HighlightedText_query_exception_msg() + keywordQuery.getSearchTerm(), ex.getCause().getMessage());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,11 +36,12 @@ interface KeywordSearchQuery {
|
||||
* execute query and return results without publishing them return results
|
||||
* for all matching terms
|
||||
*
|
||||
* @throws KeywordSearchModuleException error while executing Solr term query
|
||||
* @throws NoOpenCoreException if query failed due to server error, this
|
||||
* could be a notification to stop processing
|
||||
* @return
|
||||
*/
|
||||
QueryResults performQuery() throws NoOpenCoreException;
|
||||
QueryResults performQuery() throws KeywordSearchModuleException, NoOpenCoreException;
|
||||
|
||||
/**
|
||||
* Set an optional filter to narrow down the search Adding multiple filters
|
||||
|
||||
@@ -38,6 +38,7 @@ import org.openide.util.NbBundle;
|
||||
import org.openide.util.lookup.Lookups;
|
||||
import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode;
|
||||
import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode;
|
||||
import org.sleuthkit.autopsy.datamodel.KeyValue;
|
||||
@@ -142,6 +143,7 @@ class KeywordSearchResultFactory extends ChildFactory<KeyValueQueryContent> {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@NbBundle.Messages({"KeywordSearchResultFactory.query.exception.msg=Could not perform the query "})
|
||||
private boolean createFlatKeys(QueryRequest queryRequest, List<KeyValueQueryContent> toPopulate) {
|
||||
/**
|
||||
* Check the validity of the requested query.
|
||||
@@ -158,10 +160,11 @@ class KeywordSearchResultFactory extends ChildFactory<KeyValueQueryContent> {
|
||||
QueryResults queryResults;
|
||||
try {
|
||||
queryResults = keywordSearchQuery.performQuery();
|
||||
} catch (NoOpenCoreException ex) {
|
||||
} catch (KeywordSearchModuleException | NoOpenCoreException ex) {
|
||||
logger.log(Level.SEVERE, "Could not perform the query " + keywordSearchQuery.getQueryString(), ex); //NON-NLS
|
||||
MessageNotifyUtil.Notify.error(Bundle.KeywordSearchResultFactory_query_exception_msg() + keywordSearchQuery.getQueryString(), ex.getCause().getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
List<KeyValueQueryContent> tempList = new ArrayList<>();
|
||||
|
||||
@@ -32,11 +32,9 @@ import org.apache.solr.client.solrj.SolrRequest.METHOD;
|
||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||
import org.apache.solr.common.SolrDocument;
|
||||
import org.apache.solr.common.SolrDocumentList;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.coreutils.EscapeUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.Version;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
@@ -128,7 +126,7 @@ class LuceneQuery implements KeywordSearchQuery {
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryResults performQuery() throws NoOpenCoreException {
|
||||
public QueryResults performQuery() throws KeywordSearchModuleException, NoOpenCoreException {
|
||||
QueryResults results = new QueryResults(this, keywordList);
|
||||
//in case of single term literal query there is only 1 term
|
||||
boolean showSnippets = KeywordSearchSettings.getShowSnippets();
|
||||
@@ -199,7 +197,7 @@ class LuceneQuery implements KeywordSearchQuery {
|
||||
*
|
||||
* @throws NoOpenCoreException
|
||||
*/
|
||||
private List<KeywordHit> performLuceneQuery(boolean snippets) throws NoOpenCoreException {
|
||||
private List<KeywordHit> performLuceneQuery(boolean snippets) throws KeywordSearchModuleException, NoOpenCoreException {
|
||||
List<KeywordHit> matches = new ArrayList<>();
|
||||
boolean allMatchesFetched = false;
|
||||
final Server solrServer = KeywordSearch.getServer();
|
||||
@@ -210,21 +208,15 @@ class LuceneQuery implements KeywordSearchQuery {
|
||||
Map<String, Map<String, List<String>>> highlightResponse;
|
||||
Set<SolrDocument> uniqueSolrDocumentsWithHits;
|
||||
|
||||
try {
|
||||
response = solrServer.query(q, METHOD.POST);
|
||||
response = solrServer.query(q, METHOD.POST);
|
||||
|
||||
resultList = response.getResults();
|
||||
resultList = response.getResults();
|
||||
|
||||
// objectId_chunk -> "text" -> List of previews
|
||||
highlightResponse = response.getHighlighting();
|
||||
// objectId_chunk -> "text" -> List of previews
|
||||
highlightResponse = response.getHighlighting();
|
||||
|
||||
// get the unique set of files with hits
|
||||
uniqueSolrDocumentsWithHits = filterOneHitPerDocument(resultList);
|
||||
} catch (KeywordSearchModuleException ex) {
|
||||
logger.log(Level.SEVERE, "Error executing Lucene Solr Query: " + keywordString, ex); //NON-NLS
|
||||
MessageNotifyUtil.Notify.error(NbBundle.getMessage(Server.class, "Server.query.exception.msg", keywordString), ex.getCause().getMessage());
|
||||
return matches;
|
||||
}
|
||||
// get the unique set of files with hits
|
||||
uniqueSolrDocumentsWithHits = filterOneHitPerDocument(resultList);
|
||||
|
||||
// cycle through results in sets of MAX_RESULTS
|
||||
for (int start = 0; !allMatchesFetched; start = start + MAX_RESULTS) {
|
||||
|
||||
@@ -37,7 +37,9 @@ import org.netbeans.api.progress.aggregate.AggregateProgressHandle;
|
||||
import org.netbeans.api.progress.aggregate.ProgressContributor;
|
||||
import org.openide.util.Cancellable;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.StopWatch;
|
||||
import org.sleuthkit.autopsy.ingest.IngestMessage;
|
||||
import org.sleuthkit.autopsy.ingest.IngestServices;
|
||||
@@ -383,6 +385,7 @@ public final class SearchRunner {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Messages("SearchRunner.query.exception.msg=Error performing query:")
|
||||
protected Object doInBackground() throws Exception {
|
||||
final String displayName = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.displayName")
|
||||
+ (finalRun ? (" - " + NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.finalizeMsg")) : "");
|
||||
@@ -453,8 +456,9 @@ public final class SearchRunner {
|
||||
// Do the actual search
|
||||
try {
|
||||
queryResults = keywordSearchQuery.performQuery();
|
||||
} catch (NoOpenCoreException ex) {
|
||||
logger.log(Level.WARNING, "Error performing query: " + keywordQuery.getSearchTerm(), ex); //NON-NLS
|
||||
} catch (KeywordSearchModuleException | NoOpenCoreException ex) {
|
||||
logger.log(Level.SEVERE, "Error performing query: " + keywordQuery.getSearchTerm(), ex); //NON-NLS
|
||||
MessageNotifyUtil.Notify.error(Bundle.SearchRunner_query_exception_msg() + keywordQuery.getSearchTerm(), ex.getCause().getMessage());
|
||||
//no reason to continue with next query if recovery failed
|
||||
//or wait for recovery to kick in and run again later
|
||||
//likely case has closed and threads are being interrupted
|
||||
@@ -462,9 +466,6 @@ public final class SearchRunner {
|
||||
} catch (CancellationException e) {
|
||||
logger.log(Level.INFO, "Cancel detected, bailing during keyword query: {0}", keywordQuery.getSearchTerm()); //NON-NLS
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
logger.log(Level.WARNING, "Error performing query: " + keywordQuery.getSearchTerm(), e); //NON-NLS
|
||||
continue;
|
||||
}
|
||||
|
||||
// calculate new results by substracting results already obtained in this ingest
|
||||
|
||||
@@ -261,10 +261,8 @@ final class TermsComponentQuery implements KeywordSearchQuery {
|
||||
*
|
||||
* @throws NoOpenCoreException
|
||||
*/
|
||||
// TODO: Make it so this cannot cause NPEs; this method should throw
|
||||
// exceptions instead of logging them and returning null.
|
||||
@Override
|
||||
public QueryResults performQuery() throws NoOpenCoreException {
|
||||
public QueryResults performQuery() throws KeywordSearchModuleException, NoOpenCoreException {
|
||||
/*
|
||||
* Do a query using the Solr terms component to find any terms in the
|
||||
* index that match the regex.
|
||||
@@ -278,14 +276,7 @@ final class TermsComponentQuery implements KeywordSearchQuery {
|
||||
termsQuery.setTimeAllowed(TERMS_SEARCH_TIMEOUT);
|
||||
termsQuery.setShowDebugInfo(DEBUG_FLAG);
|
||||
termsQuery.setTermsLimit(MAX_TERMS_QUERY_RESULTS);
|
||||
List<Term> terms = null;
|
||||
try {
|
||||
terms = KeywordSearch.getServer().queryTerms(termsQuery).getTerms(SEARCH_FIELD);
|
||||
} catch (KeywordSearchModuleException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error executing the regex terms query: " + keyword.getSearchTerm(), ex); //NON-NLS
|
||||
//TODO: this is almost certainly wrong and guaranteed to throw a NPE at some point!!!!
|
||||
}
|
||||
|
||||
List<Term> terms = KeywordSearch.getServer().queryTerms(termsQuery).getTerms(SEARCH_FIELD);
|
||||
/*
|
||||
* Do a term query for each term that matched the regex.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user