diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java index b086c1e66a..f0ba02e832 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/HighlightedText.java @@ -60,6 +60,7 @@ class HighlightedText implements IndexedText { private static final BlackboardAttribute.Type TSK_KEYWORD_HIT_DOCUMENT_IDS = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_HIT_DOCUMENT_IDS); private static final BlackboardAttribute.Type TSK_KEYWORD_SEARCH_TYPE = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE); private static final BlackboardAttribute.Type TSK_KEYWORD = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD); + static private final BlackboardAttribute.Type TSK_ASSOCIATED_ARTIFACT = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT); private static final String HIGHLIGHT_PRE = ""; //NON-NLS private static final String HIGHLIGHT_POST = ""; //NON-NLS @@ -74,24 +75,24 @@ class HighlightedText implements IndexedText { private final Set keywords = new HashSet<>(); private int numberPages; - private Integer currentPage =0; + private Integer currentPage = 0; @GuardedBy("this") private boolean isPageInfoLoaded = false; - /* + /* * map from page/chunk to number of hits. value is 0 if not yet known. */ private final TreeMap numberOfHitsPerPage = new TreeMap<>(); /* - * set of pages, used for iterating back and forth. Only stores pages with hits + * set of pages, used for iterating back and forth. Only stores pages with + * hits */ private final Set pages = numberOfHitsPerPage.keySet(); /* * map from page/chunk number to current hit on that page. */ private final HashMap currentHitPerPage = new HashMap<>(); - private QueryResults hits = null; //original hits that may get passed in private BlackboardArtifact artifact; @@ -122,9 +123,14 @@ class HighlightedText implements IndexedText { * * @param artifact The artifact that was selected. */ - HighlightedText(BlackboardArtifact artifact) { + HighlightedText(BlackboardArtifact artifact) throws TskCoreException { this.artifact = artifact; - this.objectId = artifact.getObjectID(); + BlackboardAttribute attribute = artifact.getAttribute(TSK_ASSOCIATED_ARTIFACT); + if (attribute != null) { + this.objectId = attribute.getValueLong(); + } else { + this.objectId = artifact.getObjectID(); + } } @@ -183,7 +189,6 @@ class HighlightedText implements IndexedText { int chunkID = (-1 == separatorIndex) ? 0 : Integer.parseInt(solrDocumentId.substring(separatorIndex + 1)); - pages.add(chunkID); numberOfHitsPerPage.put(chunkID, 0); currentHitPerPage.put(chunkID, 0); } @@ -210,12 +215,12 @@ class HighlightedText implements IndexedText { synchronized private void loadPageInfoFromHits() { isLiteral = hits.getQuery().isLiteral(); //organize the hits by page, filter as needed - TreeSet pagesSorted = new TreeSet<>(); for (Keyword k : hits.getKeywords()) { for (KeywordHit hit : hits.getResults(k)) { int chunkID = hit.getChunkId(); if (chunkID != 0 && this.objectId == hit.getSolrObjectId()) { - pagesSorted.add(chunkID); + numberOfHitsPerPage.put(chunkID, 0); //unknown number of matches in the page + currentHitPerPage.put(chunkID, 0); //set current hit to 0th if (StringUtils.isNotBlank(hit.getHit())) { this.keywords.add(hit.getHit()); } @@ -224,13 +229,8 @@ class HighlightedText implements IndexedText { } //set page to first page having highlights - this.currentPage = pagesSorted.stream().findFirst().orElse(1); + this.currentPage = pages.stream().findFirst().orElse(1); - for (Integer page : pagesSorted) { - numberOfHitsPerPage.put(page, 0); //unknown number of matches in the page - pages.add(page); - currentHitPerPage.put(page, 0); //set current hit to 0th - } isPageInfoLoaded = true; } @@ -245,7 +245,8 @@ class HighlightedText implements IndexedText { static private String constructEscapedSolrQuery(String query) { return LuceneQuery.HIGHLIGHT_FIELD + ":" + "\"" + KeywordSearchUtil.escapeLuceneQuery(query) + "\""; } - private int getIndexOfCurrentPage() { + + private int getIndexOfCurrentPage() { return Iterators.indexOf(pages.iterator(), this.currentPage::equals); } @@ -260,7 +261,7 @@ class HighlightedText implements IndexedText { return this.currentPage; } - @Override + @Override public boolean hasNextPage() { return getIndexOfCurrentPage() < pages.size() - 1;