19 package org.sleuthkit.autopsy.contentviewers.analysisresults;
21 import java.util.Collection;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.Objects;
25 import java.util.Optional;
26 import java.util.logging.Level;
27 import java.util.logging.Logger;
28 import java.util.stream.Collectors;
29 import java.util.stream.Stream;
30 import org.apache.commons.lang3.tuple.Pair;
31 import org.openide.nodes.Node;
32 import org.openide.util.NbBundle;
51 static class ResultDisplayAttributes {
54 private final List<Pair<String, String>> attributesToDisplay;
64 ResultDisplayAttributes(
AnalysisResult analysisResult, List<Pair<String, String>> attributesToDisplay) {
65 this.analysisResult = analysisResult;
66 this.attributesToDisplay = attributesToDisplay;
74 List<Pair<String, String>> getAttributesToDisplay() {
75 return Collections.unmodifiableList(attributesToDisplay);
84 return analysisResult;
92 static class NodeResults {
94 private final List<ResultDisplayAttributes> analysisResults;
95 private final Optional<AnalysisResult> selectedResult;
96 private final Optional<Score> aggregateScore;
97 private final Optional<String> itemName;
110 NodeResults(List<ResultDisplayAttributes> analysisResults, Optional<AnalysisResult> selectedResult,
111 Optional<Score> aggregateScore, Optional<String> itemName) {
112 this.analysisResults = analysisResults;
113 this.selectedResult = selectedResult;
114 this.aggregateScore = aggregateScore;
115 this.itemName = itemName;
123 List<ResultDisplayAttributes> getAnalysisResults() {
124 return Collections.unmodifiableList(analysisResults);
132 Optional<AnalysisResult> getSelectedResult() {
133 return selectedResult;
141 Optional<Score> getAggregateScore() {
142 return aggregateScore;
150 Optional<String> getItemName() {
164 return (originalAttrStr == null) ?
"" : originalAttrStr.trim();
175 "AnalysisResultsViewModel_displayAttributes_score=Score",
176 "AnalysisResultsViewModel_displayAttributes_type=Type",
177 "AnalysisResultsViewModel_displayAttributes_configuration=Configuration",
178 "AnalysisResultsViewModel_displayAttributes_conclusion=Conclusion",
179 "AnalysisResultsViewModel_displayAttributes_justification=Justification"
187 logger.log(Level.SEVERE,
"Unable to get type for analysis result with id: " + analysisResult.
getArtifactID(), ex);
191 Stream<Pair<String, String>> baseAnalysisAttrs = Stream.of(
192 Pair.of(Bundle.AnalysisResultsViewModel_displayAttributes_score(),
194 Pair.of(Bundle.AnalysisResultsViewModel_displayAttributes_type(),
196 Pair.of(Bundle.AnalysisResultsViewModel_displayAttributes_configuration(),
198 Pair.of(Bundle.AnalysisResultsViewModel_displayAttributes_conclusion(),
200 Pair.of(Bundle.AnalysisResultsViewModel_displayAttributes_justification(),
205 Stream<Pair<String, String>> blackboardAttributes = Stream.empty();
208 blackboardAttributes = analysisResult.
getAttributes().stream()
209 .filter(attr -> attr != null && attr.getAttributeType() != null && attr.getAttributeType().getDisplayName() != null)
210 .map(attr -> Pair.of(attr.getAttributeType().getDisplayName(),
normalizeAttr(attr.getDisplayString())))
211 .sorted((a, b) -> a.getKey().compareToIgnoreCase(b.getKey()));
213 logger.log(Level.SEVERE,
"Unable to get attributes for analysis result with id: " + analysisResult.
getArtifactID(), ex);
217 List<Pair<String, String>> allDisplayAttributes = Stream.concat(baseAnalysisAttrs, blackboardAttributes)
218 .collect(Collectors.toList());
220 return new ResultDisplayAttributes(analysisResult, allDisplayAttributes);
224 return analysisResults.stream()
225 .filter(ar -> ar != null && ar.getScore() != null)
227 .sorted((a, b) -> -a.getScore().compareTo(b.getScore()))
229 .collect(Collectors.toList());
242 if (selectedContent == null) {
245 return ((BlackboardArtifact) selectedContent).getShortDescription();
247 return selectedContent.getName();
259 NodeResults getAnalysisResults(Node node) {
261 return new NodeResults(Collections.emptyList(), Optional.empty(), Optional.empty(), Optional.empty());
264 String contentName = null;
265 AnalysisResult selectedAnalysisResult = null;
266 Score aggregateScore = null;
267 List<AnalysisResult> analysisResults = Collections.emptyList();
268 long selectedObjectId = 0;
270 AnalysisResultItem analysisResultItem = node.getLookup().lookup(AnalysisResultItem.class);
272 if (Objects.nonNull(analysisResultItem)) {
279 selectedAnalysisResult = analysisResultItem.getTskContent();
280 selectedObjectId = selectedAnalysisResult.
getId();
281 analyzedContent = selectedAnalysisResult.
getParent();
288 TskContentItem<?> contentItem = node.getLookup().lookup(TskContentItem.class);
289 analyzedContent = contentItem.getTskContent();
290 selectedObjectId = analyzedContent.
getId();
294 contentName =
getName(analyzedContent);
296 }
catch (TskCoreException ex) {
297 logger.log(Level.SEVERE, String.format(
"Error getting analysis result data for selected Content (object ID=%d)", selectedObjectId), ex);
304 return new NodeResults(displayAttributes,
305 Optional.ofNullable(selectedAnalysisResult),
306 Optional.ofNullable(aggregateScore),
307 Optional.ofNullable(contentName));
Significance getSignificance()
String normalizeAttr(String originalAttrStr)
String getName(Content selectedContent)
Score getAggregateScore()
ResultDisplayAttributes getDisplayAttributes(AnalysisResult analysisResult)
BlackboardArtifact.Type getType()
String getConfiguration()
List< AnalysisResult > getAllAnalysisResults()
String getJustification()
List< ResultDisplayAttributes > getOrderedDisplayAttributes(Collection< AnalysisResult > analysisResults)
static final Logger logger
List< BlackboardAttribute > getAttributes()