19 package org.sleuthkit.autopsy.datamodel;
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.sql.ResultSet;
24 import java.sql.SQLException;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.HashSet;
28 import java.util.LinkedHashMap;
29 import java.util.List;
31 import java.util.Observable;
32 import java.util.Observer;
34 import java.util.logging.Level;
35 import org.openide.nodes.ChildFactory;
36 import org.openide.nodes.Children;
37 import org.openide.nodes.Node;
38 import org.openide.nodes.Sheet;
39 import org.openide.util.NbBundle;
40 import org.openide.util.lookup.Lookups;
49 import org.
sleuthkit.datamodel.SleuthkitCase.CaseDbQuery;
61 public static final String
NAME = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getLabel();
63 .getMessage(
KeywordHits.class,
"KeywordHits.simpleLiteralSearch.text");
65 .getMessage(
KeywordHits.class,
"KeywordHits.singleRegexSearch.text");
77 private final Map<String, Map<String, Set<Long>>>
topLevelMap =
new LinkedHashMap<>();
83 List<String> getListNames() {
85 List<String> names =
new ArrayList<>(topLevelMap.keySet());
93 List<String> getKeywords(String listName) {
94 List<String> keywords;
96 keywords =
new ArrayList<>(topLevelMap.get(listName).keySet());
98 Collections.sort(keywords);
102 Set<Long> getArtifactIds(String listName, String keyword) {
104 return topLevelMap.get(listName).get(keyword);
109 void populateMaps(Map<Long, Map<Long, String>> artifactIds) {
114 Map<String, Map<String, Set<Long>>> listsMap =
new LinkedHashMap<>();
117 Map<String, Set<Long>> literalMap =
new LinkedHashMap<>();
120 Map<String, Set<Long>> regexMap =
new LinkedHashMap<>();
123 topLevelMap.put(SIMPLE_LITERAL_SEARCH, literalMap);
124 topLevelMap.put(SIMPLE_REGEX_SEARCH, regexMap);
126 for (Map.Entry<Long, Map<Long, String>> art : artifactIds.entrySet()) {
127 long id = art.getKey();
128 Map<Long, String> attributes = art.getValue();
131 String listName = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()));
132 String word = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID()));
133 String reg = attributes.get(Long.valueOf(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID()));
136 if (listName != null) {
137 if (listsMap.containsKey(listName) ==
false) {
138 listsMap.put(listName,
new LinkedHashMap<String, Set<Long>>());
141 Map<String, Set<Long>> listMap = listsMap.get(listName);
142 if (listMap.containsKey(word) ==
false) {
143 listMap.put(word,
new HashSet<Long>());
146 listMap.get(word).add(
id);
148 else if (reg != null) {
149 if (regexMap.containsKey(reg) ==
false) {
150 regexMap.put(reg,
new HashSet<Long>());
152 regexMap.get(reg).add(
id);
155 if (literalMap.containsKey(word) ==
false) {
156 literalMap.put(word,
new HashSet<Long>());
158 literalMap.get(word).add(
id);
160 topLevelMap.putAll(listsMap);
168 @SuppressWarnings(
"deprecation")
170 Map<Long, Map<Long, String>> artifactIds =
new LinkedHashMap<>();
172 if (skCase == null) {
176 int setId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
177 int wordId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID();
178 int regexId = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID();
179 int artId = BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID();
180 String query =
"SELECT blackboard_attributes.value_text,blackboard_attributes.artifact_id,"
181 +
"blackboard_attributes.attribute_type_id FROM blackboard_attributes,blackboard_artifacts WHERE "
182 +
"(blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id AND "
183 +
"blackboard_artifacts.artifact_type_id=" + artId
184 +
") AND (attribute_type_id=" + setId +
" OR "
185 +
"attribute_type_id=" + wordId +
" OR "
186 +
"attribute_type_id=" + regexId +
")";
188 try (CaseDbQuery dbQuery = skCase.executeQuery(query)) {
189 ResultSet resultSet = dbQuery.getResultSet();
190 while (resultSet.next()) {
191 String value = resultSet.getString(
"value_text");
192 long artifactId = resultSet.getLong(
"artifact_id");
193 long typeId = resultSet.getLong(
"attribute_type_id");
194 if (!artifactIds.containsKey(artifactId)) {
195 artifactIds.put(artifactId,
new LinkedHashMap<Long, String>());
197 if (!value.equals(
"")) {
198 artifactIds.get(artifactId).put(typeId, value);
201 }
catch (TskCoreException | SQLException ex) {
202 logger.log(Level.WARNING,
"SQL Exception occurred: ", ex);
205 populateMaps(artifactIds);
211 return v.
visit(
this);
218 super(Children.create(
new ListFactory(),
true), Lookups.singleton(KEYWORD_HITS));
220 super.setDisplayName(KEYWORD_HITS);
221 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/keyword_hits.png");
231 return v.
visit(
this);
236 Sheet s = super.createSheet();
237 Sheet.Set ss = s.get(Sheet.PROPERTIES);
239 ss = Sheet.createPropertiesSet();
243 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.name.name"),
244 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.name.displayName"),
245 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.name.desc"),
262 private class ListFactory extends ChildFactory.Detachable<String> implements Observer {
264 private final PropertyChangeListener
pcl =
new PropertyChangeListener() {
266 public void propertyChange(PropertyChangeEvent evt) {
267 String eventType = evt.getPropertyName();
284 if (null != eventData && eventData.
getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
287 }
catch (IllegalStateException notUsed) {
303 }
catch (IllegalStateException notUsed) {
310 if (evt.getNewValue() == null) {
324 keywordResults.addObserver(
this);
332 keywordResults.deleteObserver(
this);
337 list.addAll(keywordResults.getListNames());
347 public void update(Observable o, Object arg) {
357 super(Children.create(
new TermFactory(listName),
true), Lookups.singleton(listName));
358 super.setName(listName);
359 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/keyword_hits.png");
362 keywordResults.addObserver(
this);
366 int totalDescendants = 0;
367 for (String word : keywordResults.getKeywords(listName)) {
368 Set<Long> ids = keywordResults.getArtifactIds(listName, word);
369 totalDescendants += ids.size();
371 super.setDisplayName(listName +
" (" + totalDescendants +
")");
376 Sheet s = super.createSheet();
377 Sheet.Set ss = s.get(Sheet.PROPERTIES);
379 ss = Sheet.createPropertiesSet();
383 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.name"),
384 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.displayName"),
385 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.desc"),
388 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.numChildren.name"),
389 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.numChildren.displayName"),
390 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.numChildren.desc"),
391 keywordResults.getKeywords(listName).size()));
403 return v.
visit(
this);
407 public void update(Observable o, Object arg) {
422 private class TermFactory extends ChildFactory.Detachable<String> implements Observer {
433 keywordResults.addObserver(
this);
438 keywordResults.deleteObserver(
this);
443 list.addAll(keywordResults.getKeywords(setName));
453 public void update(Observable o, Object arg) {
464 super(Children.create(
new HitsFactory(setName, keyword),
true), Lookups.singleton(keyword));
465 super.setName(keyword);
468 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/keyword_hits.png");
470 keywordResults.addObserver(
this);
474 super.setDisplayName(keyword +
" (" + keywordResults.getArtifactIds(setName, keyword).size() +
")");
478 public void update(Observable o, Object arg) {
489 return v.
visit(
this);
494 Sheet s = super.createSheet();
495 Sheet.Set ss = s.get(Sheet.PROPERTIES);
497 ss = Sheet.createPropertiesSet();
501 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.name"),
502 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.displayName"),
503 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.listName.desc"),
506 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.filesWithHits.name"),
507 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.filesWithHits.displayName"),
508 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createSheet.filesWithHits.desc"),
509 keywordResults.getArtifactIds(setName, keyword).size()));
525 public class HitsFactory extends ChildFactory.Detachable<Long> implements Observer {
538 keywordResults.addObserver(
this);
543 keywordResults.deleteObserver(
this);
548 list.addAll(keywordResults.getArtifactIds(setName, keyword));
554 if (skCase == null) {
559 BlackboardArtifact art = skCase.getBlackboardArtifact(artifactId);
563 file = skCase.getAbstractFileById(art.getObjectID());
564 }
catch (TskCoreException ex) {
565 logger.log(Level.SEVERE,
"TskCoreException while constructing BlackboardArtifact Node from KeywordHitsKeywordChildren");
577 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createNodeForKey.modTime.name"),
578 NbBundle.getMessage(
this.getClass(),
579 "KeywordHits.createNodeForKey.modTime.displayName"),
580 NbBundle.getMessage(
this.getClass(),
581 "KeywordHits.createNodeForKey.modTime.desc"),
584 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createNodeForKey.accessTime.name"),
585 NbBundle.getMessage(
this.getClass(),
586 "KeywordHits.createNodeForKey.accessTime.displayName"),
587 NbBundle.getMessage(
this.getClass(),
588 "KeywordHits.createNodeForKey.accessTime.desc"),
591 NbBundle.getMessage(
this.getClass(),
"KeywordHits.createNodeForKey.chgTime.name"),
592 NbBundle.getMessage(
this.getClass(),
593 "KeywordHits.createNodeForKey.chgTime.displayName"),
594 NbBundle.getMessage(
this.getClass(),
595 "KeywordHits.createNodeForKey.chgTime.desc"),
598 }
catch (TskException ex) {
599 logger.log(Level.WARNING,
"TSK Exception occurred", ex);
605 public void update(Observable o, Object arg) {
final PropertyChangeListener pcl
KeywordHits(SleuthkitCase skCase)
static final String KEYWORD_HITS
BlackboardArtifact.Type getBlackboardArtifactType()
void removeIngestModuleEventListener(final PropertyChangeListener listener)
void update(Observable o, Object arg)
static String getStringTime(long epochSeconds, TimeZone tzone)
Node createNodeForKey(String key)
static synchronized IngestManager getInstance()
void update(Observable o, Object arg)
final KeywordResults keywordResults
void update(Observable o, Object arg)
static void removePropertyChangeListener(PropertyChangeListener listener)
static final String SIMPLE_REGEX_SEARCH
TermFactory(String setName)
T visit(DataSourcesNode in)
final Map< String, Map< String, Set< Long > > > topLevelMap
boolean createKeys(List< String > list)
void removeIngestJobEventListener(final PropertyChangeListener listener)
TermNode(String setName, String keyword)
boolean createKeys(List< String > list)
void update(Observable o, Object arg)
void addIngestJobEventListener(final PropertyChangeListener listener)
Node createNodeForKey(Long artifactId)
Node createNodeForKey(String key)
ListNode(String listName)
boolean createKeys(List< Long > list)
static void addPropertyChangeListener(PropertyChangeListener listener)
static final Logger logger
void addIngestModuleEventListener(final PropertyChangeListener listener)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
void addNodeProperty(NodeProperty<?> np)
static final String SIMPLE_LITERAL_SEARCH
void update(Observable o, Object arg)
HitsFactory(String setName, String keyword)