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

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.