resources = classLoader.getResources(basePackageName);
+ while (resources.hasMoreElements()) {
+ System.out.println(resources.nextElement());
+ } */
+ }
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java
index 60bb186c0a..e535d645ec 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java
@@ -105,7 +105,160 @@ public class ReportHTML implements TableReportModule {
}
out = null;
}
+
+ /**
+ * Generate a file name for the given datatype, by replacing any
+ * undesirable chars, like /, or spaces
+ * @param dataType data type for which to generate a file name
+ */
+ private String dataTypeToFileName(String dataType) {
+
+ String fileName = org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName(dataType);
+ // replace all ' ' with '_'
+ fileName = fileName.replaceAll(" ", "_");
+
+ return fileName;
+ }
+
+ /**
+ * Copies a suitable icon for the given data type in the output directory and
+ * returns the icon file name to use for the given data type.
+ */
+ private String useDataTypeIcon(String dataType)
+ {
+ String iconFilePath;
+ String iconFileName;
+ InputStream in = null;
+ OutputStream output = null;
+
+ logger.log(Level.INFO, "useDataTypeIcon: dataType = " + dataType);
+
+ // find the artifact with matching display name
+ BlackboardArtifact.ARTIFACT_TYPE artifactType = null;
+ for (ARTIFACT_TYPE v : ARTIFACT_TYPE.values()) {
+ if (v.getDisplayName().equals(dataType)) {
+ artifactType = v;
+ }
+ }
+
+ if (null != artifactType)
+ {
+ // set the icon file name
+ iconFileName = dataTypeToFileName(artifactType.getDisplayName()) + ".png";
+ iconFilePath = path + File.separator + iconFileName;
+
+ // determine the source image to use
+ switch (artifactType) {
+ case TSK_WEB_BOOKMARK:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/bookmarks.png");
+ break;
+ case TSK_WEB_COOKIE:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/cookies.png");
+ break;
+ case TSK_WEB_HISTORY:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/history.png");
+ break;
+ case TSK_WEB_DOWNLOAD:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/downloads.png");
+ break;
+ case TSK_RECENT_OBJECT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/recent.png");
+ break;
+ case TSK_INSTALLED_PROG:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/installed.png");
+ break;
+ case TSK_KEYWORD_HIT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/keywords.png");
+ break;
+ case TSK_HASHSET_HIT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/hash.png");
+ break;
+ case TSK_DEVICE_ATTACHED:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/devices.png");
+ break;
+ case TSK_WEB_SEARCH_QUERY:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/search.png");
+ break;
+ case TSK_METADATA_EXIF:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/exif.png");
+ break;
+ case TSK_TAG_FILE:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/userbookmarks.png");
+ break;
+ case TSK_TAG_ARTIFACT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/userbookmarks.png");
+ break;
+ case TSK_SERVICE_ACCOUNT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/account-icon-16.png");
+ break;
+ case TSK_CONTACT:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/contact.png");
+ break;
+ case TSK_MESSAGE:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/message.png");
+ break;
+ case TSK_CALLLOG:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/calllog.png");
+ break;
+ case TSK_CALENDAR_ENTRY:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/calendar.png");
+ break;
+ case TSK_SPEED_DIAL_ENTRY:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/speeddialentry.png");
+ break;
+ case TSK_BLUETOOTH_PAIRING:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/bluetooth.png");
+ break;
+ case TSK_GPS_BOOKMARK:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gpsfav.png");
+ break;
+ case TSK_GPS_LAST_KNOWN_LOCATION:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gps-lastlocation.png");
+ break;
+ case TSK_GPS_SEARCH:
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gps-search.png");
+ break;
+
+ default:
+ logger.log(Level.WARNING, "useDataTypeIcon: unhandled artifact type = " + dataType);
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/star.png");
+ iconFileName = "star.png";
+ iconFilePath = path + File.separator + iconFileName;
+ break;
+ }
+ }
+ else { // no defined artifact found for this dataType
+ logger.log(Level.WARNING, "useDataTypeIcon: no artifact found for data type = " + dataType);
+ in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/star.png");
+ iconFileName = "star.png";
+ iconFilePath = path + File.separator + iconFileName;
+ }
+
+ try {
+ output = new FileOutputStream(iconFilePath);
+ FileUtil.copy(in, output);
+ in.close();
+ output.close();
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, "Failed to extract images for HTML report.", ex);
+ } finally {
+ if (output != null) {
+ try {
+ output.flush();
+ output.close();
+ } catch (IOException ex) {
+ }
+ } if (in != null) {
+ try {
+ in.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ return iconFileName;
+ }
/**
* Start this report by setting the path, refreshing member variables,
* and writing the skeleton for the HTML report.
@@ -151,7 +304,7 @@ public class ReportHTML implements TableReportModule {
*/
@Override
public void startDataType(String title) {
- String fTitle = org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName(title);
+ String fTitle = dataTypeToFileName(title);
// Make a new out for this page
try {
//escape out slashes tha that appear in title
@@ -186,7 +339,7 @@ public class ReportHTML implements TableReportModule {
* @param comment Comment on the data type, may be the empty string
*/
public void startDataType(String name, String comment) {
- String title = org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName(name);
+ String title = dataTypeToFileName(name);
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path + title + getExtension()), "UTF-8"));
} catch (FileNotFoundException ex) {
@@ -614,9 +767,10 @@ public class ReportHTML implements TableReportModule {
nav.append("Case Summary\n");
for (String dataType : dataTypes.keySet()) {
- String dataTypeEsc = org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName(dataType);
- nav.append("")
.append(dataType).append(" (").append(dataTypes.get(dataType))
.append(")\n");
@@ -668,146 +822,7 @@ public class ReportHTML implements TableReportModule {
in.close();
output.close();
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/bookmarks.png");
- output = new FileOutputStream(new File(path + File.separator + "Bookmarks.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/cookies.png");
- output = new FileOutputStream(new File(path + File.separator + "Cookies.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/history.png");
- output = new FileOutputStream(new File(path + File.separator + "Web History.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/downloads.png");
- output = new FileOutputStream(new File(path + File.separator + "Downloads.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/search.png");
- output = new FileOutputStream(new File(path + File.separator + "Web Search Engine Queries.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/recent.png");
- output = new FileOutputStream(new File(path + File.separator + "Recent Documents.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/installed.png");
- output = new FileOutputStream(new File(path + File.separator + "Installed Programs.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/keywords.png");
- output = new FileOutputStream(new File(path + File.separator + "Keyword Hits.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/devices.png");
- output = new FileOutputStream(new File(path + File.separator + "Devices Attached.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/exif.png");
- output = new FileOutputStream(new File(path + File.separator + "EXIF Metadata.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/userbookmarks.png");
- output = new FileOutputStream(new File(path + File.separator + "File Tags.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/userbookmarks.png");
- output = new FileOutputStream(new File(path + File.separator + "Result Tags.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/hash.png");
- output = new FileOutputStream(new File(path + File.separator + "Hashset Hits.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/contact.png");
- output = new FileOutputStream(new File(path + File.separator + "Contacts.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/message.png");
- output = new FileOutputStream(new File(path + File.separator + "Messages.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/calllog.png");
- output = new FileOutputStream(new File(path + File.separator + "Call Logs.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/calendar.png");
- output = new FileOutputStream(new File(path + File.separator + "Calendar Entries.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/speeddialentry.png");
- output = new FileOutputStream(new File(path + File.separator + "Speed Dial Entries.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/bluetooth.png");
- output = new FileOutputStream(new File(path + File.separator + "BlueTooth.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gpsfav.png");
- output = new FileOutputStream(new File(path + File.separator + "GPS Bookmarks.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gps-lastlocation.png");
- output = new FileOutputStream(new File(path + File.separator + "GPS Last Location.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/gps-search.png");
- output = new FileOutputStream(new File(path + File.separator + "GPS Search.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
- in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/account-icon-16.png");
- output = new FileOutputStream(new File(path + File.separator + "Accounts.png"));
- FileUtil.copy(in, output);
- in.close();
- output.close();
-
-
-
+
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to extract images for HTML report.", ex);
} finally {
diff --git a/Core/src/org/sleuthkit/autopsy/report/images/star.png b/Core/src/org/sleuthkit/autopsy/report/images/star.png
new file mode 100644
index 0000000000..10169c0617
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/report/images/star.png differ
diff --git a/ExifParser/src/org/sleuthkit/autopsy/exifparser/ExifParserFileIngestModule.java b/ExifParser/src/org/sleuthkit/autopsy/exifparser/ExifParserFileIngestModule.java
index 663c7b007f..a6fb867052 100644
--- a/ExifParser/src/org/sleuthkit/autopsy/exifparser/ExifParserFileIngestModule.java
+++ b/ExifParser/src/org/sleuthkit/autopsy/exifparser/ExifParserFileIngestModule.java
@@ -46,6 +46,7 @@ import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
import org.sleuthkit.datamodel.ReadContentInputStream;
import org.sleuthkit.datamodel.TskCoreException;
+import org.sleuthkit.datamodel.TskData;
import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
/**
@@ -92,6 +93,11 @@ public final class ExifParserFileIngestModule extends IngestModuleAbstractFile {
return IngestModuleAbstractFile.ProcessResult.OK;
}
+ // skip known
+ if (content.getKnown().equals(TskData.FileKnown.KNOWN)) {
+ return IngestModuleAbstractFile.ProcessResult.OK;
+ }
+
//skip unsupported
if (! parsableFormat(content)) {
return IngestModuleAbstractFile.ProcessResult.OK;
diff --git a/KeywordSearch/release/solr/solr/conf/schema.xml b/KeywordSearch/release/solr/solr/conf/schema.xml
index ecfb9e15d8..203820992f 100644
--- a/KeywordSearch/release/solr/solr/conf/schema.xml
+++ b/KeywordSearch/release/solr/solr/conf/schema.xml
@@ -504,37 +504,42 @@
when adding a document.
-->
+
+
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -545,10 +550,11 @@
-
+
+
- Release
-
-
- C:\Program Files (x86)\Caphyon\Advanced Installer 10.2\bin\x86\AdvancedInstaller.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Product Code: ${guid1}
-
- Product Version: ${app.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Release
+
+
+ C:\Program Files (x86)\Caphyon\Advanced Installer 10.3\bin\x86\AdvancedInstaller.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Product Code: ${guid1}
+ Product Version: ${app.version}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.xml b/build.xml
index 51bb4f7eef..f1f6586b11 100644
--- a/build.xml
+++ b/build.xml
@@ -1,271 +1,271 @@
-
-
-
-
-
- Builds the module suite Autopsy3.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TSK_HOME: ${env.TSK_HOME}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Suite in ${basedir} with clusters ${cluster.path.final}, build cluster ${cluster}, and sorted modules ${modules.sorted}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${app.name} branding
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ Builds the module suite Autopsy3.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TSK_HOME: ${env.TSK_HOME}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suite in ${basedir} with clusters ${cluster.path.final}, build cluster ${cluster}, and sorted modules ${modules.sorted}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${app.name} branding
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/doxygen/modDev.dox b/docs/doxygen/modDev.dox
index 63113891ff..32d95deb72 100644
--- a/docs/doxygen/modDev.dox
+++ b/docs/doxygen/modDev.dox
@@ -4,8 +4,6 @@
any type of module. Information about specific types of modules should
go into the page for that module type. -->
-
-
This page describes the basic concepts and setup that are needed regardless of the module type that you are building.
\section mod_dev_setup Basic Setup
@@ -66,11 +64,7 @@ You now have a NetBeans module that is using Autopsy as its build platform. Tha
There are several optional things in the Properties section. You can add a description and specify the version. You can do all of this later though and it does not need to be done before you start development.
A link about the NetBeans versioning scheme can be found here http://wiki.netbeans.org/VersioningPolicy.
-Autopsy follows this scheme and we will make a wiki page about it.
-
-TODO: @@@ Add link to our wiki with Autopsy's versioning scheme
-
-
+Autopsy follows this scheme and a link to the details can be found at http://wiki.sleuthkit.org/index.php?title=Autopsy_3_Module_Versions.
\subsection mod_dev_mod_other Other Links
diff --git a/docs/doxygen/modIngest.dox b/docs/doxygen/modIngest.dox
index 3d8b53c466..272d9218fc 100644
--- a/docs/doxygen/modIngest.dox
+++ b/docs/doxygen/modIngest.dox
@@ -48,6 +48,7 @@ blackboard and with inbox messages to the user.
\section ingest_datasrc Data Source-level Modules
To make a data source-level module, make a new Java class either manually or using the NetBeans wizards. Edit the class to extend "org.sleuthkit.autopsy.ingest.IngestModuleDataSource". NetBeans will likely complain that you have not implemented the necessary methods and you can use its "hints" to automatically generate stubs for them. Use the documentation for the org.sleuthkit.autopsy.ingest.IngestModuleDataSource class for details on what each needs to do.
+You can also refer to org.sleuthkit.autopsy.examples.SampleDataSourceIngestModule as an example module.
Example snippet of an ingest-level module process() method:
@@ -87,6 +88,7 @@ public void process(Content dataSource, IngestDataSourceWorkerController control
\section ingest_file File-level Modules
To make a File-level module, make a new Java class either manually or using the NetBeans wizards. Edit the class to extend "org.sleuthkit.autopsy.ingest.IngestModuleAbstractFile". NetBeans will likely complain that you have not implemented the necessary methods and you can use its "hints" to automatically generate stubs for them. Use the method documentation in the org.sleuthkit.autopsy.ingest.IngestModuleAbstractFile class to fill in the details.
+You can also refer to org.sleuthkit.autopsy.examples.SampleFileIngestModule as an example module.
Unlike Data Source-level modules, file-level modules are singletons. Only a single instance is created for all files.
The same file-level module instance will be used for files in different images and even different cases if new cases are opened.
diff --git a/docs/doxygen/modResult.dox b/docs/doxygen/modResult.dox
index b2cbae89f8..0daab56fa6 100644
--- a/docs/doxygen/modResult.dox
+++ b/docs/doxygen/modResult.dox
@@ -1,31 +1,51 @@
/*! \page mod_result_page Developing Result Viewer Modules
-NOTE: This has been moved from a package-level description and needs cleanup and updating.
+\section result_overview Overview
+DataResultViewer modules exist in the upper-right area of the default Autopsy interface, as shown below.
-Creating a DataResultViewer
-DataResultTopComponent is the high-level window in the DataResult area. The DataResult area is in the upper right of Autopsy and shows a set of nodes (i.e. in table form or thumbnail, by default). You will want to create a new module in this area if you have a new way to display a set of files or nodes. For example, in a graph form or different layout beyond the simple table.
+\image html viewer_image.jpg "Module Viewer Areas"
-
-- Create a module from within NetBeans. It must be dependent on these modules:
-
-- Case
-
- CoreComponentInterfaces
-
- CoreComponents
-
- DataModel
-
- DialogsAPI (if pop-ups and such are going to be used)
-
- Explorer & Property Sheet API
-
- Lookup
-
- Nodes API
-
- Setting API
-
- UI Utilities API
-
- Utilities API
-
- Window System API
-
+They display a set of files that are passed into the viewer from the tree on the left, keyword searching, or other searches. The main idea is that the same set of files can be viewed in table form, thumbnail form, or any other form that you can think of. Once a file is selected from the DataResult area, it is passed to the DataContent area for display.
- - Make a class that extends org.sleuthkit.autopsy.corecomponents.AbstractDataResultViewer and is registered as a service provider for the org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer class by specifying "@ServiceProvider(service = DataResultViewer.class)" or by using layer.xml. This class will extend JPanel.
+\section result_dataflow Data Flow
+This section provides some basics on DataResult viewers. DataResult viewers are created as needed. The directory tree on the left creates one when it loads and uses it for the life of the application. The keyword search module creates on each time it performs a keyword search. Data is explicitly passed into it.
-- See the previous sections on default actions. (note that this refers to the CoreComponentINterfaces package-level description).
+By default, when a node is selected, it is then passed to the default DataContent viewer (this is done in org.sleuthkit.autopsy.corecomponents.AbstractDataResultViewer). There can be many data content viewers, but only one default one exists.
-
+The org.sleuthkit.autopsy.corecomponents.DataResultViewerTopComponent class is the NetBeans TopComponent that encapsulates the various DataResult viewer modules. It creates tabs for each DataResult viewer module.
+
+\section result_nb NetBeans Module Configuration
+The rest of the document assumes that you have already created your NetBeans module, as outlined in \ref mod_dev_module.
+
+DataResultViewer modules will have additional NetBeans dependencies. Right click on the module, choose "Properties" -> "Libraries" -> "Module Dependencies". Add "Lookup API" and "Nodes API".
+
+\section result_mod Module Development
+
+You will need a class that extends org.sleuthkit.autopsy.corecomponents.AbstractDataResultViewer. You can use NetBeans to make a class, manually extend it, and then let NetBeans complain about missing methods. It will provide default implementations for them if you click on the error messages in the UI.
+Refer to the documentation in org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer on what each method should do. Note that AbstractDataResultViewer extends JPanel.
+
+Autopsy will find your module using the NetBeans Lookup infrastructure. To be found, you will need to register as a service provider for DataResultViewer.class by annotating your class as follows:
+
+\code
+@ServiceProvider(service = DataResultViewer.class)
+public class DataResultViewerTable extends AbstractDataResultViewer {
+\endcode
+
+If you get errors about not knowing about ServiceProviders and such, ensure that you configured your NetBeans module to depend on the Nodes and Lookup APIs as outlined in the previous section.
+
+The current modules in this viewer area heavily use the NetBeans ExplorerManger and Node concepts. You do not need to use ExplorerManager concepts, but you will need to use Node concepts to identify the set of nodes to display and to extract the datamodel objects from each Node object. Refer to \ref content_hints_objects for hints on getting the datamodel objects from the Node.
+
+\section result_examples Example Modules
+You can refer to the org.sleuthkit.autopsy.corecomponents.DataResultViewerTable and org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail modules to follow as examples.
+
+\section result_hint Hints
+
+Note that we have made the least number of these types of modules, so some work could be done to make the framework and infrastuture for them better.
+
+These modules are currently the most challenging to develop because they require the most NetBeans knowledge about Nodes and ExplorerManagers. Make sure you read some of the tutorials (or books) first:
+- NetBeans Nodes API Tutorial (https://platform.netbeans.org/tutorials/nbm-nodesapi2.html)
+- NetBeans Nodes, Explorer Manager, and Component Palette Tutorial (https://platform.netbeans.org/tutorials/nbm-nodesapi3.html)
+
+We have plans to change the design a bit in the future so that an ExplorerManager is created for each DataResultViewerTopComponent instance and each individual module does not need to make one. Instead, one will be given to it.
*/
diff --git a/docs/doxygen/platformConcepts.dox b/docs/doxygen/platformConcepts.dox
index c8ae7cef1f..72701c5b5c 100644
--- a/docs/doxygen/platformConcepts.dox
+++ b/docs/doxygen/platformConcepts.dox
@@ -52,6 +52,7 @@ services are provided:
- FileManager: the org.sleuthkit.autopsy.casemodule.services.FileManager service provides an API to access any file in the case. You can access FileManager by calling org.sleuthkit.autopsy.casemodule.services.Services.getFileManager(). Data Source-level Ingest modules and Report modules typically use this service because the other modules are passed in a reference to a specific file to do something with.
- org.sleuthkit.autopsy.coreutils.Logger - for adding log messages to central logger
- IngestModules also have a class that provides additional services. See \ref ingestmodule_services.
+- MessageNotifyUtil.Notify.show() can be used to send messages to the user in the lower right-hand area.
\subsection mod_dev_other_utilities Framework Utilities
diff --git a/update_versions.py b/update_versions.py
index ce9b857117..2883021c9f 100644
--- a/update_versions.py
+++ b/update_versions.py
@@ -820,18 +820,16 @@ def usage():
return \
"""
USAGE:
- Run this script to generate a jdiff XML summary for every module
- in the current Autopsy source and in a previous source specified
- by the given tag. Then, compare the XML files to see which modules
- need updated version numbers. If the dry run tag is not given, the
- module numbers will be automatically updated.
+ Compares the API of the current Autopsy source code with a previous
+ tagged version. By default, it will detect the previous tag from
+ the NEWS file and will not update the versions in the source code.
OPTIONAL FLAGS:
- -t --tag The tag name in git. Otherwise the NEWS file in source
- will be used to determine the previous tag.
+ -t --tag Specify a previous tag to compare to.
+ Otherwise the NEWS file will be used.
-d --dir The output directory for the jdiff JavaDocs. If no
- directory is given, the default is /javadocs/{module}.
+ directory is given, the default is jdiff-javadocs/{module}.
-s --source The directory containing Autopsy's source code.
@@ -904,6 +902,7 @@ def main():
printt("Comparing jdiff outputs...")
for module in similar_modules:
module.set_ret(compare_xml(module, apiname_tag, apiname_cur))
+ print("Refer to the jdiff-javadocs folder for more details")
# ------------------------------------------------------------
# 1) Do versioning