Autopsy  4.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
FileTypeNode.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2014 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.util.List;
22 import java.util.Observable;
23 import java.util.Observer;
24 import java.util.logging.Level;
25 import org.openide.nodes.AbstractNode;
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.AbstractFile;
35 import org.sleuthkit.datamodel.Content;
36 import org.sleuthkit.datamodel.ContentVisitor;
37 import org.sleuthkit.datamodel.DerivedFile;
38 import org.sleuthkit.datamodel.Directory;
39 import org.sleuthkit.datamodel.File;
40 import org.sleuthkit.datamodel.LayoutFile;
41 import org.sleuthkit.datamodel.LocalFile;
42 import org.sleuthkit.datamodel.SleuthkitCase;
43 import org.sleuthkit.datamodel.TskCoreException;
44 import org.sleuthkit.datamodel.TskData;
45 
50 public class FileTypeNode extends DisplayableItemNode {
51 
52  FileTypeExtensionFilters.SearchFilterInterface filter;
53  SleuthkitCase skCase;
54 
55  // deprecated in favor of the version that takes an observable to provide refresh updates
56  @Deprecated
57  FileTypeNode(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) {
58  super(Children.create(new FileTypeChildFactory(filter, skCase), true), Lookups.singleton(filter.getDisplayName()));
59  this.filter = filter;
60  this.skCase = skCase;
61  init();
62  }
63 
71  FileTypeNode(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase, Observable o) {
72  super(Children.create(new FileTypeChildFactory(filter, skCase, o), true), Lookups.singleton(filter.getDisplayName()));
73  this.filter = filter;
74  this.skCase = skCase;
75  init();
76  o.addObserver(new FileTypeNodeObserver());
77  }
78 
79  private void init() {
80  super.setName(filter.getName());
82  this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-filter-icon.png"); //NON-NLS
83  }
84 
85  /*
86  * TODO (AUT-1849): Correct or remove peristent column reordering code
87  *
88  * Added to support this feature.
89  */
90 // @Override
91 // public String getItemType() {
92 // return "FileType"; //NON-NLS
93 // }
94 
95  // update the display name when new events are fired
96  private class FileTypeNodeObserver implements Observer {
97 
98  @Override
99  public void update(Observable o, Object arg) {
101  }
102  }
103 
104  private void updateDisplayName() {
105  final long count = FileTypeChildFactory.calculateItems(skCase, filter);
106  super.setDisplayName(filter.getDisplayName() + " (" + count + ")");
107  }
108 
109  @Override
110  public <T> T accept(DisplayableItemNodeVisitor<T> v) {
111  return v.visit(this);
112  }
113 
114  @Override
115  protected Sheet createSheet() {
116  Sheet s = super.createSheet();
117  Sheet.Set ss = s.get(Sheet.PROPERTIES);
118  if (ss == null) {
119  ss = Sheet.createPropertiesSet();
120  s.put(ss);
121  }
122 
123  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.filterType.name"),
124  NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.filterType.displayName"),
125  NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.filterType.desc"),
126  filter.getDisplayName()));
127  String extensions = "";
128  for (String ext : filter.getFilter()) {
129  extensions += "'" + ext + "', ";
130  }
131  extensions = extensions.substring(0, extensions.lastIndexOf(','));
132  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.fileExt.name"),
133  NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.fileExt.displayName"),
134  NbBundle.getMessage(this.getClass(), "FileTypeNode.createSheet.fileExt.desc"),
135  extensions));
136 
137  return s;
138  }
139 
140  @Override
141  public boolean isLeafTypeNode() {
142  return true;
143  }
144 
148  public static class FileTypeChildFactory extends ChildFactory.Detachable<Content> {
149 
150  private final SleuthkitCase skCase;
151  private final FileTypeExtensionFilters.SearchFilterInterface filter;
152  private final static Logger logger = Logger.getLogger(FileTypeChildFactory.class.getName());
153  private Observable notifier;
154 
155  // use the constructor that gets an observable passed in for updates
156  @Deprecated
157  FileTypeChildFactory(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase) {
158  super();
159  this.filter = filter;
160  this.skCase = skCase;
161  notifier = null;
162  }
163 
171  FileTypeChildFactory(FileTypeExtensionFilters.SearchFilterInterface filter, SleuthkitCase skCase, Observable o) {
172  super();
173  this.filter = filter;
174  this.skCase = skCase;
175  notifier = o;
176  }
177 
178  @Override
179  protected void addNotify() {
180  if (notifier != null) {
181  notifier.addObserver(observer);
182  }
183  }
184 
185  @Override
186  protected void removeNotify() {
187  if (notifier != null) {
188  notifier.deleteObserver(observer);
189  }
190  }
191  private final Observer observer = new FileTypeChildFactoryObserver();
192 
193  // Cause refresh of children if there are changes
194  private class FileTypeChildFactoryObserver implements Observer {
195 
196  @Override
197  public void update(Observable o, Object arg) {
198  refresh(true);
199  }
200  }
201 
207  static long calculateItems(SleuthkitCase sleuthkitCase, FileTypeExtensionFilters.SearchFilterInterface filter) {
208  try {
209  return sleuthkitCase.countFilesWhere(createQuery(filter));
210  } catch (TskCoreException ex) {
211  logger.log(Level.SEVERE, "Error getting file search view count", ex); //NON-NLS
212  return 0;
213  }
214  }
215 
216  @Override
217  protected boolean createKeys(List<Content> list) {
218  try {
219  List<AbstractFile> files = skCase.findAllFilesWhere(createQuery(filter));
220  list.addAll(files);
221  } catch (TskCoreException ex) {
222  logger.log(Level.SEVERE, "Couldn't get search results", ex); //NON-NLS
223  }
224  return true;
225  }
226 
227  private static String createQuery(FileTypeExtensionFilters.SearchFilterInterface filter) {
228  StringBuilder query = new StringBuilder();
229  query.append("(dir_type = ").append(TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue()).append(")"); //NON-NLS
231  query.append(" AND (known IS NULL OR known != ").append(TskData.FileKnown.KNOWN.getFileKnownValue()).append(")"); //NON-NLS
232  }
233  query.append(" AND (NULL"); //NON-NLS
234  for (String s : filter.getFilter()) {
235  query.append(" OR LOWER(name) LIKE LOWER('%").append(s).append("')"); //NON-NLS
236  }
237  query.append(')');
238  return query.toString();
239  }
240 
241  @Override
242  protected Node createNodeForKey(Content key) {
243  return key.accept(new ContentVisitor.Default<AbstractNode>() {
244  @Override
245  public FileNode visit(File f) {
246  return new FileNode(f, false);
247  }
248 
249  @Override
250  public DirectoryNode visit(Directory d) {
251  return new DirectoryNode(d);
252  }
253 
254  @Override
255  public LayoutFileNode visit(LayoutFile lf) {
256  return new LayoutFileNode(lf);
257  }
258 
259  @Override
260  public LocalFileNode visit(DerivedFile df) {
261  return new LocalFileNode(df);
262  }
263 
264  @Override
265  public LocalFileNode visit(LocalFile lf) {
266  return new LocalFileNode(lf);
267  }
268 
269  @Override
270  protected AbstractNode defaultVisit(Content di) {
271  throw new UnsupportedOperationException(NbBundle.getMessage(this.getClass(), "FileTypeChildren.exception.notSupported.msg", di.toString()));
272  }
273  });
274  }
275  }
276 }
static String createQuery(FileTypeExtensionFilters.SearchFilterInterface filter)
final FileTypeExtensionFilters.SearchFilterInterface filter
synchronized static Logger getLogger(String name)
Definition: Logger.java:166

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.