Autopsy  4.11.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.Observable;
27 import java.util.Observer;
28 import java.util.Set;
29 import java.util.logging.Level;
30 import org.openide.nodes.ChildFactory;
31 import org.openide.nodes.Children;
32 import org.openide.nodes.Node;
33 import org.openide.nodes.Sheet;
34 import org.openide.util.NbBundle;
35 import org.openide.util.lookup.Lookups;
42 import org.sleuthkit.datamodel.BlackboardArtifactTag;
43 import org.sleuthkit.datamodel.ContentTag;
44 import org.sleuthkit.datamodel.TagName;
45 import org.sleuthkit.datamodel.TskCoreException;
46 
52 public class Tags implements AutopsyVisitableItem {
53  // Creation of a RootNode object corresponding to a Tags object is done
54  // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren
55  // override of Children.Keys<T>.createNodes().
56 
57  private final TagResults tagResults = new TagResults();
58  private final static String DISPLAY_NAME = NbBundle.getMessage(RootNode.class, "TagsNode.displayName.text");
59  private static final String USER_NAME_PROPERTY = "user.name"; //NON-NLS
60  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
61 
62  private final long filteringDSObjId; // 0 if not filtering/grouping by data source
63 
64  Tags() {
65  this(0);
66  }
67 
68  Tags(long dsObjId) {
69  this.filteringDSObjId = dsObjId;
70  }
71 
77  public static String getTagsDisplayName() {
78  return DISPLAY_NAME;
79  }
80 
81  long filteringDataSourceObjId() {
82  return this.filteringDSObjId;
83  }
84 
85  @Override
86  public <T> T accept(AutopsyItemVisitor<T> visitor) {
87  return visitor.visit(this);
88  }
89 
95  private class TagResults extends Observable {
96 
97  public void update() {
98  setChanged();
99  notifyObservers();
100  }
101  }
102 
109  public class RootNode extends DisplayableItemNode {
110 
111  public RootNode(long objId) {
112  super(Children.create(new TagNameNodeFactory(objId), true), Lookups.singleton(DISPLAY_NAME));
113  super.setName(DISPLAY_NAME);
114  super.setDisplayName(DISPLAY_NAME);
115  this.setIconBaseWithExtension(ICON_PATH);
116  }
117 
118  @Override
119  public boolean isLeafTypeNode() {
120  return false;
121  }
122 
123  @Override
124  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
125  return visitor.visit(this);
126  }
127 
128  @Override
129  protected Sheet createSheet() {
130  Sheet propertySheet = super.createSheet();
131  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
132  if (properties == null) {
133  properties = Sheet.createPropertiesSet();
134  propertySheet.put(properties);
135  }
136  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.name"),
137  NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), "", getName()));
138  return propertySheet;
139  }
140 
141  @Override
142  public String getItemType() {
143  return getClass().getName();
144  }
145 
149  public void refresh() {
150  tagResults.update();
151  }
152 
153  }
154 
155  private class TagNameNodeFactory extends ChildFactory.Detachable<TagName> implements Observer {
156 
157  private final long filteringDSObjId; // 0 if not filtering/grouping by data source
158 
164 
165  private final PropertyChangeListener pcl = new PropertyChangeListener() {
166  @Override
167  public void propertyChange(PropertyChangeEvent evt) {
168  String eventType = evt.getPropertyName();
169  if (eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString())
170  || eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString())
171  || eventType.equals(Case.Events.CONTENT_TAG_ADDED.toString())
172  || eventType.equals(Case.Events.CONTENT_TAG_DELETED.toString())) {
179  try {
181  refresh(true);
182  tagResults.update();
183  } catch (NoCurrentCaseException notUsed) {
187  }
188  } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
189  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
196  try {
198  refresh(true);
199  tagResults.update();
200  } catch (NoCurrentCaseException notUsed) {
204  }
205  } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
206  // case was closed. Remove listeners so that this can be garbage collected
207  if (evt.getNewValue() == null) {
208  removeNotify();
209  }
210  }
211  }
212  };
213 
219  TagNameNodeFactory(long objId) {
220  this.filteringDSObjId = objId;
221 
222  }
223 
224  @Override
225  protected void addNotify() {
229  tagResults.update();
230  tagResults.addObserver(this);
231  }
232 
233  @Override
234  protected void removeNotify() {
238  tagResults.deleteObserver(this);
239  }
240 
241  @Override
242  protected boolean createKeys(List<TagName> keys) {
243  try {
244  List<TagName> tagNamesInUse;
246  String userName = System.getProperty(USER_NAME_PROPERTY);
247  tagNamesInUse = (filteringDSObjId > 0)
250  } else {
251  tagNamesInUse = (filteringDSObjId > 0)
254  }
255  Collections.sort(tagNamesInUse);
256  keys.addAll(tagNamesInUse);
257  } catch (TskCoreException | NoCurrentCaseException ex) {
258  Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
259  }
260  return true;
261  }
262 
263  @Override
264  protected Node createNodeForKey(TagName key) {
265  return new TagNameNode(key);
266  }
267 
268  @Override
269  public void update(Observable o, Object arg) {
270  refresh(true);
271  }
272  }
273 
279  public class TagNameNode extends DisplayableItemNode implements Observer {
280 
281  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
282  private final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS
283  private final TagName tagName;
284 
285  public TagNameNode(TagName tagName) {
286  super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton(NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName())));
287  this.tagName = tagName;
288  setName(tagName.getDisplayName());
290  if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) {
291  setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH);
292  } else {
293  setIconBaseWithExtension(ICON_PATH);
294  }
295  tagResults.addObserver(this);
296  }
297 
298  private void updateDisplayName() {
299  long tagsCount = 0;
300  try {
303  String userName = System.getProperty(USER_NAME_PROPERTY);
304  if (filteringDSObjId > 0) {
305  tagsCount = tm.getContentTagsCountByTagNameForUser(tagName, filteringDSObjId, userName);
306  tagsCount += tm.getBlackboardArtifactTagsCountByTagNameForUser(tagName, filteringDSObjId, userName);
307  } else {
308  tagsCount = tm.getContentTagsCountByTagNameForUser(tagName, userName);
309  tagsCount += tm.getBlackboardArtifactTagsCountByTagNameForUser(tagName, userName);
310  }
311  } else {
312  if (filteringDSObjId > 0) {
313  tagsCount = tm.getContentTagsCountByTagName(tagName, filteringDSObjId);
314  tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName, filteringDSObjId);
315  } else {
316  tagsCount = tm.getContentTagsCountByTagName(tagName);
317  tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName);
318  }
319  }
320  } catch (TskCoreException | NoCurrentCaseException ex) {
321  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
322  }
323  setDisplayName(tagName.getDisplayName() + " \u200E(\u200E" + tagsCount + ")\u200E");
324  }
325 
326  @Override
327  protected Sheet createSheet() {
328  Sheet propertySheet = super.createSheet();
329  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
330  if (properties == null) {
331  properties = Sheet.createPropertiesSet();
332  propertySheet.put(properties);
333  }
334  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.name"),
335  NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), tagName.getDescription(), getName()));
336  return propertySheet;
337  }
338 
339  @Override
340  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
341  // See classes derived from DisplayableItemNodeVisitor<AbstractNode>
342  // for behavior added using the Visitor pattern.
343  return visitor.visit(this);
344  }
345 
346  @Override
347  public boolean isLeafTypeNode() {
348  return false;
349  }
350 
351  @Override
352  public void update(Observable o, Object arg) {
354  }
355 
356  @Override
357  public String getItemType() {
358  return getClass().getName();
359  }
360  }
361 
366  private class TagTypeNodeFactory extends ChildFactory<String> {
367 
368  private final TagName tagName;
369  private final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.contentTagTypeNodeKey.text");
370  private final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.bbArtTagTypeNodeKey.text");
371 
372  TagTypeNodeFactory(TagName tagName) {
373  super();
374  this.tagName = tagName;
375  }
376 
377  @Override
378  protected boolean createKeys(List<String> keys) {
379  keys.add(CONTENT_TAG_TYPE_NODE_KEY);
380  keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY);
381  return true;
382  }
383 
384  @Override
385  protected Node createNodeForKey(String key) {
386  if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) {
387  return new ContentTagTypeNode(tagName);
388  } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) {
389  return new BlackboardArtifactTagTypeNode(tagName);
390  } else {
391  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS
392  return null;
393  }
394  }
395  }
396 
397  private final String CONTENT_DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text");
398 
405  public class ContentTagTypeNode extends DisplayableItemNode implements Observer {
406 
407  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
408  private final TagName tagName;
409 
410  public ContentTagTypeNode(TagName tagName) {
411  super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + CONTENT_DISPLAY_NAME));
412  this.tagName = tagName;
413  super.setName(CONTENT_DISPLAY_NAME);
415  this.setIconBaseWithExtension(ICON_PATH);
416  tagResults.addObserver(this);
417  }
418 
419  private void updateDisplayName() {
420  long tagsCount = 0;
421  try {
422 
424  String userName = System.getProperty(USER_NAME_PROPERTY);
425  tagsCount = (filteringDSObjId > 0)
426  ? Case.getCurrentCaseThrows().getServices().getTagsManager().getContentTagsCountByTagNameForUser(tagName, filteringDSObjId, userName)
428  } else {
429  tagsCount = (filteringDSObjId > 0)
432  }
433  } catch (TskCoreException | NoCurrentCaseException ex) {
434  Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
435  }
436  super.setDisplayName(CONTENT_DISPLAY_NAME + " (" + tagsCount + ")");
437  }
438 
439  @Override
440  protected Sheet createSheet() {
441  Sheet propertySheet = super.createSheet();
442  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
443  if (properties == null) {
444  properties = Sheet.createPropertiesSet();
445  propertySheet.put(properties);
446  }
447  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"),
448  NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"), "", getName()));
449  return propertySheet;
450  }
451 
452  @Override
453  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
454  return visitor.visit(this);
455  }
456 
457  @Override
458  public boolean isLeafTypeNode() {
459  return true;
460  }
461 
462  @Override
463  public void update(Observable o, Object arg) {
465  }
466 
467  @Override
468  public String getItemType() {
469  return getClass().getName();
470  }
471  }
472 
473  private class ContentTagNodeFactory extends ChildFactory<ContentTag> implements Observer {
474 
475  private final TagName tagName;
476 
477  ContentTagNodeFactory(TagName tagName) {
478  super();
479  this.tagName = tagName;
480  tagResults.addObserver(this);
481  }
482 
483  @Override
484  protected boolean createKeys(List<ContentTag> keys) {
485  // Use the content tags bearing the specified tag name as the keys.
486  try {
487  List<ContentTag> contentTags = (filteringDSObjId > 0)
491  String userName = System.getProperty(USER_NAME_PROPERTY);
492  for (ContentTag tag : contentTags) {
493  if (userName.equals(tag.getUserName())) {
494  keys.add(tag);
495  }
496  }
497  } else {
498  keys.addAll(contentTags);
499  }
500  } catch (TskCoreException | NoCurrentCaseException ex) {
501  Logger.getLogger(ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
502  }
503  return true;
504  }
505 
506  @Override
507  protected Node createNodeForKey(ContentTag key) {
508  // The content tags to be wrapped are used as the keys.
509  return new ContentTagNode(key);
510  }
511 
512  @Override
513  public void update(Observable o, Object arg) {
514  refresh(true);
515  }
516  }
517 
518  private final String ARTIFACT_DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, "BlackboardArtifactTagTypeNode.displayName.text");
519 
526  public class BlackboardArtifactTagTypeNode extends DisplayableItemNode implements Observer {
527 
528  private final TagName tagName;
529  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
530 
531  public BlackboardArtifactTagTypeNode(TagName tagName) {
532  super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + ARTIFACT_DISPLAY_NAME));
533  this.tagName = tagName;
534  super.setName(ARTIFACT_DISPLAY_NAME);
535  this.setIconBaseWithExtension(ICON_PATH);
537  tagResults.addObserver(this);
538  }
539 
540  private void updateDisplayName() {
541  long tagsCount = 0;
542  try {
544  String userName = System.getProperty(USER_NAME_PROPERTY);
545  tagsCount = (filteringDSObjId > 0)
548  } else {
549  tagsCount = (filteringDSObjId > 0)
552  }
553  } catch (TskCoreException | NoCurrentCaseException ex) {
554  Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
555  }
556  super.setDisplayName(ARTIFACT_DISPLAY_NAME + " (" + tagsCount + ")");
557  }
558 
559  @Override
560  protected Sheet createSheet() {
561  Sheet propertySheet = super.createSheet();
562  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
563  if (properties == null) {
564  properties = Sheet.createPropertiesSet();
565  propertySheet.put(properties);
566  }
567  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.name"),
568  NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), "", getName()));
569  return propertySheet;
570  }
571 
572  @Override
573  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
574  return visitor.visit(this);
575  }
576 
577  @Override
578  public boolean isLeafTypeNode() {
579  return true;
580  }
581 
582  @Override
583  public void update(Observable o, Object arg) {
585  }
586 
587  @Override
588  public String getItemType() {
589  return getClass().getName();
590  }
591  }
592 
593  private class BlackboardArtifactTagNodeFactory extends ChildFactory<BlackboardArtifactTag> implements Observer {
594 
595  private final TagName tagName;
596 
597  BlackboardArtifactTagNodeFactory(TagName tagName) {
598  super();
599  this.tagName = tagName;
600  tagResults.addObserver(this);
601  }
602 
603  @Override
604  protected boolean createKeys(List<BlackboardArtifactTag> keys) {
605  try {
606  // Use the blackboard artifact tags bearing the specified tag name as the keys.
607  List<BlackboardArtifactTag> artifactTags = (filteringDSObjId > 0)
611  String userName = System.getProperty(USER_NAME_PROPERTY);
612  for (BlackboardArtifactTag tag : artifactTags) {
613  if (userName.equals(tag.getUserName())) {
614  keys.add(tag);
615  }
616  }
617  } else {
618  keys.addAll(artifactTags);
619  }
620  } catch (TskCoreException | NoCurrentCaseException ex) {
621  Logger.getLogger(BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
622  }
623  return true;
624  }
625 
626  @Override
627  protected Node createNodeForKey(BlackboardArtifactTag key) {
628  // The blackboard artifact tags to be wrapped are used as the keys.
629  return new BlackboardArtifactTagNode(key);
630  }
631 
632  @Override
633  public void update(Observable o, Object arg) {
634  refresh(true);
635  }
636  }
637 }
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
void update(Observable o, Object arg)
Definition: Tags.java:352
List< TagName > getTagNamesInUseForUser(String userName)
static String getTagsDisplayName()
Definition: Tags.java:77
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< ContentTag > keys)
Definition: Tags.java:484
void addIngestJobEventListener(final PropertyChangeListener listener)
static final String DISPLAY_NAME
Definition: Tags.java:58
boolean createKeys(List< BlackboardArtifactTag > keys)
Definition: Tags.java:604
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:441
List< ContentTag > getContentTagsByTagName(TagName tagName)
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:486
long getContentTagsCountByTagNameForUser(TagName tagName, String userName)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName)
static final String USER_NAME_PROPERTY
Definition: Tags.java:59

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