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

Copyright © 2012-2015 Basis Technology. Generated on: Wed Apr 6 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.