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() {
125 private static final String
NAME = NbBundle.getMessage(
FileSize.class,
"FileSize.fileSizeRootNode.name");
128 super(Children.create(
new FileSizeRootChildren(skCase, datasourceObjId),
true), Lookups.singleton(NAME));
130 super.setDisplayName(NAME);
131 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
141 return visitor.
visit(
this);
146 Sheet sheet = super.createSheet();
147 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
148 if (sheetSet == null) {
149 sheetSet = Sheet.createPropertiesSet();
153 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.name"),
154 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.displayName"),
155 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.name.desc"),
162 return getClass().getName();
169 public static class FileSizeRootChildren extends ChildFactory<org.sleuthkit.autopsy.datamodel.FileSize.FileSizeFilter> {
202 private final PropertyChangeListener
pcl = (PropertyChangeEvent evt) -> {
203 String eventType = evt.getPropertyName();
241 if (evt.getNewValue() == null) {
261 return new FileSizeNode(skCase, key, notifier, datasourceObjId);
275 super(Children.create(
new FileSizeChildren(filter, skCase, null, datasourceObjId),
true), Lookups.singleton(filter.
getDisplayName()));
290 super(Children.create(
new FileSizeChildren(filter, skCase, o, datasourceObjId),
true), Lookups.singleton(filter.
getDisplayName()));
294 o.addObserver(
new FileSizeNodeObserver());
298 super.setName(filter.
getName());
301 this.setShortDescription(tooltip);
302 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-size-16.png");
320 public void update(Observable o, Object arg) {
326 final long numVisibleChildren = FileSizeChildren.calculateItems(skCase, filter, datasourceObjId);
327 super.setDisplayName(filter.
getDisplayName() +
" (" + numVisibleChildren +
")");
332 return visitor.
visit(
this);
337 Sheet sheet = super.createSheet();
338 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
339 if (sheetSet == null) {
340 sheetSet = Sheet.createPropertiesSet();
344 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.name"),
345 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.displayName"),
346 NbBundle.getMessage(
this.getClass(),
"FileSize.createSheet.filterType.desc"),
363 private final SleuthkitCase
skCase;
376 FileSizeChildren(
FileSizeFilter filter, SleuthkitCase skCase, Observable o,
long dsObjId) {
377 super(filter.
getName(),
new ViewsKnownAndSlackFilter<>());
379 this.filter = filter;
381 this.datasourceObjId = dsObjId;
386 protected void onAdd() {
387 if (notifier != null) {
388 notifier.addObserver(observer);
393 protected void onRemove() {
394 if (notifier != null) {
395 notifier.deleteObserver(observer);
399 private final Observer observer =
new FileSizeChildrenObserver();
402 protected List<AbstractFile> makeKeys() {
410 public void update(Observable o, Object arg) {
415 private static String makeQuery(
FileSizeFilter filter,
long filteringDSObjId) {
419 query =
"(size >= 50000000 AND size < 200000000)";
422 query =
"(size >= 200000000 AND size < 1000000000)";
426 query =
"(size >= 1000000000)";
430 throw new IllegalArgumentException(
"Unsupported filter type to get files by size: " + filter);
434 query = query +
" AND (type != " + TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS.getFileType() +
")";
437 if (filteringDSObjId > 0) {
444 private List<AbstractFile> runFsQuery() {
445 List<AbstractFile> ret =
new ArrayList<>();
448 String query = makeQuery(filter, datasourceObjId);
450 ret = skCase.findAllFilesWhere(query);
451 }
catch (Exception e) {
452 logger.log(Level.SEVERE,
"Error getting files for the file size view: " + e.getMessage());
463 static long calculateItems(SleuthkitCase sleuthkitCase, FileSizeFilter filter,
long datasourceObjId) {
465 return sleuthkitCase.countFilesWhere(makeQuery(filter, datasourceObjId));
466 }
catch (TskCoreException ex) {
467 logger.log(Level.SEVERE,
"Error getting files by size search view count", ex);
474 return key.accept(
new ContentVisitor.Default<AbstractNode>() {
475 public FileNode visit(AbstractFile f) {
476 return new FileNode(f, false);
479 public FileNode visit(FsContent f) {
480 return new FileNode(f,
false);
484 public FileNode visit(LayoutFile f) {
485 return new FileNode(f,
false);
489 public FileNode visit(File f) {
490 return new FileNode(f,
false);
494 public FileNode visit(Directory f) {
495 return new FileNode(f,
false);
499 public FileNode visit(LocalFile f) {
500 return new FileNode(f,
false);
504 public FileNode visit(DerivedFile f) {
505 return new FileNode(f,
false);
509 public FileNode visit(VirtualDirectory f) {
510 return new FileNode(f,
false);
514 public FileNode visit(SlackFile f) {
515 return new FileNode(f,
false);
519 protected AbstractNode defaultVisit(Content di) {
520 throw new UnsupportedOperationException(
521 NbBundle.getMessage(
this.getClass(),
522 "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
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)
final long datasourceObjId
final long datasourceObjId
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)
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST