Autopsy  4.6.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;
41 import org.sleuthkit.datamodel.BlackboardArtifactTag;
42 import org.sleuthkit.datamodel.ContentTag;
43 import org.sleuthkit.datamodel.TagName;
44 import org.sleuthkit.datamodel.TskCoreException;
45 
51 public class Tags implements AutopsyVisitableItem {
52  // Creation of a RootNode object corresponding to a Tags object is done
53  // by a CreateAutopsyNodeVisitor dispatched from the AbstractContentChildren
54  // override of Children.Keys<T>.createNodes().
55 
56  private final TagResults tagResults = new TagResults();
57  private final String DISPLAY_NAME = NbBundle.getMessage(RootNode.class, "TagsNode.displayName.text");
58  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
59 
60  @Override
61  public <T> T accept(AutopsyItemVisitor<T> visitor) {
62  return visitor.visit(this);
63  }
64 
70  private class TagResults extends Observable {
71 
72  public void update() {
73  setChanged();
74  notifyObservers();
75  }
76  }
77 
84  public class RootNode extends DisplayableItemNode {
85 
86  public RootNode() {
87  super(Children.create(new TagNameNodeFactory(), true), Lookups.singleton(DISPLAY_NAME));
88  super.setName(DISPLAY_NAME);
89  super.setDisplayName(DISPLAY_NAME);
90  this.setIconBaseWithExtension(ICON_PATH);
91  }
92 
93  @Override
94  public boolean isLeafTypeNode() {
95  return false;
96  }
97 
98  @Override
99  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
100  return visitor.visit(this);
101  }
102 
103  @Override
104  protected Sheet createSheet() {
105  Sheet propertySheet = super.createSheet();
106  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
107  if (properties == null) {
108  properties = Sheet.createPropertiesSet();
109  propertySheet.put(properties);
110  }
111  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.name"),
112  NbBundle.getMessage(this.getClass(), "TagsNode.createSheet.name.displayName"), "", getName()));
113  return propertySheet;
114  }
115 
116  @Override
117  public String getItemType() {
118  return getClass().getName();
119  }
120  }
121 
122  private class TagNameNodeFactory extends ChildFactory.Detachable<TagName> implements Observer {
123 
129 
130  private final PropertyChangeListener pcl = new PropertyChangeListener() {
131  @Override
132  public void propertyChange(PropertyChangeEvent evt) {
133  String eventType = evt.getPropertyName();
134  if (eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString())
135  || eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString())
136  || eventType.equals(Case.Events.CONTENT_TAG_ADDED.toString())
137  || eventType.equals(Case.Events.CONTENT_TAG_DELETED.toString())) {
144  try {
145  Case.getOpenCase();
146  refresh(true);
147  tagResults.update();
148  } catch (NoCurrentCaseException notUsed) {
152  }
153  } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
154  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
161  try {
162  Case.getOpenCase();
163  refresh(true);
164  tagResults.update();
165  } catch (NoCurrentCaseException notUsed) {
169  }
170  } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
171  // case was closed. Remove listeners so that this can be garbage collected
172  if (evt.getNewValue() == null) {
173  removeNotify();
174  }
175  }
176  }
177  };
178 
179  @Override
180  protected void addNotify() {
184  tagResults.update();
185  tagResults.addObserver(this);
186  }
187 
188  @Override
189  protected void removeNotify() {
193  tagResults.deleteObserver(this);
194  }
195 
196  @Override
197  protected boolean createKeys(List<TagName> keys) {
198  try {
199  List<TagName> tagNamesInUse = Case.getOpenCase().getServices().getTagsManager().getTagNamesInUse();
200  Collections.sort(tagNamesInUse);
201  keys.addAll(tagNamesInUse);
202  } catch (TskCoreException | NoCurrentCaseException ex) {
203  Logger.getLogger(TagNameNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
204  }
205  return true;
206  }
207 
208  @Override
209  protected Node createNodeForKey(TagName key) {
210  return new TagNameNode(key);
211  }
212 
213  @Override
214  public void update(Observable o, Object arg) {
215  refresh(true);
216  }
217  }
218 
224  public class TagNameNode extends DisplayableItemNode implements Observer {
225 
226  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
227  private final String BOOKMARK_TAG_ICON_PATH = "org/sleuthkit/autopsy/images/star-bookmark-icon-16.png"; //NON-NLS
228  private final TagName tagName;
229 
230  public TagNameNode(TagName tagName) {
231  super(Children.create(new TagTypeNodeFactory(tagName), true), Lookups.singleton(NbBundle.getMessage(TagNameNode.class, "TagNameNode.namePlusTags.text", tagName.getDisplayName())));
232  this.tagName = tagName;
233  setName(tagName.getDisplayName());
235  if (tagName.getDisplayName().equals(NbBundle.getMessage(this.getClass(), "TagNameNode.bookmark.text"))) {
236  setIconBaseWithExtension(BOOKMARK_TAG_ICON_PATH);
237  } else {
238  setIconBaseWithExtension(ICON_PATH);
239  }
240  tagResults.addObserver(this);
241  }
242 
243  private void updateDisplayName() {
244  long tagsCount = 0;
245  try {
247  tagsCount = tm.getContentTagsCountByTagName(tagName);
248  tagsCount += tm.getBlackboardArtifactTagsCountByTagName(tagName);
249  } catch (TskCoreException | NoCurrentCaseException ex) {
250  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "Failed to get tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
251  }
252  setDisplayName(tagName.getDisplayName() + " \u200E(\u200E" + tagsCount + ")\u200E");
253  }
254 
255  @Override
256  protected Sheet createSheet() {
257  Sheet propertySheet = super.createSheet();
258  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
259  if (properties == null) {
260  properties = Sheet.createPropertiesSet();
261  propertySheet.put(properties);
262  }
263  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.name"),
264  NbBundle.getMessage(this.getClass(), "TagNameNode.createSheet.name.displayName"), tagName.getDescription(), getName()));
265  return propertySheet;
266  }
267 
268  @Override
269  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
270  // See classes derived from DisplayableItemNodeVisitor<AbstractNode>
271  // for behavior added using the Visitor pattern.
272  return visitor.visit(this);
273  }
274 
275  @Override
276  public boolean isLeafTypeNode() {
277  return false;
278  }
279 
280  @Override
281  public void update(Observable o, Object arg) {
283  }
284 
285  @Override
286  public String getItemType() {
287  return getClass().getName();
288  }
289  }
290 
295  private class TagTypeNodeFactory extends ChildFactory<String> {
296 
297  private final TagName tagName;
298  private final String CONTENT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.contentTagTypeNodeKey.text");
299  private final String BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY = NbBundle.getMessage(TagNameNode.class, "TagNameNode.bbArtTagTypeNodeKey.text");
300 
301  TagTypeNodeFactory(TagName tagName) {
302  super();
303  this.tagName = tagName;
304  }
305 
306  @Override
307  protected boolean createKeys(List<String> keys) {
308  keys.add(CONTENT_TAG_TYPE_NODE_KEY);
309  keys.add(BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY);
310  return true;
311  }
312 
313  @Override
314  protected Node createNodeForKey(String key) {
315  if (CONTENT_TAG_TYPE_NODE_KEY.equals(key)) {
316  return new ContentTagTypeNode(tagName);
317  } else if (BLACKBOARD_ARTIFACT_TAG_TYPE_NODE_KEY.equals(key)) {
318  return new BlackboardArtifactTagTypeNode(tagName);
319  } else {
320  Logger.getLogger(TagNameNode.class.getName()).log(Level.SEVERE, "{0} not a recognized key", key); //NON-NLS
321  return null;
322  }
323  }
324  }
325 
326  private final String CONTENT_DISPLAY_NAME = NbBundle.getMessage(ContentTagTypeNode.class, "ContentTagTypeNode.displayName.text");
327 
334  public class ContentTagTypeNode extends DisplayableItemNode implements Observer {
335 
336  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
337  private final TagName tagName;
338 
339  public ContentTagTypeNode(TagName tagName) {
340  super(Children.create(new ContentTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + CONTENT_DISPLAY_NAME));
341  this.tagName = tagName;
342  super.setName(CONTENT_DISPLAY_NAME);
344  this.setIconBaseWithExtension(ICON_PATH);
345  tagResults.addObserver(this);
346  }
347 
348  private void updateDisplayName() {
349  long tagsCount = 0;
350  try {
352  } catch (TskCoreException | NoCurrentCaseException ex) {
353  Logger.getLogger(ContentTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get content tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
354  }
355  super.setDisplayName(CONTENT_DISPLAY_NAME + " (" + tagsCount + ")");
356  }
357 
358  @Override
359  protected Sheet createSheet() {
360  Sheet propertySheet = super.createSheet();
361  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
362  if (properties == null) {
363  properties = Sheet.createPropertiesSet();
364  propertySheet.put(properties);
365  }
366  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.name"),
367  NbBundle.getMessage(this.getClass(), "ContentTagTypeNode.createSheet.name.displayName"), "", getName()));
368  return propertySheet;
369  }
370 
371  @Override
372  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
373  return visitor.visit(this);
374  }
375 
376  @Override
377  public boolean isLeafTypeNode() {
378  return true;
379  }
380 
381  @Override
382  public void update(Observable o, Object arg) {
384  }
385 
386  @Override
387  public String getItemType() {
388  return getClass().getName();
389  }
390  }
391 
392  private class ContentTagNodeFactory extends ChildFactory<ContentTag> implements Observer {
393 
394  private final TagName tagName;
395 
396  ContentTagNodeFactory(TagName tagName) {
397  super();
398  this.tagName = tagName;
399  tagResults.addObserver(this);
400  }
401 
402  @Override
403  protected boolean createKeys(List<ContentTag> keys) {
404  // Use the content tags bearing the specified tag name as the keys.
405  try {
407  } catch (TskCoreException | NoCurrentCaseException ex) {
408  Logger.getLogger(ContentTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
409  }
410  return true;
411  }
412 
413  @Override
414  protected Node createNodeForKey(ContentTag key) {
415  // The content tags to be wrapped are used as the keys.
416  return new ContentTagNode(key);
417  }
418 
419  @Override
420  public void update(Observable o, Object arg) {
421  refresh(true);
422  }
423  }
424 
425  private final String ARTIFACT_DISPLAY_NAME = NbBundle.getMessage(BlackboardArtifactTagTypeNode.class, "BlackboardArtifactTagTypeNode.displayName.text");
426 
433  public class BlackboardArtifactTagTypeNode extends DisplayableItemNode implements Observer {
434 
435  private final TagName tagName;
436  private final String ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
437 
438  public BlackboardArtifactTagTypeNode(TagName tagName) {
439  super(Children.create(new BlackboardArtifactTagNodeFactory(tagName), true), Lookups.singleton(tagName.getDisplayName() + " " + ARTIFACT_DISPLAY_NAME));
440  this.tagName = tagName;
441  super.setName(ARTIFACT_DISPLAY_NAME);
442  this.setIconBaseWithExtension(ICON_PATH);
444  tagResults.addObserver(this);
445  }
446 
447  private void updateDisplayName() {
448  long tagsCount = 0;
449  try {
451  } catch (TskCoreException | NoCurrentCaseException ex) {
452  Logger.getLogger(BlackboardArtifactTagTypeNode.class.getName()).log(Level.SEVERE, "Failed to get blackboard artifact tags count for " + tagName.getDisplayName() + " tag name", ex); //NON-NLS
453  }
454  super.setDisplayName(ARTIFACT_DISPLAY_NAME + " (" + tagsCount + ")");
455  }
456 
457  @Override
458  protected Sheet createSheet() {
459  Sheet propertySheet = super.createSheet();
460  Sheet.Set properties = propertySheet.get(Sheet.PROPERTIES);
461  if (properties == null) {
462  properties = Sheet.createPropertiesSet();
463  propertySheet.put(properties);
464  }
465  properties.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.name"),
466  NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagTypeNode.createSheet.name.displayName"), "", getName()));
467  return propertySheet;
468  }
469 
470  @Override
471  public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
472  return visitor.visit(this);
473  }
474 
475  @Override
476  public boolean isLeafTypeNode() {
477  return true;
478  }
479 
480  @Override
481  public void update(Observable o, Object arg) {
483  }
484 
485  @Override
486  public String getItemType() {
487  return getClass().getName();
488  }
489  }
490 
491  private class BlackboardArtifactTagNodeFactory extends ChildFactory<BlackboardArtifactTag> implements Observer {
492 
493  private final TagName tagName;
494 
495  BlackboardArtifactTagNodeFactory(TagName tagName) {
496  super();
497  this.tagName = tagName;
498  tagResults.addObserver(this);
499  }
500 
501  @Override
502  protected boolean createKeys(List<BlackboardArtifactTag> keys) {
503  try {
504  // Use the blackboard artifact tags bearing the specified tag name as the keys.
506  } catch (TskCoreException | NoCurrentCaseException ex) {
507  Logger.getLogger(BlackboardArtifactTagNodeFactory.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
508  }
509  return true;
510  }
511 
512  @Override
513  protected Node createNodeForKey(BlackboardArtifactTag key) {
514  // The blackboard artifact tags to be wrapped are used as the keys.
515  return new BlackboardArtifactTagNode(key);
516  }
517 
518  @Override
519  public void update(Observable o, Object arg) {
520  refresh(true);
521  }
522  }
523 }
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
void update(Observable o, Object arg)
Definition: Tags.java:281
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< ContentTag > keys)
Definition: Tags.java:403
void addIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< BlackboardArtifactTag > keys)
Definition: Tags.java:502
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:420
List< ContentTag > getContentTagsByTagName(TagName tagName)
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:465

Copyright © 2012-2016 Basis Technology. Generated on: Mon May 7 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.