Conflicts:
	Core/src/org/sleuthkit/autopsy/corecomponents/DataResultPanel.java
This commit is contained in:
Jeff Wallace 2013-09-23 09:51:13 -04:00
commit 9907bbce00
6 changed files with 141 additions and 25 deletions

View File

@ -30,6 +30,10 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeListener;
import org.openide.nodes.NodeMemberEvent;
import org.openide.nodes.NodeReorderEvent;
import org.openide.util.Lookup; import org.openide.util.Lookup;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
@ -59,6 +63,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
private DataContent customContentViewer; private DataContent customContentViewer;
private boolean isMain; private boolean isMain;
private String title; private String title;
private final DummyNodeListener dummyNodeListener = new DummyNodeListener();
private static final Logger logger = Logger.getLogger(DataResultPanel.class.getName() ); private static final Logger logger = Logger.getLogger(DataResultPanel.class.getName() );
private boolean listeningToTabbedPane = false; private boolean listeningToTabbedPane = false;
@ -347,9 +352,18 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
listeningToTabbedPane = true; listeningToTabbedPane = true;
} }
if (this.rootNode != null) {
this.rootNode.removeNodeListener(dummyNodeListener);
}
this.rootNode = selectedNode; this.rootNode = selectedNode;
if (this.rootNode != null) {
this.rootNode.addNodeListener(dummyNodeListener);
}
setupTabs(selectedNode);
if (selectedNode != null) { if (selectedNode != null) {
int childrenCount = selectedNode.getChildren().getNodesCount(true); int childrenCount = selectedNode.getChildren().getNodesCount();
this.numberMatchLabel.setText(Integer.toString(childrenCount)); this.numberMatchLabel.setText(Integer.toString(childrenCount));
} }
this.numberMatchLabel.setVisible(true); this.numberMatchLabel.setVisible(true);
@ -357,6 +371,15 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
resetTabs(selectedNode); resetTabs(selectedNode);
// set the display on the current active tab
int currentActiveTab = this.dataResultTabbedPanel.getSelectedIndex();
if (currentActiveTab != -1) {
UpdateWrapper drv = viewers.get(currentActiveTab);
drv.setNode(selectedNode);
}
}
private void setupTabs(Node selectedNode) {
//update/disable tabs based on if supported for this node //update/disable tabs based on if supported for this node
int drvC = 0; int drvC = 0;
for (UpdateWrapper drv : viewers) { for (UpdateWrapper drv : viewers) {
@ -579,4 +602,28 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
public void setNumMatches(int numMatches) { public void setNumMatches(int numMatches) {
this.numberMatchLabel.setText(Integer.toString(numMatches)); this.numberMatchLabel.setText(Integer.toString(numMatches));
} }
private class DummyNodeListener implements NodeListener {
@Override
public void childrenAdded(NodeMemberEvent nme) {
setupTabs(nme.getNode());
}
@Override
public void childrenRemoved(NodeMemberEvent nme) {
}
@Override
public void childrenReordered(NodeReorderEvent nre) {
}
@Override
public void nodeDestroyed(NodeEvent ne) {
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
}
}
} }

View File

@ -22,14 +22,17 @@ import java.awt.Cursor;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.dnd.DnDConstants; import java.awt.dnd.DnDConstants;
import java.beans.PropertyChangeEvent;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.ListSelectionModel; import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import org.netbeans.swing.outline.DefaultOutlineModel; import org.netbeans.swing.outline.DefaultOutlineModel;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
import org.openide.explorer.view.OutlineView; import org.openide.explorer.view.OutlineView;
@ -38,6 +41,10 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.nodes.Node.Property; import org.openide.nodes.Node.Property;
import org.openide.nodes.Node.PropertySet; import org.openide.nodes.Node.PropertySet;
import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeListener;
import org.openide.nodes.NodeMemberEvent;
import org.openide.nodes.NodeReorderEvent;
import org.openide.nodes.Sheet; import org.openide.nodes.Sheet;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
@ -53,6 +60,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
private String firstColumnLabel = "Name"; private String firstColumnLabel = "Name";
private Set<Property> propertiesAcc = new LinkedHashSet<>(); private Set<Property> propertiesAcc = new LinkedHashSet<>();
private static final Logger logger = Logger.getLogger(DataResultViewerTable.class.getName()); private static final Logger logger = Logger.getLogger(DataResultViewerTable.class.getName());
private final DummyNodeListener dummyNodeListener = new DummyNodeListener();
/** /**
* Creates a DataResultViewerTable object that is compatible with node * Creates a DataResultViewerTable object that is compatible with node
@ -241,11 +249,38 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
hasChildren = selectedNode.getChildren().getNodesCount() > 0; hasChildren = selectedNode.getChildren().getNodesCount() > 0;
} }
Node oldNode = this.em.getRootContext();
if (oldNode != null) {
oldNode.removeNodeListener(dummyNodeListener);
}
// if there's no selection node, do nothing // if there's no selection node, do nothing
if (hasChildren) { if (hasChildren) {
Node root = selectedNode; Node root = selectedNode;
root.addNodeListener(dummyNodeListener);
setupTable(root);
} else {
final OutlineView ov = ((OutlineView) this.tableScrollPanel);
Node emptyNode = new AbstractNode(Children.LEAF);
em.setRootContext(emptyNode); // make empty node
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
ov.setPropertyColumns(); // set the empty property header
}
} finally {
this.setCursor(null);
}
}
/**
* Create Column Headers based on the Content represented by the Nodes in
* the table.
*
* @param root The parent Node of the ContentNodes
*/
private void setupTable(final Node root) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//wrap to filter out children //wrap to filter out children
//note: this breaks the tree view mode in this generic viewer, //note: this breaks the tree view mode in this generic viewer,
//so wrap nodes earlier if want 1 level view //so wrap nodes earlier if want 1 level view
@ -256,11 +291,11 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
em.setRootContext(root); em.setRootContext(root);
final OutlineView ov = ((OutlineView) this.tableScrollPanel); final OutlineView ov = ((OutlineView) DataResultViewerTable.this.tableScrollPanel);
propertiesAcc.clear(); propertiesAcc.clear();
this.getAllChildPropertyHeadersRec(selectedNode, 100); DataResultViewerTable.this.getAllChildPropertyHeadersRec(root, 100);
List<Node.Property> props = new ArrayList<Node.Property>(propertiesAcc); List<Node.Property> props = new ArrayList<Node.Property>(propertiesAcc);
if (props.size() > 0) { if (props.size() > 0) {
Node.Property prop = props.remove(0); Node.Property prop = props.remove(0);
@ -310,7 +345,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
// get first 100 rows values for the table // get first 100 rows values for the table
Object[][] content = null; Object[][] content = null;
content = getRowValues(selectedNode, 100); content = getRowValues(root, 100);
if (content != null) { if (content != null) {
@ -336,17 +371,8 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
// turn on the auto resize // turn on the auto resize
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
} }
} else {
final OutlineView ov = ((OutlineView) this.tableScrollPanel);
Node emptyNode = new AbstractNode(Children.LEAF);
em.setRootContext(emptyNode); // make empty node
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
ov.setPropertyColumns(); // set the empty property header
}
} finally {
this.setCursor(null);
} }
});
} }
private static Object[][] getRowValues(Node node, int rows) { private static Object[][] getRowValues(Node node, int rows) {
@ -449,4 +475,38 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
super.clearComponent(); super.clearComponent();
} }
private class DummyNodeListener implements NodeListener {
private static final String DUMMY_NODE_DISPLAY_NAME = "Please Wait...";
@Override
public void childrenAdded(NodeMemberEvent nme) {
}
@Override
public void childrenRemoved(NodeMemberEvent nme) {
Node removed = nme.getDelta()[0];
if (! removed.getDisplayName().equals(DUMMY_NODE_DISPLAY_NAME)) {
// If it's not the dummy waiting node, we don't want
// to reload the table headers
return;
}
// dummy node removed. Reset the table headers.
Node node = nme.getNode();
setupTable(node);
}
@Override
public void childrenReordered(NodeReorderEvent nre) {
}
@Override
public void nodeDestroyed(NodeEvent ne) {
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
}
}
} }

