Autopsy  4.10.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
Tags.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2018 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.datamodel;
20 
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.util.Collections;
24 import java.util.EnumSet;
25 import java.util.List;
26 import java.util.Objects;
27 import java.util.Observable;
28 import java.util.Observer;
29 import java.util.Set;
30 import java.util.logging.Level;
31 import org.openide.nodes.ChildFactory;
32 import org.openide.nodes.Children;
33 import org.openide.nodes.Node;
34 import org.openide.nodes.Sheet;
35 import org.openide.util.NbBundle;
36 import org.openide.util.lookup.Lookups;
44 import org.sleuthkit.datamodel.BlackboardArtifactTag;
45 import org.sleuthkit.datamodel.ContentTag;
46 import org.sleuthkit.datamodel.TagName;
47 import org.sleuthkit.datamodel.TskCoreException;
48 
54 public class Tags implements AutopsyVisitableItem {
55  // Creation of a RootNode object corresponding to a Tags object is done
56  // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren
57  // override of Children.Keys<T>.createNodes().
58 
59  private final TagResults tagResults = new TagResults();
60  private final static String DISPLAY_NAME = NbBundle.getMessage(RootNode.class, "TagsNode.displayName.text");
61  private static final String USER_NAME_PROPERTY = "user.name"; //NON-NLS
62  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
63 
64  private final long datasourceObjId;
65 
66  Tags() {
67  this(0);
68  }
69 
70  Tags(long dsObjId) {
71  this.datasourceObjId = dsObjId;
72  }
73 
79  public static String getTagsDisplayName() {
80  return DISPLAY_NAME;
81  }
82 
83  long filteringDataSourceObjId() {
84  return this.datasourceObjId;
85  }
86 
87  @Override
88  public <T> T accept(AutopsyItemVisitor<T> visitor) {
89  return visitor.visit(this);
90  }
91 
97  private class TagResults extends Observable {
98 
99  public void update() {
100  setChanged();
101  notifyObservers();
102  }
103  }
104 
111  public class RootNode extends DisplayableItemNode {
112 
113  public RootNode(long objId) {
114  super(Children.create(new TagNameNodeFactory(objId), true), Lookups.singleton(DISPLAY_NAME));
115  super.setName(DISPLAY_NAME);
116  super.setDisplayName(DISPLAY_NAME);
117  this.setIconBaseWithExtension(ICON_PATH);
118  }
119 
120  @Override
121  public boolean isLeafTypeNode() {
122  return false;
123  }
124 
125  @Override
126  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
127  return visitor.visit(this);
128  }
129 
130  @Override
131  protected Sheet createSheet() {
132  Sheet propertySheet = super.createSheet();
133  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
134  if (properties == null) {
135  properties = Sheet.createPropertiesSet();
136  propertySheet.put(properties);
137  }
138  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.name"),
139  NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), "", getName()));
140  return propertySheet;
141  }
142 
143  @Override
144  public String getItemType() {
145  return getClass().getName();
146  }
147 
151  public void refresh() {
152  tagResults.update();
153  }
154 
155  }
156 
157  private class TagNameNodeFactory extends ChildFactory.Detachable<TagName> implements Observer {
158 
159  private final long datasourceObjId;
160 
166 
167  private final PropertyChangeListener pcl = new PropertyChangeListener() {
168  @Override
169  public void propertyChange(PropertyChangeEvent evt) {
170  String eventType = evt.getPropertyName();
171  if (eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString())
172  || eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString())
173  || eventType.equals(Case.Events.CONTENT_TAG_ADDED.toString())
174  || eventType.equals(Case.Events.CONTENT_TAG_DELETED.toString())) {
181  try {
183  refresh(true);
184  tagResults.update();
185  } catch (NoCurrentCaseException notUsed) {
189  }
190  } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
191  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
198  try {
200  refresh(true);
201  tagResults.update();
202  } catch (NoCurrentCaseException notUsed) {
206  }
207  } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
208  // case was closed. Remove listeners so that this can be garbage collected
209  if (evt.getNewValue() == null) {
210  removeNotify();
211  }
212  }
213  }
214  };
215 
221  TagNameNodeFactory(long objId) {
222  this.datasourceObjId = objId;
223 
224  }
225 
226  @Override
227  protected void addNotify() {
231  tagResults.update();
232  tagResults.addObserver(this);
233  }
234 
235  @Override
236  protected void removeNotify() {
240  tagResults.deleteObserver(this);
241  }
242 
243  @Override
244  protected boolean createKeys(List<TagName> keys) {
245  try {
246  List<TagName> tagNamesInUse;
248  String userName = System.getProperty(USER_NAME_PROPERTY);
249  tagNamesInUse = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
252  } else {
253  tagNamesInUse = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
256  }
257  Collections.sort(tagNamesInUse);
258  keys.addAll(tagNamesInUse);
259  } catch (TskCoreException | NoCurrentCaseException ex) {
260  Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
261  }
262  return true;
263  }
264 
265  @Override
266  protected Node createNodeForKey(TagName key) {
267  return new TagNameNode(key);
268  }
269 
270  @Override
271  public void update(Observable o, Object arg) {
272  refresh(true);
273  }
274  }
275 
281  public class TagNameNode extends DisplayableItemNode implements Observer {
282 
283  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
284  private final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS
285  private final TagName tagName;
286 
287  public TagNameNode(TagName tagName) {
288  super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton(NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName())));
289  this.tagName = tagName;
290  setName(tagName.getDisplayName());
292  if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) {
293  setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH);
294  } else {
295  setIconBaseWithExtension(ICON_PATH);
296  }
297  tagResults.addObserver(this);
298  }
299 
300  private void updateDisplayName() {
301  long tagsCount = 0;
302  try {
305  String userName = System.getProperty(USER_NAME_PROPERTY);
306  if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) {
307  tagsCount = tm.getContentTagsCountByTagNameForUser(tagName, datasourceObjId, userName);
308  tagsCount += tm.getBlackboardArtifactTagsCountByTagNameForUser(tagName, datasourceObjId, userName);
309  } else {
310  tagsCount = tm.getContentTagsCountByTagNameForUser(tagName, userName);
311  tagsCount += tm.getBlackboardArtifactTagsCountByTagNameForUser(tagName, userName);
312  }
313  } else {
314  if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) {
315  tagsCount = tm.getContentTagsCountByTagName(tagName, datasourceObjId);
316  tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName, datasourceObjId);
317  } else {
318  tagsCount = tm.getContentTagsCountByTagName(tagName);
319  tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName);
320  }
321  }
322  } catch (TskCoreException | NoCurrentCaseException ex) {
323  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
324  }
325  setDisplayName(tagName.getDisplayName() + " \u200E(\u200E" + tagsCount + ")\u200E");
326  }
327 
328  @Override
329  protected Sheet createSheet() {
330  Sheet propertySheet = super.createSheet();
331  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
332  if (properties == null) {
333  properties = Sheet.createPropertiesSet();
334  propertySheet.put(properties);
335  }
336  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.name"),
337  NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), tagName.getDescription(), getName()));
338  return propertySheet;
339  }
340 
341  @Override
342  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
343  // See classes derived from DisplayableItemNodeVisitor<AbstractNode>
344  // for behavior added using the Visitor pattern.
345  return visitor.visit(this);
346  }
347 
348  @Override
349  public boolean isLeafTypeNode() {
350  return false;
351  }
352 
353  @Override
354  public void update(Observable o, Object arg) {
356  }
357 
358  @Override
359  public String getItemType() {
360  return getClass().getName();
361  }
362  }
363 
368  private class TagTypeNodeFactory extends ChildFactory<String> {
369 
370  private final TagName tagName;
371  private final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.contentTagTypeNodeKey.text");
372  private final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.bbArtTagTypeNodeKey.text");
373 
374  TagTypeNodeFactory(TagName tagName) {
375  super();
376  this.tagName = tagName;
377  }
378 
379  @Override
380  protected boolean createKeys(List<String> keys) {
381  keys.add(CONTENT_TAG_TYPE_NODE_KEY);
382  keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY);
383  return true;
384  }
385 
386  @Override
387  protected Node createNodeForKey(String key) {
388  if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) {
389  return new ContentTagTypeNode(tagName);
390  } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) {
391  return new BlackboardArtifactTagTypeNode(tagName);
392  } else {
393  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS
394  return null;
395  }
396  }
397  }
398 
399  private final String CONTENT_DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text");
400 
407  public class ContentTagTypeNode extends DisplayableItemNode implements Observer {
408 
409  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
410  private final TagName tagName;
411 
412  public ContentTagTypeNode(TagName tagName) {
413  super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + CONTENT_DISPLAY_NAME));
414  this.tagName = tagName;
415  super.setName(CONTENT_DISPLAY_NAME);
417  this.setIconBaseWithExtension(ICON_PATH);
418  tagResults.addObserver(this);
419  }
420 
421  private void updateDisplayName() {
422  long tagsCount = 0;
423  try {
424 
426  String userName = System.getProperty(USER_NAME_PROPERTY);
427  tagsCount = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
430  } else {
431  tagsCount = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
434  }
435  } catch (TskCoreException | NoCurrentCaseException ex) {
436  Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
437  }
438  super.setDisplayName(CONTENT_DISPLAY_NAME + " (" + tagsCount + ")");
439  }
440 
441  @Override
442  protected Sheet createSheet() {
443  Sheet propertySheet = super.createSheet();
444  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
445  if (properties == null) {
446  properties = Sheet.createPropertiesSet();
447  propertySheet.put(properties);
448  }
449  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"),
450  NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"), "", getName()));
451  return propertySheet;
452  }
453 
454  @Override
455  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
456  return visitor.visit(this);
457  }
458 
459  @Override
460  public boolean isLeafTypeNode() {
461  return true;
462  }
463 
464  @Override
465  public void update(Observable o, Object arg) {
467  }
468 
469  @Override
470  public String getItemType() {
471  return getClass().getName();
472  }
473  }
474 
475  private class ContentTagNodeFactory extends ChildFactory<ContentTag> implements Observer {
476 
477  private final TagName tagName;
478 
479  ContentTagNodeFactory(TagName tagName) {
480  super();
481  this.tagName = tagName;
482  tagResults.addObserver(this);
483  }
484 
485  @Override
486  protected boolean createKeys(List<ContentTag> keys) {
487  // Use the content tags bearing the specified tag name as the keys.
488  try {
489  List<ContentTag> contentTags = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
493  String userName = System.getProperty(USER_NAME_PROPERTY);
494  for (ContentTag tag : contentTags) {
495  if (userName.equals(tag.getUserName())) {
496  keys.add(tag);
497  }
498  }
499  } else {
500  keys.addAll(contentTags);
501  }
502  } catch (TskCoreException | NoCurrentCaseException ex) {
503  Logger.getLogger(ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
504  }
505  return true;
506  }
507 
508  @Override
509  protected Node createNodeForKey(ContentTag key) {
510  // The content tags to be wrapped are used as the keys.
511  return new ContentTagNode(key);
512  }
513 
514  @Override
515  public void update(Observable o, Object arg) {
516  refresh(true);
517  }
518  }
519 
520  private final String ARTIFACT_DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, "BlackboardArtifactTagTypeNode.displayName.text");
521 
528  public class BlackboardArtifactTagTypeNode extends DisplayableItemNode implements Observer {
529 
530  private final TagName tagName;
531  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
532 
533  public BlackboardArtifactTagTypeNode(TagName tagName) {
534  super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + ARTIFACT_DISPLAY_NAME));
535  this.tagName = tagName;
536  super.setName(ARTIFACT_DISPLAY_NAME);
537  this.setIconBaseWithExtension(ICON_PATH);
539  tagResults.addObserver(this);
540  }
541 
542  private void updateDisplayName() {
543  long tagsCount = 0;
544  try {
546  String userName = System.getProperty(USER_NAME_PROPERTY);
547  tagsCount = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
550  } else {
551  tagsCount = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
554  }
555  } catch (TskCoreException | NoCurrentCaseException ex) {
556  Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
557  }
558  super.setDisplayName(ARTIFACT_DISPLAY_NAME + " (" + tagsCount + ")");
559  }
560 
561  @Override
562  protected Sheet createSheet() {
563  Sheet propertySheet = super.createSheet();
564  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
565  if (properties == null) {
566  properties = Sheet.createPropertiesSet();
567  propertySheet.put(properties);
568  }
569  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.name"),
570  NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), "", getName()));
571  return propertySheet;
572  }
573 
574  @Override
575  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
576  return visitor.visit(this);
577  }
578 
579  @Override
580  public boolean isLeafTypeNode() {
581  return true;
582  }
583 
584  @Override
585  public void update(Observable o, Object arg) {
587  }
588 
589  @Override
590  public String getItemType() {
591  return getClass().getName();
592  }
593  }
594 
595  private class BlackboardArtifactTagNodeFactory extends ChildFactory<BlackboardArtifactTag> implements Observer {
596 
597  private final TagName tagName;
598 
599  BlackboardArtifactTagNodeFactory(TagName tagName) {
600  super();
601  this.tagName = tagName;
602  tagResults.addObserver(this);
603  }
604 
605  @Override
606  protected boolean createKeys(List<BlackboardArtifactTag> keys) {
607  try {
608  // Use the blackboard artifact tags bearing the specified tag name as the keys.
609  List<BlackboardArtifactTag> artifactTags = Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)
613  String userName = System.getProperty(USER_NAME_PROPERTY);
614  for (BlackboardArtifactTag tag : artifactTags) {
615  if (userName.equals(tag.getUserName())) {
616  keys.add(tag);
617  }
618  }
619  } else {
620  keys.addAll(artifactTags);
621  }
622  } catch (TskCoreException | NoCurrentCaseException ex) {
623  Logger.getLogger(BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
624  }
625  return true;
626  }
627 
628  @Override
629  protected Node createNodeForKey(BlackboardArtifactTag key) {
630  // The blackboard artifact tags to be wrapped are used as the keys.
631  return new BlackboardArtifactTagNode(key);
632  }
633 
634  @Override
635  public void update(Observable o, Object arg) {
636  refresh(true);
637  }
638  }
639 }
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
void update(Observable o, Object arg)
Definition: Tags.java:354
List< TagName > getTagNamesInUseForUser(String userName)
static String getTagsDisplayName()
Definition: Tags.java:79
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< ContentTag > keys)
Definition: Tags.java:486
void addIngestJobEventListener(final PropertyChangeListener listener)
static final String DISPLAY_NAME
Definition: Tags.java:60
boolean createKeys(List< BlackboardArtifactTag > keys)
Definition: Tags.java:606
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName)
void addIngestModuleEventListener(final PropertyChangeListener listener)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:437
List< ContentTag > getContentTagsByTagName(TagName tagName)
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:482
long getContentTagsCountByTagNameForUser(TagName tagName, String userName)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName)
static final String USER_NAME_PROPERTY
Definition: Tags.java:61

Copyright © 2012-2018 Basis Technology. Generated on: Fri Mar 22 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.