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);
103 public FileSize(SleuthkitCase skCase,
long dsObjId) {
105 this.filteringDSObjId = dsObjId;
110 return visitor.
visit(
this);
117 long filteringDataSourceObjId() {
126 private static final String
NAME = NbBundle.getMessage(
FileSize.class,
"FileSize.fileSizeRootNode.name");
129 super(Children.create(
new FileSizeRootChildren(skCase, datasourceObjId),
true), Lookups.singleton(NAME));
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> {
178 this.datasourceObjId = datasourceObjId;
205 private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> {
206 String eventType = evt.getPropertyName();
244 if (evt.getNewValue() == null) {
264 return new FileSizeNode(skCase, key, notifier, datasourceObjId);
278 super(Children.create(
new FileSizeChildren(filter, skCase, null, datasourceObjId),
true), Lookups.singleton(filter.
getDisplayName()));
279 this.filter = filter;
280 this.datasourceObjId = datasourceObjId;
294 super(Children.create(
new FileSizeChildren(filter, skCase, o, datasourceObjId),
true), Lookups.singleton(filter.
getDisplayName()));
295 this.filter = filter;
296 this.datasourceObjId = datasourceObjId;
302 super.setName(filter.
getName());
305 this.setShortDescription(tooltip);
306 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
324 public void update(Observable o, Object arg) {
330 final long numVisibleChildren = FileSizeChildren.calculateItems(skCase, filter, datasourceObjId);
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"),
368 private final SleuthkitCase
skCase;
370 private final Observable notifier;
371 private final long datasourceObjId;
380 FileSizeChildren(
FileSizeFilter filter, SleuthkitCase skCase, Observable o,
long dsObjId) {
381 super(filter.
getName(),
new ViewsKnownAndSlackFilter<>());
383 this.filter = filter;
385 this.datasourceObjId = dsObjId;
390 protected void onAdd() {
391 if (notifier != null) {
392 notifier.addObserver(observer);
397 protected void onRemove() {
398 if (notifier != null) {
399 notifier.deleteObserver(observer);
403 private final Observer observer =
new FileSizeChildrenObserver();
406 protected List<AbstractFile> makeKeys() {
414 public void update(Observable o, Object arg) {
419 private static String makeQuery(
FileSizeFilter filter,
long filteringDSObjId) {
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() +
")";
441 if (filteringDSObjId > 0) {
448 private List<AbstractFile> runFsQuery() {
449 List<AbstractFile> ret =
new ArrayList<>();
452 String query = makeQuery(filter, datasourceObjId);
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) {
469 return sleuthkitCase.countFilesWhere(makeQuery(filter, 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) {
488 public FileNode visit(LayoutFile f) {
498 public FileNode visit(Directory f) {
503 public FileNode visit(LocalFile f) {
508 public FileNode visit(DerivedFile f) {
513 public FileNode visit(VirtualDirectory f) {
518 public FileNode visit(SlackFile f) {
523 protected AbstractNode defaultVisit(Content di) {
524 throw new UnsupportedOperationException(
525 NbBundle.getMessage(
this.getClass(),
526 "FileSize.exception.notSupported.msg",
void update(Observable o, Object arg)
FileSize(SleuthkitCase skCase)
void removeIngestModuleEventListener(final PropertyChangeListener listener)
SleuthkitCase getSleuthkitCase()
static synchronized IngestManager getInstance()
FileSizeRootChildren(SleuthkitCase skCase, long datasourceObjId)
final long filteringDSObjId
void removeIngestJobEventListener(final PropertyChangeListener listener)
boolean createKeys(List< FileSizeFilter > list)
Node createNodeForKey(FileSizeFilter key)
void addIngestJobEventListener(final PropertyChangeListener listener)
final long datasourceObjId
final long datasourceObjId
final FileSizeFilter filter
T visit(DataSourceFilesNode in)
FileSize(SleuthkitCase skCase, long dsObjId)
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)