View File

@ -214,6 +214,8 @@ public class DeletedContent implements AutopsyVisitableItem {
private DeletedContent.DeletedContentFilter filter; private DeletedContent.DeletedContentFilter filter;
private final Logger logger = Logger.getLogger(DeletedContentChildren.class.getName()); private final Logger logger = Logger.getLogger(DeletedContentChildren.class.getName());
private static final int MAX_OBJECTS = 2000;
DeletedContentChildren(DeletedContent.DeletedContentFilter filter, SleuthkitCase skCase) { DeletedContentChildren(DeletedContent.DeletedContentFilter filter, SleuthkitCase skCase) {
this.skCase = skCase; this.skCase = skCase;
this.filter = filter; this.filter = filter;
@ -258,6 +260,7 @@ public class DeletedContent implements AutopsyVisitableItem {
} }
query += " LIMIT " + MAX_OBJECTS;
return query; return query;
} }

View File

@ -58,7 +58,6 @@ class FileTypeChildren extends ChildFactory<Content> {
return true; return true;
} }
private String createQuery(){ private String createQuery(){
String query = "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() + ")" String query = "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() + ")"
+ " AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() + ") AND (0"; + " AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() + ") AND (0";
@ -66,7 +65,7 @@ class FileTypeChildren extends ChildFactory<Content> {
query += " OR name LIKE '%" + s + "'"; query += " OR name LIKE '%" + s + "'";
} }
query += ')'; query += ')';
//query += " LIMIT " + MAX_OBJECTS; // query += " LIMIT " + MAX_OBJECTS;
return query; return query;
} }
@ -74,10 +73,7 @@ class FileTypeChildren extends ChildFactory<Content> {
private List<AbstractFile> runQuery(){ private List<AbstractFile> runQuery(){
List<AbstractFile> list = new ArrayList<>(); List<AbstractFile> list = new ArrayList<>();
try { try {
List<AbstractFile> res = skCase.findAllFilesWhere(createQuery()); list = skCase.findAllFilesWhere(createQuery());
for(AbstractFile c : res){
list.add(c);
}
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Couldn't get search results", ex); logger.log(Level.SEVERE, "Couldn't get search results", ex);
} }

View File

@ -27,6 +27,17 @@
<condition property="jre.home.64"> <condition property="jre.home.64">
<isset property="env.JRE_HOME_64"/> <isset property="env.JRE_HOME_64"/>
</condition> </condition>
<!-- Update configuration file to include jre -->
<property name="inst.property.file" value="${inst-path}/etc/${app.name}.conf" />
<property name="jvm.options" value="&quot;--branding ${app.name} -J-Xms24m -J-Xmx512m -J-XX:MaxPermSize=128M -J-Xverify:none -J-Xdock:name=${app.title}&quot;" />
<propertyfile file="${inst.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
<entry key="default_options" value="@JVM_OPTIONS" />
<entry key="jdkhome" value="&quot;jre7&quot;" />
</propertyfile>
<!-- workaround for ant escaping : and = when setting properties -->
<replace file="${inst.property.file}" token="@JVM_OPTIONS" value="${jvm.options}" />
</target> </target>
<target name="autoAIPath" description="Attempt to find the AI path based on standard installation location"> <target name="autoAIPath" description="Attempt to find the AI path based on standard installation location">
@ -174,7 +185,7 @@
<arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\bin -install_operation CreateUpdate -behavior Append -system_variable"/> <arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\bin -install_operation CreateUpdate -behavior Append -system_variable"/>
</exec> </exec>
<exec executable="${ai-exe-path}"> <exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\lib\gstreamer-0.10 -install_operation CreateUpdate -behavior Append -system_variable"/> <arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\lib -install_operation CreateUpdate -behavior Append -system_variable"/>
</exec> </exec>
<exec executable="${ai-exe-path}"> <exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /NewEnvironment -name PATH -value %GSTREAMER_PATH% -install_operation CreateUpdate -behavior Append -system_variable"/> <arg line="/edit ${aip-path} /NewEnvironment -name PATH -value %GSTREAMER_PATH% -install_operation CreateUpdate -behavior Append -system_variable"/>

View File

@ -78,7 +78,6 @@
<propertyfile file="${app.property.file}"> <propertyfile file="${app.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties --> <!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
<entry key="default_options" value="@JVM_OPTIONS" /> <entry key="default_options" value="@JVM_OPTIONS" />
<entry key="jdkhome" value="&quot;jre7&quot;" />
</propertyfile> </propertyfile>
<!-- workaround for ant escaping : and = when setting properties --> <!-- workaround for ant escaping : and = when setting properties -->
<replace file="${app.property.file}" token="@JVM_OPTIONS" value="${jvm.options}" /> <replace file="${app.property.file}" token="@JVM_OPTIONS" value="${jvm.options}" />