From 0e19f28958c0397ea534c683c7c5f5854036e5a4 Mon Sep 17 00:00:00 2001 From: Brian Sweeney Date: Tue, 13 Mar 2018 21:19:20 -0600 Subject: [PATCH] first pass at reimplementing common search results with CommonSearchNode --- .../commonfilesearch/CommonFilesChildren.java | 6 +- .../commonfilesearch/CommonFilesPanel.java | 8 +-- .../autopsy/datamodel/CommonFileNode.java | 64 ++++++++++++++++++- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesChildren.java b/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesChildren.java index 8a1ceff39c..d3af492fd6 100644 --- a/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesChildren.java +++ b/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesChildren.java @@ -22,9 +22,7 @@ import java.util.List; import org.sleuthkit.datamodel.AbstractFile; import org.openide.nodes.Children; import org.openide.nodes.Node; -import org.sleuthkit.autopsy.datamodel.FileNode; -import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; -import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent; +import org.sleuthkit.autopsy.datamodel.CommonFileNode; /** * Makes nodes for common files search results. @@ -41,7 +39,7 @@ final class CommonFilesChildren extends Children.Keys { Node[] node = new Node[1]; //TODO replace FileNode with our own subclass of its base type or similar (use CommonFileNode once its finished) - node[0] = new DataResultFilterNode(new FileNode(t, false), DirectoryTreeTopComponent.findInstance().getExplorerManager()); + node[0] = new CommonFileNode(t); return node; } } diff --git a/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesPanel.java b/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesPanel.java index 8aad7e3dae..df7f1b37d3 100644 --- a/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/commonfilesearch/CommonFilesPanel.java @@ -23,15 +23,12 @@ import java.awt.event.ActionListener; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.logging.Level; -import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.openide.util.NbBundle; import org.openide.windows.TopComponent; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; -import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.datamodel.AbstractFile; @@ -105,13 +102,10 @@ public final class CommonFilesPanel extends javax.swing.JPanel { CommonFilesSearchNode contentFilesNode = new CommonFilesSearchNode(contentList); - //TODO can use DataResultFilterNode in addition to TableFilterNode - TableFilterNode tableFilterNode = new TableFilterNode(contentFilesNode, true, contentFilesNode.getName()); - TopComponent component = DataResultTopComponent.createInstance( title, pathText, - tableFilterNode, + contentFilesNode, contentList.size()); component.requestActive(); // make it the active top component diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/CommonFileNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/CommonFileNode.java index 28e6db3198..20529b43e2 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/CommonFileNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/CommonFileNode.java @@ -18,22 +18,80 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.util.LinkedHashMap; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; import org.sleuthkit.datamodel.AbstractFile; /** * Encapsulates data being pushed to Common Files component in top right pane. */ public class CommonFileNode extends AbstractNode { + + private final AbstractFile content; public CommonFileNode(AbstractFile fsContent) { super(Children.LEAF); + this.content = fsContent; } @Override - protected Sheet createSheet(){ - return null; //TODO - } + 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); + + final String NO_DESCR = Bundle.AbstractFsContentNode_noDesc_text(); + for (CommonFilePropertyType propType : CommonFilePropertyType.values()) { + final String propString = propType.toString(); + ss.put(new NodeProperty<>(propString, propString, NO_DESCR, map.get(propString))); + } + + // add tags property to the sheet + //addTagProperty(ss); + + return s; + } + + /** + * Fill map with AbstractFile properties + * + * @param map map with preserved ordering, where property names/values + * are put + * @param content The content to get properties for. + */ + static public void fillPropertyMap(Map map, AbstractFile content) { + map.put(CommonFilePropertyType.Name.toString(), content.getName()); + map.put(CommonFilePropertyType.Md5Hash.toString(), StringUtils.defaultString(content.getMd5Hash())); + } + + @NbBundle.Messages({ + "CommonFilePropertyType.nameColLbl=Name", + "CommonFilePropertyType.md5HashColLbl=MD5 Hash"}) + public enum CommonFilePropertyType { + + Name(Bundle.CommonFilePropertyType_nameColLbl()), + Md5Hash(Bundle.CommonFilePropertyType_md5HashColLbl()); + + final private String displayString; + + private CommonFilePropertyType(String displayString){ + this.displayString = displayString; + } + + @Override + public String toString() { + return displayString; + } + } }