19package org.sleuthkit.autopsy.datamodel;
21import java.beans.PropertyChangeEvent;
22import java.beans.PropertyChangeListener;
23import java.util.ArrayList;
24import java.util.Arrays;
25import java.util.EnumSet;
27import java.util.Observable;
28import java.util.Observer;
30import java.util.logging.Level;
31import org.openide.nodes.AbstractNode;
32import org.openide.nodes.ChildFactory;
33import org.openide.nodes.Children;
34import org.openide.nodes.Node;
35import org.openide.nodes.Sheet;
36import org.openide.util.NbBundle;
37import org.openide.util.lookup.Lookups;
38import org.sleuthkit.autopsy.casemodule.Case;
39import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
40import org.sleuthkit.autopsy.coreutils.Logger;
41import org.sleuthkit.autopsy.ingest.IngestManager;
42import org.sleuthkit.datamodel.AbstractFile;
43import org.sleuthkit.datamodel.Content;
44import org.sleuthkit.datamodel.ContentVisitor;
45import org.sleuthkit.datamodel.DerivedFile;
46import org.sleuthkit.datamodel.Directory;
47import org.sleuthkit.datamodel.File;
48import org.sleuthkit.datamodel.FsContent;
49import org.sleuthkit.datamodel.LayoutFile;
50import org.sleuthkit.datamodel.LocalFile;
51import org.sleuthkit.datamodel.SlackFile;
52import org.sleuthkit.datamodel.SleuthkitCase;
53import org.sleuthkit.datamodel.TskCoreException;
54import org.sleuthkit.datamodel.TskData;
55import org.sleuthkit.datamodel.VirtualDirectory;
90 return this.displayName;
95 return visitor.
visit(
this);
105 this.filteringDSObjId = dsObjId;
110 return visitor.
visit(
this);
117 long filteringDataSourceObjId() {
118 return this.filteringDSObjId;
126 private static final String
NAME = NbBundle.getMessage(
FileSize.class,
"FileSize.fileSizeRootNode.name");
128 FileSizeRootNode(SleuthkitCase
skCase,
long datasourceObjId) {
131 super.setDisplayName(
NAME);
132 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
142 return visitor.
visit(
this);
147 Sheet sheet = super.createSheet();
148 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
149 if (sheetSet ==
null) {
150 sheetSet = Sheet.createPropertiesSet();
154 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.name"),
155 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.displayName"),
156 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.desc"),
163 return getClass().getName();
170 public static class FileSizeRootChildren extends ChildFactory<org.sleuthkit.autopsy.datamodel.FileSize.FileSizeFilter> {
186 private static final class FileSizeRootChildrenObservable
extends Observable {
192 FileSizeRootChildrenObservable() {
205 private final PropertyChangeListener
pcl = (PropertyChangeEvent evt) -> {
206 String eventType = evt.getPropertyName();
244 if (evt.getNewValue() ==
null) {
298 o.addObserver(
new FileSizeNodeObserver());
302 super.setName(
filter.getName());
304 String tooltip =
filter.getDisplayName();
305 this.setShortDescription(tooltip);
306 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
324 public void update(Observable o, Object arg) {
331 super.setDisplayName(
filter.getDisplayName() +
" (" + numVisibleChildren +
")");
336 return visitor.
visit(
this);
341 Sheet sheet = super.createSheet();
342 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
343 if (sheetSet ==
null) {
344 sheetSet = Sheet.createPropertiesSet();
348 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.name"),
349 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.displayName"),
350 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.desc"),
351 filter.getDisplayName()));
368 private final SleuthkitCase
skCase;
381 super(
filter.getName(),
new ViewsKnownAndSlackFilter<>());
385 this.datasourceObjId = dsObjId;
390 protected void onAdd() {
403 private final Observer observer =
new FileSizeChildrenObserver();
406 protected List<AbstractFile>
makeKeys() {
414 public void update(Observable o, Object arg) {
423 query =
"(size >= 50000000 AND size < 200000000)";
426 query =
"(size >= 200000000 AND size < 1000000000)";
430 query =
"(size >= 1000000000)";
434 throw new IllegalArgumentException(
"Unsupported filter type to get files by size: " +
filter);
438 query = query +
" AND (type != " + TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS.getFileType() +
")";
448 private List<AbstractFile> runFsQuery() {
449 List<AbstractFile> ret =
new ArrayList<>();
454 ret =
skCase.findAllFilesWhere(query);
455 }
catch (Exception e) {
456 logger.log(Level.SEVERE,
"Error getting files for the file size view: " + e.getMessage());
467 static long calculateItems(SleuthkitCase sleuthkitCase, FileSizeFilter
filter,
long datasourceObjId) {
470 }
catch (TskCoreException ex) {
471 logger.log(Level.SEVERE,
"Error getting files by size search view count", ex);
477 protected Node createNodeForKey(AbstractFile key) {
478 return key.accept(
new ContentVisitor.Default<AbstractNode>() {
479 public FileNode visit(AbstractFile f) {
480 return new FileNode(f, false);
483 public FileNode visit(FsContent f) {
484 return new FileNode(f,
false);
488 public FileNode visit(LayoutFile f) {
489 return new FileNode(f,
false);
493 public FileNode visit(File f) {
494 return new FileNode(f,
false);
498 public FileNode visit(Directory f) {
499 return new FileNode(f,
false);
503 public FileNode visit(LocalFile f) {
504 return new FileNode(f,
false);
508 public FileNode visit(DerivedFile f) {
509 return new FileNode(f,
false);
513 public FileNode visit(VirtualDirectory f) {
514 return new FileNode(f,
false);
518 public FileNode visit(SlackFile f) {
519 return new FileNode(f,
false);
523 protected AbstractNode defaultVisit(Content di) {
524 throw new UnsupportedOperationException(
525 NbBundle.getMessage(
this.getClass(),
526 "FileSize.exception.notSupported.msg",
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
synchronized static Logger getLogger(String name)
static final Logger logger
abstract List< T > makeKeys()
DisplayableItemNode(Children children)
final long datasourceObjId
final FileSizeFilter filter
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST
static final Set< IngestManager.IngestModuleEvent > INGEST_MODULE_EVENTS_OF_INTEREST
final PropertyChangeListener pcl
static final Set< IngestManager.IngestJobEvent > INGEST_JOB_EVENTS_OF_INTEREST
void update(Observable o, Object arg)
void update(Observable o, Object arg)
FileSizeRootChildren(SleuthkitCase skCase, long datasourceObjId)
boolean createKeys(List< FileSizeFilter > list)
final long datasourceObjId
Node createNodeForKey(FileSizeFilter key)
FileSize(SleuthkitCase skCase, long dsObjId)
FileSize(SleuthkitCase skCase)
final long filteringDSObjId
SleuthkitCase getSleuthkitCase()
static synchronized IngestManager getInstance()
void removeIngestModuleEventListener(final PropertyChangeListener listener)
void removeIngestJobEventListener(final PropertyChangeListener listener)
void addIngestModuleEventListener(final PropertyChangeListener listener)
void addIngestJobEventListener(final PropertyChangeListener listener)
public< T > T accept(AutopsyItemVisitor< T > visitor)
FileSizeFilter(int id, String name, String displayName)
T visit(DataSourceFilesNode in)