diff --git a/Example/build.xml b/Example/build.xml
new file mode 100644
index 0000000000..066cace4ee
--- /dev/null
+++ b/Example/build.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+ Builds, tests, and runs the project org.sleuthkit.autopsy.example.
+
+
diff --git a/Example/build/classes/META-INF/services/org.sleuthkit.autopsy.corecomponentinterfaces.DataExplorer b/Example/build/classes/META-INF/services/org.sleuthkit.autopsy.corecomponentinterfaces.DataExplorer
new file mode 100644
index 0000000000..82bea797ae
--- /dev/null
+++ b/Example/build/classes/META-INF/services/org.sleuthkit.autopsy.corecomponentinterfaces.DataExplorer
@@ -0,0 +1 @@
+org.sleuthkit.autopsy.example.ExampleDataExplorer
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/Bundle.properties b/Example/build/classes/org/sleuthkit/autopsy/example/Bundle.properties
new file mode 100644
index 0000000000..3bba77cab7
--- /dev/null
+++ b/Example/build/classes/org/sleuthkit/autopsy/example/Bundle.properties
@@ -0,0 +1,2 @@
+OpenIDE-Module-Name=Example
+ExampleTopComponent.makeNodesButton.text=Make Nodes
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/ExampleDataExplorer.class b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleDataExplorer.class
new file mode 100644
index 0000000000..96b9c07cf0
Binary files /dev/null and b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleDataExplorer.class differ
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.class b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.class
new file mode 100644
index 0000000000..6efdcf2936
Binary files /dev/null and b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.class differ
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/ExampleModel.class b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleModel.class
new file mode 100644
index 0000000000..207e180d44
Binary files /dev/null and b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleModel.class differ
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent$1.class b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent$1.class
new file mode 100644
index 0000000000..b1b74e1999
Binary files /dev/null and b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent$1.class differ
diff --git a/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent.class b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent.class
new file mode 100644
index 0000000000..808349eab9
Binary files /dev/null and b/Example/build/classes/org/sleuthkit/autopsy/example/ExampleTopComponent.class differ
diff --git a/Example/build/no-license.txt b/Example/build/no-license.txt
new file mode 100644
index 0000000000..201dea1e15
--- /dev/null
+++ b/Example/build/no-license.txt
@@ -0,0 +1 @@
+[NO LICENSE SPECIFIED]
\ No newline at end of file
diff --git a/Example/manifest.mf b/Example/manifest.mf
new file mode 100644
index 0000000000..140ad66bd3
--- /dev/null
+++ b/Example/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: org.sleuthkit.autopsy.example
+OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/example/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
diff --git a/Example/nbproject/build-impl.xml b/Example/nbproject/build-impl.xml
new file mode 100644
index 0000000000..e4ea4bdebf
--- /dev/null
+++ b/Example/nbproject/build-impl.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ You must set 'suite.dir' to point to your containing module suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Example/nbproject/genfiles.properties b/Example/nbproject/genfiles.properties
new file mode 100644
index 0000000000..ec4f808a44
--- /dev/null
+++ b/Example/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=9a4a6521
+build.xml.script.CRC32=8c5f554c
+build.xml.stylesheet.CRC32=a56c6a5b@1.46.2
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=9a4a6521
+nbproject/build-impl.xml.script.CRC32=ae819cf0
+nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.46.2
diff --git a/Example/nbproject/platform.properties b/Example/nbproject/platform.properties
new file mode 100644
index 0000000000..38ecd5a92e
--- /dev/null
+++ b/Example/nbproject/platform.properties
@@ -0,0 +1,99 @@
+cluster.path=\
+ ${nbplatform.active.dir}/java:\
+ ${nbplatform.active.dir}/platform
+disabled.modules=\
+ org.apache.tools.ant.module,\
+ org.netbeans.api.debugger.jpda,\
+ org.netbeans.api.java,\
+ org.netbeans.libs.cglib,\
+ org.netbeans.libs.javacapi,\
+ org.netbeans.libs.javacimpl,\
+ org.netbeans.libs.jsr223,\
+ org.netbeans.libs.springframework,\
+ org.netbeans.modules.ant.browsetask,\
+ org.netbeans.modules.ant.debugger,\
+ org.netbeans.modules.ant.freeform,\
+ org.netbeans.modules.ant.grammar,\
+ org.netbeans.modules.ant.kit,\
+ org.netbeans.modules.beans,\
+ org.netbeans.modules.classfile,\
+ org.netbeans.modules.dbschema,\
+ org.netbeans.modules.debugger.jpda,\
+ org.netbeans.modules.debugger.jpda.ant,\
+ org.netbeans.modules.debugger.jpda.projects,\
+ org.netbeans.modules.debugger.jpda.ui,\
+ org.netbeans.modules.form,\
+ org.netbeans.modules.form.j2ee,\
+ org.netbeans.modules.form.kit,\
+ org.netbeans.modules.hibernate,\
+ org.netbeans.modules.hibernatelib,\
+ org.netbeans.modules.hudson.ant,\
+ org.netbeans.modules.hudson.maven,\
+ org.netbeans.modules.i18n,\
+ org.netbeans.modules.i18n.form,\
+ org.netbeans.modules.j2ee.core.utilities,\
+ org.netbeans.modules.j2ee.eclipselink,\
+ org.netbeans.modules.j2ee.eclipselinkmodelgen,\
+ org.netbeans.modules.j2ee.jpa.refactoring,\
+ org.netbeans.modules.j2ee.jpa.verification,\
+ org.netbeans.modules.j2ee.metadata,\
+ org.netbeans.modules.j2ee.metadata.model.support,\
+ org.netbeans.modules.j2ee.persistence,\
+ org.netbeans.modules.j2ee.persistence.kit,\
+ org.netbeans.modules.j2ee.persistenceapi,\
+ org.netbeans.modules.j2ee.toplinklib,\
+ org.netbeans.modules.java.api.common,\
+ org.netbeans.modules.java.debug,\
+ org.netbeans.modules.java.editor,\
+ org.netbeans.modules.java.editor.lib,\
+ org.netbeans.modules.java.examples,\
+ org.netbeans.modules.java.freeform,\
+ org.netbeans.modules.java.guards,\
+ org.netbeans.modules.java.helpset,\
+ org.netbeans.modules.java.hints,\
+ org.netbeans.modules.java.hints.processor,\
+ org.netbeans.modules.java.j2seplatform,\
+ org.netbeans.modules.java.j2seproject,\
+ org.netbeans.modules.java.kit,\
+ org.netbeans.modules.java.lexer,\
+ org.netbeans.modules.java.navigation,\
+ org.netbeans.modules.java.platform,\
+ org.netbeans.modules.java.preprocessorbridge,\
+ org.netbeans.modules.java.project,\
+ org.netbeans.modules.java.source,\
+ org.netbeans.modules.java.source.ant,\
+ org.netbeans.modules.java.sourceui,\
+ org.netbeans.modules.javadoc,\
+ org.netbeans.modules.javawebstart,\
+ org.netbeans.modules.jellytools,\
+ org.netbeans.modules.jellytools.java,\
+ org.netbeans.modules.junit,\
+ org.netbeans.modules.maven,\
+ org.netbeans.modules.maven.coverage,\
+ org.netbeans.modules.maven.embedder,\
+ org.netbeans.modules.maven.grammar,\
+ org.netbeans.modules.maven.graph,\
+ org.netbeans.modules.maven.hints,\
+ org.netbeans.modules.maven.indexer,\
+ org.netbeans.modules.maven.junit,\
+ org.netbeans.modules.maven.kit,\
+ org.netbeans.modules.maven.model,\
+ org.netbeans.modules.maven.osgi,\
+ org.netbeans.modules.maven.persistence,\
+ org.netbeans.modules.maven.repository,\
+ org.netbeans.modules.maven.search,\
+ org.netbeans.modules.maven.spring,\
+ org.netbeans.modules.projectimport.eclipse.core,\
+ org.netbeans.modules.projectimport.eclipse.j2se,\
+ org.netbeans.modules.refactoring.java,\
+ org.netbeans.modules.spellchecker.bindings.java,\
+ org.netbeans.modules.spring.beans,\
+ org.netbeans.modules.swingapp,\
+ org.netbeans.modules.websvc.jaxws21,\
+ org.netbeans.modules.websvc.jaxws21api,\
+ org.netbeans.modules.websvc.saas.codegen.java,\
+ org.netbeans.modules.xml.jaxb,\
+ org.netbeans.modules.xml.tools.java,\
+ org.openide.compat,\
+ org.openide.util.enumerations
+nbplatform.active=default
diff --git a/Example/nbproject/project.properties b/Example/nbproject/project.properties
new file mode 100644
index 0000000000..17255bac6b
--- /dev/null
+++ b/Example/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.6
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/Example/nbproject/project.xml b/Example/nbproject/project.xml
new file mode 100644
index 0000000000..05fc6646ef
--- /dev/null
+++ b/Example/nbproject/project.xml
@@ -0,0 +1,72 @@
+
+
+ org.netbeans.modules.apisupport.project
+
+
+ org.sleuthkit.autopsy.example
+
+
+
+ org.openide.nodes
+
+
+
+ 7.21.1
+
+
+
+ org.openide.util
+
+
+
+ 8.15.1
+
+
+
+ org.openide.util.lookup
+
+
+
+ 8.8.1
+
+
+
+ org.openide.windows
+
+
+
+ 6.40.1
+
+
+
+ org.sleuthkit.autopsy.corecomponentinterfaces
+
+
+
+ 1
+ 1.0
+
+
+
+ org.sleuthkit.autopsy.corecomponents
+
+
+
+ 1
+ 1.0
+
+
+
+ org.sleuthkit.autopsy.datamodel
+
+
+
+ 1
+ 1.0
+
+
+
+
+
+
+
diff --git a/Example/nbproject/suite.properties b/Example/nbproject/suite.properties
new file mode 100644
index 0000000000..29d7cc9bd6
--- /dev/null
+++ b/Example/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/Example/src/org/sleuthkit/autopsy/example/Bundle.properties b/Example/src/org/sleuthkit/autopsy/example/Bundle.properties
new file mode 100644
index 0000000000..3bba77cab7
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/Bundle.properties
@@ -0,0 +1,2 @@
+OpenIDE-Module-Name=Example
+ExampleTopComponent.makeNodesButton.text=Make Nodes
diff --git a/Example/src/org/sleuthkit/autopsy/example/ExampleDataExplorer.java b/Example/src/org/sleuthkit/autopsy/example/ExampleDataExplorer.java
new file mode 100644
index 0000000000..5797470aea
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/ExampleDataExplorer.java
@@ -0,0 +1,71 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.sleuthkit.autopsy.example;
+
+import java.beans.PropertyChangeEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.lookup.ServiceProvider;
+import org.openide.windows.TopComponent;
+import org.sleuthkit.autopsy.corecomponentinterfaces.DataExplorer;
+import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent;
+import org.sleuthkit.autopsy.datamodel.KeyValueThing;
+
+
+@ServiceProvider(service = DataExplorer.class)
+public class ExampleDataExplorer implements DataExplorer {
+
+ ExampleTopComponent tc;
+
+ public ExampleDataExplorer() {
+ tc = new ExampleTopComponent(this);
+ tc.setName("Example");
+ }
+
+ @Override
+ public org.openide.windows.TopComponent getTopComponent() {
+ return tc;
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ // nothing to do in simple example
+ }
+
+ static final int NUMBER_THING_ID = 41234;
+
+ void makeNodes() {
+ Collection things = new ArrayList();
+
+ for (int i = 1; i <= 10; i++) {
+ for (int j = 1; j <= 10; j++) {
+ Map kvs = new LinkedHashMap();
+ kvs.put("x", i);
+ kvs.put("y", j);
+ kvs.put("sum", i+j);
+ kvs.put("product", i*j);
+
+ things.add(new KeyValueThing(i + " and " + j, kvs,
+ NUMBER_THING_ID));
+ }
+ }
+
+ Children childThingNodes =
+ Children.create(new ExampleKeyValueChildFactory(things), true);
+
+ Node rootNode = new AbstractNode(childThingNodes);
+ String pathText = "foo";
+
+ TopComponent searchResultWin =
+ DataResultTopComponent.createInstance("Keyword search",
+ pathText, rootNode, things.size());
+ searchResultWin.requestActive(); // make it the active top component
+ }
+}
diff --git a/Example/src/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.java b/Example/src/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.java
new file mode 100644
index 0000000000..5dab6d6139
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/ExampleKeyValueChildFactory.java
@@ -0,0 +1,28 @@
+package org.sleuthkit.autopsy.example;
+
+import java.util.Collection;
+import java.util.List;
+import org.openide.nodes.ChildFactory;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.sleuthkit.autopsy.datamodel.KeyValueNode;
+import org.sleuthkit.autopsy.datamodel.KeyValueThing;
+
+public class ExampleKeyValueChildFactory extends ChildFactory {
+
+ private Collection things;
+
+ public ExampleKeyValueChildFactory(Collection things) {
+ this.things = things;
+ }
+
+ @Override
+ protected boolean createKeys(List toPopulate) {
+ return toPopulate.addAll(things);
+ }
+
+ @Override
+ protected Node createNodeForKey(KeyValueThing thing) {
+ return new KeyValueNode(thing, Children.LEAF);
+ }
+}
diff --git a/Example/src/org/sleuthkit/autopsy/example/ExampleModel.java b/Example/src/org/sleuthkit/autopsy/example/ExampleModel.java
new file mode 100644
index 0000000000..e9c1af3c89
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/ExampleModel.java
@@ -0,0 +1,15 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.sleuthkit.autopsy.example;
+
+public class ExampleModel {
+
+ int x;
+
+ ExampleModel(int x) {
+ this.x = x;
+ }
+
+}
diff --git a/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.form b/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.form
new file mode 100644
index 0000000000..63d3073671
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.form
@@ -0,0 +1,48 @@
+
+
+
diff --git a/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.java b/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.java
new file mode 100644
index 0000000000..73a4304b8c
--- /dev/null
+++ b/Example/src/org/sleuthkit/autopsy/example/ExampleTopComponent.java
@@ -0,0 +1,72 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * ExampleTopComponent.java
+ *
+ * Created on Dec 12, 2011, 1:55:46 PM
+ */
+package org.sleuthkit.autopsy.example;
+
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author pmartel
+ */
+public class ExampleTopComponent extends TopComponent {
+
+ ExampleDataExplorer edx;
+
+ /** Creates new form ExampleTopComponent */
+ public ExampleTopComponent(ExampleDataExplorer edx) {
+ this.edx = edx;
+ initComponents();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ makeNodesButton = new javax.swing.JButton();
+
+ makeNodesButton.setText(org.openide.util.NbBundle.getMessage(ExampleTopComponent.class, "ExampleTopComponent.makeNodesButton.text")); // NOI18N
+ makeNodesButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ makeNodesButtonActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(makeNodesButton)
+ .addContainerGap(299, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(makeNodesButton)
+ .addContainerGap(266, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+
+ private void makeNodesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_makeNodesButtonActionPerformed
+ edx.makeNodes();
+ }//GEN-LAST:event_makeNodesButtonActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton makeNodesButton;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/nbproject/project.properties b/nbproject/project.properties
index d78ab488e8..7bd51a49ed 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -17,11 +17,13 @@ modules=\
${project.org.sleuthkit.autopsy.filesearch}:\
${project.org.sleuthkit.autopsy.datamodel}:\
${project.org.sleuthkit.autopsy.logging}:\
- ${project.org.sleuthkit.autopsy.casemodule}
+ ${project.org.sleuthkit.autopsy.casemodule}:\
+ ${project.org.sleuthkit.autopsy.example}
project.org.sleuthkit.autopsy.casemodule=Case
project.org.sleuthkit.autopsy.corecomponentinterfaces=CoreComponentInterfaces
project.org.sleuthkit.autopsy.corecomponents=CoreComponents
project.org.sleuthkit.autopsy.directorytree=DirectoryTree
+project.org.sleuthkit.autopsy.example=Example
project.org.sleuthkit.autopsy.filesearch=FileSearch
project.org.sleuthkit.autopsy.logging=Logging
project.org.sleuthkit.autopsy.menuactions=MenuActions