19 package org.sleuthkit.autopsy.datamodel;
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.EnumSet;
26 import java.util.List;
27 import java.util.Observable;
28 import java.util.Observer;
30 import java.util.logging.Level;
31 import org.openide.nodes.AbstractNode;
32 import org.openide.nodes.ChildFactory;
33 import org.openide.nodes.Children;
34 import org.openide.nodes.Node;
35 import org.openide.nodes.Sheet;
36 import org.openide.util.NbBundle;
37 import org.openide.util.lookup.Lookups;
77 this.displayName = displayName;
90 return this.displayName;
95 return visitor.
visit(
this);
105 return visitor.
visit(
this);
117 private static final String
NAME = NbBundle.getMessage(
FileSize.class,
"FileSize.fileSizeRootNode.name");
122 super.setDisplayName(NAME);
123 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
133 return visitor.
visit(
this);
138 Sheet sheet = super.createSheet();
139 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
140 if (sheetSet == null) {
141 sheetSet = Sheet.createPropertiesSet();
145 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.name"),
146 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.displayName"),
147 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.desc"),
154 return getClass().getName();
161 public static class FileSizeRootChildren extends ChildFactory<org.sleuthkit.autopsy.datamodel.FileSize.FileSizeFilter> {
192 private final PropertyChangeListener
pcl = (PropertyChangeEvent evt) -> {
193 String eventType = evt.getPropertyName();
231 if (evt.getNewValue() == null) {
264 super(Children.create(
new FileSizeChildren(filter, skCase, null),
true), Lookups.singleton(filter.
getDisplayName()));
277 super(Children.create(
new FileSizeChildren(filter, skCase, o),
true), Lookups.singleton(filter.
getDisplayName()));
280 o.addObserver(
new FileSizeNodeObserver());
284 super.setName(filter.
getName());
287 this.setShortDescription(tooltip);
288 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
306 public void update(Observable o, Object arg) {
312 final long numVisibleChildren = FileSizeChildren.calculateItems(skCase, filter);
313 super.setDisplayName(filter.
getDisplayName() +
" (" + numVisibleChildren +
")");
318 return visitor.
visit(
this);
323 Sheet sheet = super.createSheet();
324 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
325 if (sheetSet == null) {
326 sheetSet = Sheet.createPropertiesSet();
330 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.name"),
331 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.displayName"),
332 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.desc"),
347 static class FileSizeChildren
extends ChildFactory.Detachable<AbstractFile> {
349 private final SleuthkitCase
skCase;
361 FileSizeChildren(
FileSizeFilter filter, SleuthkitCase skCase, Observable o) {
363 this.filter = filter;
368 protected void addNotify() {
369 if (notifier != null) {
370 notifier.addObserver(observer);
375 protected void removeNotify() {
376 if (notifier != null) {
377 notifier.deleteObserver(observer);
381 private final Observer observer =
new FileSizeChildrenObserver();
387 public void update(Observable o, Object arg) {
393 protected boolean createKeys(List<AbstractFile> list) {
394 list.addAll(runFsQuery());
402 query =
"(size >= 50000000 AND size < 200000000)";
405 query =
"(size >= 200000000 AND size < 1000000000)";
409 query =
"(size >= 1000000000)";
413 throw new IllegalArgumentException(
"Unsupported filter type to get files by size: " + filter);
417 query = query +
" AND (type != " + TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS.getFileType() +
")";
421 query +=
" AND (known != " + TskData.FileKnown.KNOWN.getFileKnownValue()
422 +
" OR known IS NULL)";
426 if(UserPreferences.hideSlackFilesInViewsTree()) {
427 query +=
" AND (type != " + TskData.TSK_DB_FILES_TYPE_ENUM.SLACK.getFileType() +
")";
433 private List<AbstractFile> runFsQuery() {
434 List<AbstractFile> ret =
new ArrayList<>();
437 String query = makeQuery(filter);
439 ret = skCase.findAllFilesWhere(query);
440 }
catch (Exception e) {
441 logger.log(Level.SEVERE,
"Error getting files for the file size view: " + e.getMessage());
452 static long calculateItems(SleuthkitCase sleuthkitCase, FileSizeFilter filter) {
454 return sleuthkitCase.countFilesWhere(makeQuery(filter));
455 }
catch (TskCoreException ex) {
456 logger.log(Level.SEVERE,
"Error getting files by size search view count", ex);
463 return key.accept(
new ContentVisitor.Default<AbstractNode>() {
464 public FileNode visit(AbstractFile f) {
465 return new FileNode(f, false);
468 public FileNode visit(FsContent f) {
469 return new FileNode(f,
false);
473 public FileNode visit(LayoutFile f) {
474 return new FileNode(f,
false);
478 public FileNode visit(File f) {
479 return new FileNode(f,
false);
483 public FileNode visit(Directory f) {
484 return new FileNode(f,
false);
488 public FileNode visit(LocalFile f) {
489 return new FileNode(f,
false);
493 public FileNode visit(DerivedFile f) {
494 return new FileNode(f,
false);
498 public FileNode visit(VirtualDirectory f) {
499 return new FileNode(f,
false);
503 public FileNode visit(SlackFile f) {
504 return new FileNode(f,
false);
508 protected AbstractNode defaultVisit(Content di) {
509 throw new UnsupportedOperationException(
510 NbBundle.getMessage(
this.getClass(),
511 "FileSize.exception.notSupported.msg",
void update(Observable o, Object arg)
FileSize(SleuthkitCase skCase)
void removeIngestModuleEventListener(final PropertyChangeListener listener)
SleuthkitCase getSleuthkitCase()
static synchronized IngestManager getInstance()
static boolean hideKnownFilesInViewsTree()
T visit(DataSourcesNode in)
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< FileSizeFilter > list)
Node createNodeForKey(FileSizeFilter key)
final PropertyChangeListener pcl
void addIngestJobEventListener(final PropertyChangeListener listener)
FileSizeFilter(int id, String name, String displayName)
void addIngestModuleEventListener(final PropertyChangeListener listener)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
void update(Observable o, Object arg)
public< T > T accept(AutopsyItemVisitor< T > visitor)
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
FileSizeRootChildren(SleuthkitCase skCase)
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST