From 7c1a2ad4c8cc455a2ba0145b96cbddf3f659bcb9 Mon Sep 17 00:00:00 2001 From: adam-m Date: Tue, 29 Jan 2013 14:53:58 -0500 Subject: [PATCH] initial datamodel node support for derived file. Add comments what to change after sleuthkit datamodel refactor. --- .../datamodel/AbstractFsContentNode.java | 2 + .../autopsy/datamodel/ContentNodeVisitor.java | 7 ++ .../autopsy/datamodel/DerivedFileNode.java | 91 +++++++++++++++++++ .../datamodel/DisplayableItemNodeVisitor.java | 12 ++- .../sleuthkit/autopsy/datamodel/FileNode.java | 17 ++-- 5 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/DerivedFileNode.java diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java index 8c0d476d3b..e28c5b8e68 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java @@ -29,6 +29,8 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Abstract class that implements the commonality between File and Directory * Nodes (same properties). + * + * TODO type bounds should be T extends AbstractFile after fields/methods are factored up to AbstractFile */ public abstract class AbstractFsContentNode extends AbstractAbstractFileNode { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java index 03931e9591..46eaf6ced9 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java @@ -34,6 +34,8 @@ public interface ContentNodeVisitor { T visit(LayoutFileNode lcn); + T visit(DerivedFileNode dfn); + T visit(VirtualDirectoryNode lcn); /** @@ -75,6 +77,11 @@ public interface ContentNodeVisitor { return defaultVisit(lcn); } + @Override + public T visit(DerivedFileNode dfn) { + return defaultVisit(dfn); + } + @Override public T visit(VirtualDirectoryNode ldn) { return defaultVisit(ldn); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DerivedFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DerivedFileNode.java new file mode 100644 index 0000000000..4466c5e5c6 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DerivedFileNode.java @@ -0,0 +1,91 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.datamodel; + +import java.util.LinkedHashMap; +import java.util.Map; +import org.openide.nodes.Sheet; +import org.sleuthkit.datamodel.DerivedFile; +import org.sleuthkit.datamodel.LayoutFile; + +/** + * A Node for a DerivedFile content object. + * + * TODO should be able to extend FileNode after FileNode extends AbstractFsContentNode + */ +public class DerivedFileNode extends AbstractAbstractFileNode { + + public static enum DerivedFilePropertyType { + + NAME { + @Override + public String toString() { + return "Name"; + } + }, + SIZE { + @Override + public String toString() { + return "Size"; + } + }, + + } + + public static String nameForLayoutFile(LayoutFile lf) { + return lf.getName(); + } + + public DerivedFileNode(DerivedFile df) { + super(df); + + this.setDisplayName(df.getName()); + this.setIconBaseWithExtension(FileNode.getIconForFileType(df)); + } + + @Override + public TYPE getDisplayableItemNodeType() { + return TYPE.CONTENT; + } + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + Sheet.Set ss = s.get(Sheet.PROPERTIES); + if (ss == null) { + ss = Sheet.createPropertiesSet(); + s.put(ss); + } + + Map map = new LinkedHashMap(); + fillPropertyMap(map, content); + + ss.put(new NodeProperty("Name", "Name", "no description", getName())); + + final String NO_DESCR = "no description"; + for (Map.Entry entry : map.entrySet()) { + ss.put(new NodeProperty(entry.getKey(), entry.getKey(), NO_DESCR, entry.getValue())); + } + // @@@ add more properties here... + + return s; + } + + @Override + public T accept(ContentNodeVisitor v) { + return v.visit(this); + } + + @Override + public T accept(DisplayableItemNodeVisitor v) { + return v.visit(this); + } + + //TODO add more + private static void fillPropertyMap(Map map, DerivedFile content) { + map.put(DerivedFilePropertyType.NAME.toString(), content.getName()); + map.put(DerivedFilePropertyType.SIZE.toString(), content.getSize()); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java index 8789a0bf59..d85f289c22 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java @@ -60,7 +60,8 @@ public interface DisplayableItemNodeVisitor { T visit(ViewsNode vn); T visit(ResultsNode rn); T visit(ImagesNode in); - T visit(LayoutFileNode lcn); + T visit(LayoutFileNode lfn); + T visit(DerivedFileNode dfn); T visit(VirtualDirectoryNode ldn); /** @@ -188,8 +189,13 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(LayoutFileNode lcn) { - return defaultVisit(lcn); + public T visit(LayoutFileNode lfn) { + return defaultVisit(lfn); + } + + @Override + public T visit(DerivedFileNode dfn) { + return defaultVisit(dfn); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java index c67965b68c..07221659af 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileNode.java @@ -19,23 +19,26 @@ package org.sleuthkit.autopsy.datamodel; import javax.swing.Action; -import org.sleuthkit.datamodel.File; +import org.sleuthkit.datamodel.AbstractFile; +import org.sleuthkit.datamodel.FsContent; import org.sleuthkit.datamodel.TskData.TSK_FS_NAME_FLAG_ENUM; /** - * This class is used to represent the "Node" for the file. It has no children. + * This class is used to represent the "Node" for the file. + * It may have derived files children. * + * TODO should extend AbstractFsContentNode after FsContent fields are moved up */ -public class FileNode extends AbstractFsContentNode { +public class FileNode extends AbstractFsContentNode { /** * @param file underlying Content */ - public FileNode(File file) { + public FileNode(FsContent file) { this(file, true); } - public FileNode(File file, boolean directoryBrowseMode) { + public FileNode(FsContent file, boolean directoryBrowseMode) { super(file, directoryBrowseMode); // set name, display name, and icon @@ -69,7 +72,7 @@ public class FileNode extends AbstractFsContentNode { // Given a file, returns the correct icon for said // file based off it's extension - static String getIconForFileType(File file) { + static String getIconForFileType(AbstractFile file) { // Get the name, extension String name = file.getName(); int dotIndex = name.lastIndexOf("."); @@ -138,7 +141,7 @@ public class FileNode extends AbstractFsContentNode { @Override public boolean isLeafTypeNode() { - return true; + return false; }