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.HashMap;
28 import java.util.HashSet;
29 import java.util.LinkedHashMap;
30 import java.util.List;
32 import java.util.Observable;
33 import java.util.Observer;
35 import java.util.logging.Level;
36 import org.openide.nodes.ChildFactory;
37 import org.openide.nodes.Children;
38 import org.openide.nodes.Node;
39 import org.openide.nodes.Sheet;
40 import org.openide.util.NbBundle;
41 import org.openide.util.lookup.Lookups;
89 List<String> getSetNames() {
92 names =
new ArrayList<>(hashSetHitsMap.keySet());
94 Collections.sort(names);
98 Set<Long> getArtifactIds(String hashSetName) {
100 return hashSetHitsMap.get(hashSetName);
104 @SuppressWarnings(
"deprecation")
105 final
void update() {
107 hashSetHitsMap.clear();
110 if (skCase == null) {
114 int setNameId = ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID();
115 int artId = ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID();
116 String query =
"SELECT value_text,blackboard_attributes.artifact_id,attribute_type_id "
117 +
"FROM blackboard_attributes,blackboard_artifacts WHERE "
118 +
"attribute_type_id=" + setNameId
119 +
" AND blackboard_attributes.artifact_id=blackboard_artifacts.artifact_id"
120 +
" AND blackboard_artifacts.artifact_type_id=" + artId;
122 try (CaseDbQuery dbQuery = skCase.
executeQuery(query)) {
123 ResultSet resultSet = dbQuery.getResultSet();
125 while (resultSet.next()) {
126 String setName = resultSet.getString(
"value_text");
127 long artifactId = resultSet.getLong(
"artifact_id");
128 if (!hashSetHitsMap.containsKey(setName)) {
129 hashSetHitsMap.put(setName,
new HashSet<Long>());
131 hashSetHitsMap.get(setName).add(artifactId);
134 }
catch (TskCoreException | SQLException ex) {
135 logger.log(Level.WARNING,
"SQL Exception occurred: ", ex);
149 super(Children.create(
new HashsetNameFactory(),
true), Lookups.singleton(DISPLAY_NAME));
150 super.setName(HASHSET_HITS);
151 super.setDisplayName(DISPLAY_NAME);
152 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/hashset_hits.png");
162 return v.
visit(
this);
167 Sheet s = super.createSheet();
168 Sheet.Set ss = s.get(Sheet.PROPERTIES);
170 ss = Sheet.createPropertiesSet();
174 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.name"),
175 NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.displayName"),
176 NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.desc"),
184 return getClass().getName();
198 private final PropertyChangeListener
pcl =
new PropertyChangeListener() {
200 public void propertyChange(PropertyChangeEvent evt) {
201 String eventType = evt.getPropertyName();
218 hashsetResults.update();
220 }
catch (IllegalStateException notUsed) {
235 hashsetResults.update();
236 }
catch (IllegalStateException notUsed) {
243 if (evt.getNewValue() == null) {
256 hashsetResults.update();
257 hashsetResults.addObserver(
this);
265 hashsetResults.deleteObserver(
this);
270 list.addAll(hashsetResults.getSetNames());
280 public void update(Observable o, Object arg) {
293 super(Children.create(
new HitFactory(hashSetName),
true), Lookups.singleton(hashSetName));
294 super.setName(hashSetName);
297 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/hashset_hits.png");
298 hashsetResults.addObserver(
this);
305 super.setDisplayName(hashSetName +
" (" + hashsetResults.getArtifactIds(hashSetName).size() +
")");
315 Sheet s = super.createSheet();
316 Sheet.Set ss = s.get(Sheet.PROPERTIES);
318 ss = Sheet.createPropertiesSet();
322 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.name"),
323 NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.displayName"),
324 NbBundle.getMessage(
this.getClass(),
"HashsetHits.createSheet.name.desc"),
332 return v.
visit(
this);
336 public void update(Observable o, Object arg) {
346 return getClass().getName();
353 private class HitFactory extends ChildFactory.Detachable<Long> implements Observer {
365 hashsetResults.addObserver(
this);
370 hashsetResults.deleteObserver(
this);
376 if (skCase == null) {
380 hashsetResults.getArtifactIds(hashsetName).forEach((
id) -> {
384 artifactHits.put(
id, art);
387 logger.log(Level.SEVERE,
"TSK Exception occurred", ex);
400 public void update(Observable o, Object arg) {
BlackboardArtifact.Type getBlackboardArtifactType()
void removeIngestModuleEventListener(final PropertyChangeListener listener)
Map< Long, BlackboardArtifact > artifactHits
static synchronized IngestManager getInstance()
HashsetNameNode(String hashSetName)
static void removePropertyChangeListener(PropertyChangeListener listener)
static final String DISPLAY_NAME
HitFactory(String hashsetName)
boolean createKeys(List< String > list)
Node createNodeForKey(String key)
BlackboardArtifact getBlackboardArtifact(long artifactID)
static final String HASHSET_HITS
static final Logger logger
T visit(DataSourcesNode in)
void update(Observable o, Object arg)
HashsetHits(SleuthkitCase skCase)
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< Long > list)
void addIngestJobEventListener(final PropertyChangeListener listener)
final Map< String, Set< Long > > hashSetHitsMap
void update(Observable o, Object arg)
final PropertyChangeListener pcl
static void addPropertyChangeListener(PropertyChangeListener listener)
void addIngestModuleEventListener(final PropertyChangeListener listener)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
void update(Observable o, Object arg)
Node createNodeForKey(Long id)
final HashsetResults hashsetResults
CaseDbQuery executeQuery(String query)