Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
FileTypesNode.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2015 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 
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Observable;
27 import org.openide.nodes.ChildFactory;
28 import org.openide.nodes.Children;
29 import org.openide.nodes.Node;
30 import org.openide.nodes.Sheet;
31 import org.openide.util.NbBundle;
32 import org.openide.util.lookup.Lookups;
35 import org.sleuthkit.datamodel.SleuthkitCase;
36 
40 public class FileTypesNode extends DisplayableItemNode {
41 
42  private static final String FNAME = NbBundle.getMessage(FileTypesNode.class, "FileTypesNode.fname.text");
51  super(Children.create(new FileTypesChildren(skCase, filter, null), true), Lookups.singleton(filter == null ? FNAME : filter.getName()));
52  this.filter = filter;
53  init();
54  }
55 
63  private FileTypesNode(SleuthkitCase skCase, FileTypeExtensionFilters.RootFilter filter, Observable o) {
64  super(Children.create(new FileTypesChildren(skCase, filter, o), true), Lookups.singleton(filter == null ? FNAME : filter.getName()));
65  this.filter = filter;
66  init();
67  }
68 
69  private void init() {
70  // root node of tree
71  if (filter == null) {
72  super.setName(FNAME);
73  super.setDisplayName(FNAME);
74  } // sub-node in file tree (i.e. documents, exec, etc.)
75  else {
76  super.setName(filter.getName());
77  super.setDisplayName(filter.getDisplayName());
78  }
79  this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/file_types.png"); //NON-NLS
80  }
81 
82  @Override
83  public boolean isLeafTypeNode() {
84  return false;
85  }
86 
87  @Override
88  public <T> T accept(DisplayableItemNodeVisitor<T> v) {
89  return v.visit(this);
90  }
91 
92  @Override
93  protected Sheet createSheet() {
94  Sheet s = super.createSheet();
95  Sheet.Set ss = s.get(Sheet.PROPERTIES);
96  if (ss == null) {
97  ss = Sheet.createPropertiesSet();
98  s.put(ss);
99  }
100 
101  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "FileTypesNode.createSheet.name.name"),
102  NbBundle.getMessage(this.getClass(), "FileTypesNode.createSheet.name.displayName"),
103  NbBundle.getMessage(this.getClass(), "FileTypesNode.createSheet.name.desc"),
104  getName()));
105  return s;
106  }
107 
108  /*
109  * TODO (AUT-1849): Correct or remove peristent column reordering code
110  *
111  * Added to support this feature.
112  */
113 // @Override
114 // public String getItemType() {
115 // if(filter == null)
116 // return "FileTypes"; //NON-NLS
117 // if (filter.equals(FileTypeExtensionFilters.RootFilter.TSK_DOCUMENT_FILTER))
118 // return "FileTypesDoc"; //NON-NLS
119 // if (filter.equals(FileTypeExtensionFilters.RootFilter.TSK_EXECUTABLE_FILTER))
120 // return "FileTypesExe"; //NON-NLS
121 // return "FileTypes"; //NON-NLS
122 // }
123 
127  static class FileTypesChildren extends ChildFactory<FileTypeExtensionFilters.SearchFilterInterface> {
128 
129  private SleuthkitCase skCase;
131  private Observable notifier;
132 
140  public FileTypesChildren(SleuthkitCase skCase, FileTypeExtensionFilters.RootFilter filter, Observable o) {
141  super();
142  this.skCase = skCase;
143  this.filter = filter;
144  if (o == null) {
145  this.notifier = new FileTypesChildrenObservable();
146  } else {
147  this.notifier = o;
148  }
149  }
150 
155  private final class FileTypesChildrenObservable extends Observable {
156 
161  }
162 
163  private void removeListeners() {
164  deleteObservers();
168  }
169 
170  private final PropertyChangeListener pcl = new PropertyChangeListener() {
171  @Override
172  public void propertyChange(PropertyChangeEvent evt) {
173  String eventType = evt.getPropertyName();
174  if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())
175  || eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
176  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
177  || eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
184  try {
186  update();
187  } catch (IllegalStateException notUsed) {
191  }
192  } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
193  // case was closed. Remove listeners so that we don't get called with a stale case handle
194  if (evt.getNewValue() == null) {
195  removeListeners();
196  }
197  }
198  }
199  };
200 
201  private void update() {
202  setChanged();
203  notifyObservers();
204  }
205  }
206 
207  @Override
208  protected boolean createKeys(List<FileTypeExtensionFilters.SearchFilterInterface> list) {
209  // root node
210  if (filter == null) {
211  list.addAll(Arrays.asList(FileTypeExtensionFilters.RootFilter.values()));
212  } // document and executable has another level of nodes
214  list.addAll(Arrays.asList(FileTypeExtensionFilters.DocumentFilter.values()));
215  } else if (filter.equals(FileTypeExtensionFilters.RootFilter.TSK_EXECUTABLE_FILTER)) {
216  list.addAll(Arrays.asList(FileTypeExtensionFilters.ExecutableFilter.values()));
217  }
218  return true;
219  }
220 
221  @Override
222  protected Node createNodeForKey(FileTypeExtensionFilters.SearchFilterInterface key) {
223  // make new nodes for the sub-nodes
224  if (key.getName().equals(FileTypeExtensionFilters.RootFilter.TSK_DOCUMENT_FILTER.getName())) {
225  return new FileTypesNode(skCase, FileTypeExtensionFilters.RootFilter.TSK_DOCUMENT_FILTER, notifier);
226  } else if (key.getName().equals(FileTypeExtensionFilters.RootFilter.TSK_EXECUTABLE_FILTER.getName())) {
227  return new FileTypesNode(skCase, FileTypeExtensionFilters.RootFilter.TSK_EXECUTABLE_FILTER, notifier);
228  } else {
229  return new FileTypeNode(key, skCase, notifier);
230  }
231  }
232  }
233 }
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
static void removePropertyChangeListener(PropertyChangeListener listener)
Definition: Case.java:318
final FileTypeExtensionFilters.RootFilter filter
void removeIngestJobEventListener(final PropertyChangeListener listener)
FileTypesNode(SleuthkitCase skCase, FileTypeExtensionFilters.RootFilter filter, Observable o)
void addIngestJobEventListener(final PropertyChangeListener listener)
static void addPropertyChangeListener(PropertyChangeListener listener)
Definition: Case.java:306
void addIngestModuleEventListener(final PropertyChangeListener listener)

Copyright © 2012-2016 Basis Technology. Generated on: Tue Oct 25 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.