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)