mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
Fix backwards compatibility issue for reports
This commit is contained in:
parent
882e10c60b
commit
81966fabb0
@ -62,15 +62,16 @@ import org.sleuthkit.autopsy.ingest.IngestModuleError;
|
|||||||
import org.sleuthkit.autopsy.ingest.IngestProfiles;
|
import org.sleuthkit.autopsy.ingest.IngestProfiles;
|
||||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
|
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
|
||||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
|
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
|
||||||
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressLogger;
|
import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
|
||||||
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
|
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
|
||||||
|
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows Autopsy to be invoked with a command line arguments. Causes Autopsy to
|
* Allows Autopsy to be invoked with a command line arguments. Arguments exist
|
||||||
* create a case, add a specified data source, run ingest on that data source,
|
* to cause Autopsy to create a case, add a specified data source, run ingest on
|
||||||
* list all data source in a case, generate reports.
|
* that data source, list all data sources in a case, and generate reports.
|
||||||
*/
|
*/
|
||||||
public class CommandLineIngestManager {
|
public class CommandLineIngestManager {
|
||||||
|
|
||||||
@ -285,7 +286,8 @@ public class CommandLineIngestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generate reports
|
// generate reports
|
||||||
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), new ReportProgressLogger()); //NON-NLS
|
ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
|
||||||
|
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator); //NON-NLS
|
||||||
generator.generateReports();
|
generator.generateReports();
|
||||||
} catch (CaseActionException ex) {
|
} catch (CaseActionException ex) {
|
||||||
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
|
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
|
||||||
@ -332,9 +334,10 @@ public class CommandLineIngestManager {
|
|||||||
* Creates a new case using arguments passed in from command line
|
* Creates a new case using arguments passed in from command line
|
||||||
* CREATE_CASE command.
|
* CREATE_CASE command.
|
||||||
*
|
*
|
||||||
* @param baseCaseName Case name
|
* @param baseCaseName Case name
|
||||||
* @param rootOutputDirectory Full path to directory in which case
|
* @param rootOutputDirectory Full path to directory in which case
|
||||||
* output folder will be created
|
* output folder will be created
|
||||||
|
*
|
||||||
* @throws CaseActionException
|
* @throws CaseActionException
|
||||||
*/
|
*/
|
||||||
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
|
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
|
||||||
@ -363,6 +366,7 @@ public class CommandLineIngestManager {
|
|||||||
* Opens existing case.
|
* Opens existing case.
|
||||||
*
|
*
|
||||||
* @param caseFolderPath full path to case directory
|
* @param caseFolderPath full path to case directory
|
||||||
|
*
|
||||||
* @throws CaseActionException
|
* @throws CaseActionException
|
||||||
*/
|
*/
|
||||||
private void openCase(String caseFolderPath) throws CaseActionException {
|
private void openCase(String caseFolderPath) throws CaseActionException {
|
||||||
@ -415,11 +419,34 @@ public class CommandLineIngestManager {
|
|||||||
* @param dataSource The data source.
|
* @param dataSource The data source.
|
||||||
*
|
*
|
||||||
* @throws
|
* @throws
|
||||||
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException if
|
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorExceptioif
|
||||||
* there was a DSP processing error
|
* there
|
||||||
|
* was
|
||||||
|
* a
|
||||||
|
* DSP
|
||||||
|
* processing
|
||||||
|
* error
|
||||||
*
|
*
|
||||||
* @throws InterruptedException if the thread running the job processing
|
* @throws
|
||||||
* task is interrupted while blocked, i.e., if auto ingest is shutting down.
|
* InterruptedException if
|
||||||
|
* the
|
||||||
|
* thread
|
||||||
|
* running
|
||||||
|
* the
|
||||||
|
* job
|
||||||
|
* processing
|
||||||
|
* task
|
||||||
|
* is
|
||||||
|
* interrupted
|
||||||
|
* while
|
||||||
|
* blocked,
|
||||||
|
* i.e.,
|
||||||
|
* if
|
||||||
|
* auto
|
||||||
|
* ingest
|
||||||
|
* is
|
||||||
|
* shutting
|
||||||
|
* down.
|
||||||
*/
|
*/
|
||||||
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
|
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
|
||||||
|
|
||||||
@ -520,14 +547,15 @@ public class CommandLineIngestManager {
|
|||||||
* profile (profile = ingest context + ingest filter) for ingest.
|
* profile (profile = ingest context + ingest filter) for ingest.
|
||||||
* Otherwise use baseline configuration.
|
* Otherwise use baseline configuration.
|
||||||
*
|
*
|
||||||
* @param dataSource The data source to analyze.
|
* @param dataSource The data source to analyze.
|
||||||
* @param ingestProfileName Name of ingest profile to use (optional)
|
* @param ingestProfileName Name of ingest profile to use (optional)
|
||||||
*
|
*
|
||||||
* @throws AnalysisStartupException if there is an error analyzing the
|
* @throws AnalysisStartupException if there is an error analyzing the
|
||||||
* data source.
|
* data source.
|
||||||
* @throws InterruptedException if the thread running the job processing
|
* @throws InterruptedException if the thread running the job
|
||||||
* task is interrupted while blocked, i.e., if auto ingest is shutting
|
* processing task is interrupted while
|
||||||
* down.
|
* blocked, i.e., if auto ingest is
|
||||||
|
* shutting down.
|
||||||
*/
|
*/
|
||||||
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
|
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
|
||||||
|
|
||||||
@ -628,6 +656,7 @@ public class CommandLineIngestManager {
|
|||||||
* ingest profiles.
|
* ingest profiles.
|
||||||
*
|
*
|
||||||
* @param ingestProfileName Ingest profile name
|
* @param ingestProfileName Ingest profile name
|
||||||
|
*
|
||||||
* @return IngestProfile object, or NULL if the profile doesn't exist
|
* @return IngestProfile object, or NULL if the profile doesn't exist
|
||||||
*/
|
*/
|
||||||
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
|
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
|
||||||
@ -649,6 +678,7 @@ public class CommandLineIngestManager {
|
|||||||
* filters (custom and standard).
|
* filters (custom and standard).
|
||||||
*
|
*
|
||||||
* @param filterName Name of the file filter
|
* @param filterName Name of the file filter
|
||||||
|
*
|
||||||
* @return FilesSet object, or NULL if the filter doesn't exist
|
* @return FilesSet object, or NULL if the filter doesn't exist
|
||||||
*/
|
*/
|
||||||
private FilesSet getSelectedFilter(String filterName) {
|
private FilesSet getSelectedFilter(String filterName) {
|
||||||
@ -711,6 +741,7 @@ public class CommandLineIngestManager {
|
|||||||
* Returns full path to directory where command outputs should be saved.
|
* Returns full path to directory where command outputs should be saved.
|
||||||
*
|
*
|
||||||
* @param caseForJob Case object
|
* @param caseForJob Case object
|
||||||
|
*
|
||||||
* @return Full path to directory where command outputs should be saved
|
* @return Full path to directory where command outputs should be saved
|
||||||
*/
|
*/
|
||||||
private String getOutputDirPath(Case caseForJob) {
|
private String getOutputDirPath(Case caseForJob) {
|
||||||
|
@ -1,4 +1,17 @@
|
|||||||
OpenIDE-Module-Name=Report
|
OpenIDE-Module-Name=Report
|
||||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=pathLabel
|
||||||
|
ReportProgressPanel.reportLabel.text=reportLabel
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
ReportProgressPanel.progress.queuing=Queuing...
|
||||||
|
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||||
|
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||||
|
ReportProgressPanel.start.progress.text=Starting report...
|
||||||
|
ReportProgressPanel.complete.processLbl.text=Complete
|
||||||
|
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||||
|
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||||
|
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||||
|
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||||
|
@ -1,4 +1,17 @@
|
|||||||
OpenIDE-Module-Name=Report
|
OpenIDE-Module-Name=Report
|
||||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=pathLabel
|
||||||
|
ReportProgressPanel.reportLabel.text=reportLabel
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
ReportProgressPanel.progress.queuing=Queuing...
|
||||||
|
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||||
|
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||||
|
ReportProgressPanel.start.progress.text=Starting report...
|
||||||
|
ReportProgressPanel.complete.processLbl.text=Complete
|
||||||
|
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||||
|
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||||
|
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||||
|
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||||
|
@ -2,3 +2,7 @@ OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
|
|||||||
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
|
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
|
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
|
||||||
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
@ -63,7 +63,7 @@ public final class ReportBranding implements ReportBrandingProviderI {
|
|||||||
//initialize with extracting of resource files if needed, ensure 1 writer at a time
|
//initialize with extracting of resource files if needed, ensure 1 writer at a time
|
||||||
synchronized (ReportBranding.class) {
|
synchronized (ReportBranding.class) {
|
||||||
|
|
||||||
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.REPORTS_DIR + File.separator
|
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.getReportsDirectory() + File.separator
|
||||||
+ "branding"; //NON-NLS
|
+ "branding"; //NON-NLS
|
||||||
File brandingDir = new File(reportsBrandingDir);
|
File brandingDir = new File(reportsBrandingDir);
|
||||||
if (!brandingDir.exists()) {
|
if (!brandingDir.exists()) {
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -91,7 +91,7 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="verticalAlignment" type="int" value="1"/>
|
<Property name="verticalAlignment" type="int" value="1"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
@ -104,14 +104,14 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="statusMessageLabel">
|
<Component class="javax.swing.JLabel" name="statusMessageLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
349
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
349
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2019 Basis Technology Corp.
|
* Copyright 2012-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -18,11 +18,30 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.report;
|
package org.sleuthkit.autopsy.report;
|
||||||
|
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Cursor;
|
||||||
|
import java.awt.Desktop;
|
||||||
|
import java.awt.EventQueue;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseListener;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface is necessary in order to not break backwards compatibility of
|
* A panel used by a report generation module to show progress.
|
||||||
* GeneralReportModule interface. See JIRA-5354.
|
|
||||||
*/
|
*/
|
||||||
public interface ReportProgressPanel {
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
|
public class ReportProgressPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger logger = Logger.getLogger(ReportProgressPanel.class.getName());
|
||||||
|
private static final Color GREEN = new Color(50, 205, 50);
|
||||||
|
private static final Color RED = new Color(178, 34, 34);
|
||||||
|
private volatile ReportStatus status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by a report generation module to communicate report generation
|
* Used by a report generation module to communicate report generation
|
||||||
@ -37,46 +56,155 @@ public interface ReportProgressPanel {
|
|||||||
ERROR
|
ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a panel used by report generation module to show progress.
|
||||||
|
*/
|
||||||
|
public ReportProgressPanel() {
|
||||||
|
initComponents();
|
||||||
|
reportProgressBar.setIndeterminate(true);
|
||||||
|
reportProgressBar.setMaximum(100);
|
||||||
|
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.progress.queuing"));
|
||||||
|
status = ReportStatus.QUEUING;
|
||||||
|
reportLabel.setText("");
|
||||||
|
pathLabel.setText(""); //NON-NLS
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets label text.
|
||||||
|
*
|
||||||
|
* @param reportName The name of the report being generated.
|
||||||
|
* @param reportPath The path to the report file.
|
||||||
|
*/
|
||||||
|
public void setLabels(String reportName, String reportPath) {
|
||||||
|
reportLabel.setText(reportName);
|
||||||
|
if (null != reportPath) {
|
||||||
|
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
||||||
|
pathLabel.setToolTipText(reportPath);
|
||||||
|
String linkPath = reportPath;
|
||||||
|
pathLabel.addMouseListener(new MouseListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent mouseEvent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent mouseEvent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent mouseEvent) {
|
||||||
|
File file = new File(linkPath);
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().open(file);
|
||||||
|
} catch (IOException ioex) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
||||||
|
} catch (IllegalArgumentException iaEx) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().open(file.getParentFile());
|
||||||
|
} catch (IOException ioEx2) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseEntered(MouseEvent e3) {
|
||||||
|
pathLabel.setForeground(Color.DARK_GRAY);
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited(MouseEvent e4) {
|
||||||
|
pathLabel.setForeground(Color.BLACK);
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.initPathLabel.noFile"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current status of the generation of the report.
|
* Gets the current status of the generation of the report.
|
||||||
*
|
*
|
||||||
* @return The report generation status as a ReportStatus enum.
|
* @return The report generation status as a ReportStatus enum.
|
||||||
*/
|
*/
|
||||||
public ReportStatus getStatus();
|
public ReportStatus getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current status of the generation of the report.
|
||||||
|
*
|
||||||
|
* @param status The current status.
|
||||||
|
*/
|
||||||
|
protected void setStatus(ReportStatus status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts the progress bar component of this panel.
|
* Starts the progress bar component of this panel.
|
||||||
*/
|
*/
|
||||||
public void start();
|
public void start() {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text"));
|
||||||
|
status = ReportStatus.RUNNING;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the maximum value of the progress bar component of this panel.
|
* Sets the maximum value of the progress bar component of this panel.
|
||||||
*
|
*
|
||||||
* @param max The maximum value.
|
* @param max The maximum value.
|
||||||
*/
|
*/
|
||||||
public void setMaximumProgress(int max);
|
public void setMaximumProgress(int max) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setMaximum(max);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the current value of the progress bar component of this panel
|
* Increments the current value of the progress bar component of this panel
|
||||||
* by one unit.
|
* by one unit.
|
||||||
*/
|
*/
|
||||||
public void increment();
|
public void increment() {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current value of the progress bar component of this panel.
|
* Sets the current value of the progress bar component of this panel.
|
||||||
*
|
*
|
||||||
* @param value The value to be set.
|
* @param value The value to be set.
|
||||||
*/
|
*/
|
||||||
public void setProgress(int value);
|
public void setProgress(int value) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setValue(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the the progress bar component of this panel to be determinate or
|
* Changes the the progress bar component of this panel to be determinate or
|
||||||
* indeterminate.
|
* indeterminate.
|
||||||
*
|
*
|
||||||
* @param indeterminate True if the progress bar should be set to
|
* @param indeterminate True if the progress bar should be set to
|
||||||
* indeterminate.
|
* indeterminate.
|
||||||
*/
|
*/
|
||||||
public void setIndeterminate(boolean indeterminate);
|
public void setIndeterminate(boolean indeterminate) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setIndeterminate(indeterminate);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the status message label component of this panel to show a given
|
* Changes the status message label component of this panel to show a given
|
||||||
@ -85,7 +213,13 @@ public interface ReportProgressPanel {
|
|||||||
*
|
*
|
||||||
* @param statusMessage String to use as label text.
|
* @param statusMessage String to use as label text.
|
||||||
*/
|
*/
|
||||||
public void updateStatusLabel(String statusMessage);
|
public void updateStatusLabel(String statusMessage) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the final status of
|
* Makes the components of this panel indicate the final status of
|
||||||
@ -93,16 +227,196 @@ public interface ReportProgressPanel {
|
|||||||
*
|
*
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||||
*/
|
*/
|
||||||
public void complete(ReportStatus reportStatus);
|
public void complete(ReportStatus reportStatus) {
|
||||||
|
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE:
|
||||||
|
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
complete(reportStatus, "");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the final status of
|
* Makes the components of this panel indicate the final status of
|
||||||
* generation of the report.
|
* generation of the report.
|
||||||
*
|
*
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||||
* @param statusMessage String to use as label or error text.
|
* @param statusMessage String to use as label or error text.
|
||||||
*/
|
*/
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage);
|
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
reportProgressBar.setIndeterminate(false);
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE: {
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.COMPLETE;
|
||||||
|
statusMessageLabel.setForeground(Color.BLACK);
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(GREEN);
|
||||||
|
reportProgressBar.setString("Complete"); //NON-NLS
|
||||||
|
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ERROR: {
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.ERROR;
|
||||||
|
statusMessageLabel.setForeground(RED);
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(RED);
|
||||||
|
reportProgressBar.setString("Error"); //NON-NLS
|
||||||
|
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the components of this panel indicate generation of the report was
|
||||||
|
* cancelled.
|
||||||
|
*/
|
||||||
|
public void cancel() {
|
||||||
|
switch (status) {
|
||||||
|
case COMPLETE:
|
||||||
|
break;
|
||||||
|
case CANCELED:
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.CANCELED;
|
||||||
|
reportProgressBar.setIndeterminate(false);
|
||||||
|
reportProgressBar.setValue(0);
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(RED); // Red
|
||||||
|
reportProgressBar.setString("Cancelled"); //NON-NLS
|
||||||
|
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
||||||
|
statusMessageLabel.setForeground(RED);
|
||||||
|
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a shortened version of a file path.
|
||||||
|
*
|
||||||
|
* @param path The path to shorten.
|
||||||
|
*
|
||||||
|
* @return The shortened path.
|
||||||
|
*/
|
||||||
|
private String shortenPath(String path) {
|
||||||
|
if (path.length() > 100) {
|
||||||
|
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
||||||
|
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
||||||
|
} else {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
reportProgressBar = new javax.swing.JProgressBar();
|
||||||
|
reportLabel = new javax.swing.JLabel();
|
||||||
|
pathLabel = new javax.swing.JLabel();
|
||||||
|
separationLabel = new javax.swing.JLabel();
|
||||||
|
statusMessageLabel = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
setMinimumSize(new java.awt.Dimension(486, 68));
|
||||||
|
|
||||||
|
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
|
||||||
|
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.reportLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.pathLabel.text")); // NOI18N
|
||||||
|
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
||||||
|
|
||||||
|
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.separationLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.statusMessageLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
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()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(reportLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(separationLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(reportLabel)
|
||||||
|
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(separationLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(statusMessageLabel)
|
||||||
|
.addGap(13, 13, 13))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel pathLabel;
|
||||||
|
private javax.swing.JLabel reportLabel;
|
||||||
|
private javax.swing.JProgressBar reportProgressBar;
|
||||||
|
private javax.swing.JLabel separationLabel;
|
||||||
|
private javax.swing.JLabel statusMessageLabel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a panel used by a report generation module to show progress.
|
||||||
|
*
|
||||||
|
* @param reportName The report name.
|
||||||
|
* @param reportPath The report path.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #ReportProgressPanel()} and {@link #setLabels()}
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public ReportProgressPanel(String reportName, String reportPath) {
|
||||||
|
this();
|
||||||
|
setLabels(reportName, reportPath);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the generation of the report
|
* Makes the components of this panel indicate the generation of the report
|
||||||
@ -111,5 +425,8 @@ public interface ReportProgressPanel {
|
|||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
* @deprecated Use {@link #complete(ReportStatus)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void complete();
|
public void complete() {
|
||||||
|
complete(ReportStatus.COMPLETE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,6 @@ ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
|||||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||||
ReportProgressDialog.reportLabel.text=reportLabel
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportProgressDialog.pathLabel.text=pathLabel
|
|
||||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||||
@ -151,15 +147,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
|||||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||||
ReportProgressDialog.progress.queuing=Queuing...
|
|
||||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
|
||||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
|
||||||
ReportProgressDialog.start.progress.text=Starting report...
|
|
||||||
ReportProgressDialog.complete.processLbl.text=Complete
|
|
||||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
|
||||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
|
||||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
|
||||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
|
||||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||||
ReportVisualPanel2.getName.text=Configure Report
|
ReportVisualPanel2.getName.text=Configure Report
|
||||||
ReportWizardAction.actionName.text=Generate Report
|
ReportWizardAction.actionName.text=Generate Report
|
||||||
|
@ -9,16 +9,18 @@ PortableCaseTagsListPanel.error.noOpenCase=There is no case open
|
|||||||
ReportGenerator.artTableColHdr.comment=Comment
|
ReportGenerator.artTableColHdr.comment=Comment
|
||||||
ReportGenerator.errList.noOpenCase=No open case available.
|
ReportGenerator.errList.noOpenCase=No open case available.
|
||||||
ReportGenerator.tagTable.header.userName=User Name
|
ReportGenerator.tagTable.header.userName=User Name
|
||||||
|
ReportProgressIndicator.cancelledMessage=Report generation cancelled
|
||||||
|
ReportProgressIndicator.completedMessage=Report generation completed
|
||||||
|
ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors
|
||||||
|
ReportProgressIndicator.startMessage=Report generation started
|
||||||
|
ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate
|
||||||
|
ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate
|
||||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
|
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
|
||||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
|
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
|
||||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||||
ReportProgressDialog.reportLabel.text=reportLabel
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportProgressDialog.pathLabel.text=pathLabel
|
|
||||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||||
@ -160,15 +162,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
|||||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||||
ReportProgressDialog.progress.queuing=Queuing...
|
|
||||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
|
||||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
|
||||||
ReportProgressDialog.start.progress.text=Starting report...
|
|
||||||
ReportProgressDialog.complete.processLbl.text=Complete
|
|
||||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
|
||||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
|
||||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
|
||||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
|
||||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||||
ReportVisualPanel2.getName.text=Configure Report
|
ReportVisualPanel2.getName.text=Configure Report
|
||||||
ReportWizardAction.actionName.text=Generate Report
|
ReportWizardAction.actionName.text=Generate Report
|
||||||
|
@ -2,10 +2,6 @@ CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
|
|||||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
|
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
|
||||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
|
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
|
||||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
|
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
|
||||||
ReportProgressDialog.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
|
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
|
||||||
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||||
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2012-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -25,21 +25,21 @@ import javax.swing.Box;
|
|||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A panel that displays a panel used by a report generation module to show
|
* A panel that displays a panel used by a report generation module to show
|
||||||
* progress. It provides OK and Cancel buttons.
|
* progress. It provides OK and Cancel buttons.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
class ReportGenerationPanel extends javax.swing.JPanel {
|
final class ReportGenerationPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private final GridBagConstraints constraints;
|
private final GridBagConstraints constraints;
|
||||||
private final Component glue;
|
private final Component glue;
|
||||||
private ActionListener actionListener;
|
private ActionListener actionListener;
|
||||||
ReportProgressDialog progressPanel;
|
private final ReportProgressPanel progressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a panel that displays a panel used by a report generation
|
* Constructs a panel that displays a panel used by a report generation
|
||||||
@ -54,10 +54,10 @@ class ReportGenerationPanel extends javax.swing.JPanel {
|
|||||||
constraints.gridy = 0;
|
constraints.gridy = 0;
|
||||||
constraints.weightx = 1.0;
|
constraints.weightx = 1.0;
|
||||||
glue = Box.createVerticalGlue();
|
glue = Box.createVerticalGlue();
|
||||||
progressPanel = new ReportProgressDialog();
|
progressPanel = new ReportProgressPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
ReportProgressDialog getProgressPanel() {
|
ReportProgressPanel getProgressPanel() {
|
||||||
return progressPanel;
|
return progressPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JDialog;
|
import javax.swing.JDialog;
|
||||||
import javax.swing.JFrame;
|
|
||||||
import org.openide.filesystems.FileUtil;
|
import org.openide.filesystems.FileUtil;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
@ -55,24 +54,33 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A report generator that generates one or more reports by running
|
||||||
|
* user-selected report modules.
|
||||||
|
*/
|
||||||
public class ReportGenerator {
|
public class ReportGenerator {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
||||||
|
|
||||||
private ReportProgressPanel progressPanel = null;
|
|
||||||
private ReportGenerationPanel reportGenerationPanel = null;
|
|
||||||
|
|
||||||
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
||||||
|
private static final String REPORTS_DIR = "Reports"; //NON-NLS
|
||||||
private final String configName;
|
private final String configName;
|
||||||
|
private final ReportGenerationPanel reportGenerationPanel;
|
||||||
public static final String REPORTS_DIR = "Reports"; //NON-NLS
|
private final ReportProgressPanel progressIndicator;
|
||||||
|
private List<String> errorList = new ArrayList<>();
|
||||||
private List<String> errorList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the list of errors during report generation in user-friendly
|
* Gets the name of the reports directory within the case direcotry
|
||||||
* way.
|
* hierarchy.
|
||||||
|
*
|
||||||
|
* @return The directory name.
|
||||||
|
*/
|
||||||
|
public static String getReportsDirectory() {
|
||||||
|
return REPORTS_DIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a list of errors emitted by report modules during report
|
||||||
|
* generation using this report generator's report progress indicator.
|
||||||
*/
|
*/
|
||||||
private void displayReportErrors() {
|
private void displayReportErrors() {
|
||||||
if (!errorList.isEmpty()) {
|
if (!errorList.isEmpty()) {
|
||||||
@ -80,41 +88,41 @@ public class ReportGenerator {
|
|||||||
for (String error : errorList) {
|
for (String error : errorList) {
|
||||||
errorString += error + "\n";
|
errorString += error + "\n";
|
||||||
}
|
}
|
||||||
progressPanel.updateStatusLabel(errorString);
|
progressIndicator.updateStatusLabel(errorString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a report generator. This constructor uses a logger instead of UI
|
* Constructs a report generator that generates one or more reports by
|
||||||
* panel.
|
* running user-selected report modules and uses a report generation panel
|
||||||
|
* to display progress.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration to use
|
* @param configName The name of the reporting configuration to use.
|
||||||
* @param progress Fully instantiated progress logger
|
* @param panel The report generation panel.
|
||||||
*/
|
|
||||||
public ReportGenerator(String configName, ReportProgressLogger progress) {
|
|
||||||
this.errorList = new ArrayList<>();
|
|
||||||
this.progressPanel = progress;
|
|
||||||
this.reportGenerationPanel = null;
|
|
||||||
this.configName = configName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a report generator. This constructor uses UI panel to display
|
|
||||||
* progress.
|
|
||||||
*
|
|
||||||
* @param configName Name of the reporting configuration to use
|
|
||||||
* @param panel Fully instantiated progress panel
|
|
||||||
*/
|
*/
|
||||||
public ReportGenerator(String configName, ReportGenerationPanel panel) {
|
public ReportGenerator(String configName, ReportGenerationPanel panel) {
|
||||||
this.errorList = new ArrayList<>();
|
|
||||||
this.reportGenerationPanel = panel;
|
|
||||||
this.progressPanel = panel.getProgressPanel();
|
|
||||||
this.configName = configName;
|
this.configName = configName;
|
||||||
|
this.reportGenerationPanel = panel;
|
||||||
|
this.progressIndicator = panel.getProgressPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate reports according to previously specified reporting
|
* Constructs a report generator that generates one or more reports by
|
||||||
* configuration.
|
* running user-selected report modules and uses a report progress indicator
|
||||||
|
* to display progress.
|
||||||
|
*
|
||||||
|
* @param configName The name of the reporting configuration to use.
|
||||||
|
* @param progressIndicator The report progress indicator.
|
||||||
|
*/
|
||||||
|
public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
|
||||||
|
this.configName = configName;
|
||||||
|
this.reportGenerationPanel = null;
|
||||||
|
this.progressIndicator = progressIndicator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates the reports specified by the reporting configuration passed in
|
||||||
|
* via the constructor.
|
||||||
*/
|
*/
|
||||||
public void generateReports() {
|
public void generateReports() {
|
||||||
ReportingConfig config = null;
|
ReportingConfig config = null;
|
||||||
@ -122,13 +130,13 @@ public class ReportGenerator {
|
|||||||
config = ReportingConfigLoader.loadConfig(configName);
|
config = ReportingConfigLoader.loadConfig(configName);
|
||||||
} catch (ReportConfigException ex) {
|
} catch (ReportConfigException ex) {
|
||||||
logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
|
logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
|
||||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
|
logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
|
||||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +170,7 @@ public class ReportGenerator {
|
|||||||
ReportModule module = modules.get(moduleName);
|
ReportModule module = modules.get(moduleName);
|
||||||
if (module == null) {
|
if (module == null) {
|
||||||
logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
|
logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
|
||||||
progressPanel.updateStatusLabel("Report module " + moduleName + " not found");
|
progressIndicator.updateStatusLabel("Report module " + moduleName + " not found");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +197,7 @@ public class ReportGenerator {
|
|||||||
TableReportSettings tableSettings = config.getTableReportSettings();
|
TableReportSettings tableSettings = config.getTableReportSettings();
|
||||||
if (tableSettings == null) {
|
if (tableSettings == null) {
|
||||||
logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("No table report settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("No table report settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +209,7 @@ public class ReportGenerator {
|
|||||||
FileReportSettings fileSettings = config.getFileReportSettings();
|
FileReportSettings fileSettings = config.getFileReportSettings();
|
||||||
if (fileSettings == null) {
|
if (fileSettings == null) {
|
||||||
logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("No file report settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("No file report settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +221,7 @@ public class ReportGenerator {
|
|||||||
settings = new PortableCaseReportModuleSettings();
|
settings = new PortableCaseReportModuleSettings();
|
||||||
} else if (!(settings instanceof PortableCaseReportModuleSettings)) {
|
} else if (!(settings instanceof PortableCaseReportModuleSettings)) {
|
||||||
logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("Invalid settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("Invalid settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,12 +229,11 @@ public class ReportGenerator {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
|
logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
|
||||||
progressPanel.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
progressIndicator.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
|
logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
|
||||||
progressPanel.updateStatusLabel("Exception while running report module " + moduleName);
|
progressIndicator.updateStatusLabel("Exception while running report module " + moduleName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -244,7 +251,7 @@ public class ReportGenerator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final JDialog dialog = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), true);
|
final JDialog dialog = new JDialog(WindowManager.getDefault().getMainWindow(), true);
|
||||||
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
||||||
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
|
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
|
||||||
dialog.add(this.reportGenerationPanel);
|
dialog.add(this.reportGenerationPanel);
|
||||||
@ -275,7 +282,7 @@ public class ReportGenerator {
|
|||||||
if (generalReportModule != null) {
|
if (generalReportModule != null) {
|
||||||
String reportDir = createReportDirectory(generalReportModule);
|
String reportDir = createReportDirectory(generalReportModule);
|
||||||
setupProgressPanel(generalReportModule, reportDir);
|
setupProgressPanel(generalReportModule, reportDir);
|
||||||
generalReportModule.generateReport(reportDir, progressPanel);
|
generalReportModule.generateReport(reportDir, progressIndicator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,11 +297,11 @@ public class ReportGenerator {
|
|||||||
String reportDir = createReportDirectory(tableReport);
|
String reportDir = createReportDirectory(tableReport);
|
||||||
setupProgressPanel(tableReport, reportDir);
|
setupProgressPanel(tableReport, reportDir);
|
||||||
tableReport.startReport(reportDir);
|
tableReport.startReport(reportDir);
|
||||||
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressPanel, tableReport);
|
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressIndicator, tableReport);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
tableReport.endReport();
|
tableReport.endReport();
|
||||||
// finish progress, wrap up
|
// finish progress, wrap up
|
||||||
progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
progressIndicator.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
||||||
errorList = generator.getErrorList();
|
errorList = generator.getErrorList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -315,34 +322,34 @@ public class ReportGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setupProgressPanel(fileReportModule, reportDir);
|
setupProgressPanel(fileReportModule, reportDir);
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||||
progressPanel.start();
|
progressIndicator.start();
|
||||||
progressPanel.updateStatusLabel(
|
progressIndicator.updateStatusLabel(
|
||||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
|
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AbstractFile> files = getFiles();
|
List<AbstractFile> files = getFiles();
|
||||||
int numFiles = files.size();
|
int numFiles = files.size();
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||||
fileReportModule.startReport(reportDir);
|
fileReportModule.startReport(reportDir);
|
||||||
fileReportModule.startTable(enabled);
|
fileReportModule.startTable(enabled);
|
||||||
}
|
}
|
||||||
progressPanel.setIndeterminate(false);
|
progressIndicator.setIndeterminate(false);
|
||||||
progressPanel.setMaximumProgress(numFiles);
|
progressIndicator.setMaximumProgress(numFiles);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// Add files to report.
|
// Add files to report.
|
||||||
for (AbstractFile file : files) {
|
for (AbstractFile file : files) {
|
||||||
// Check to see if any reports have been cancelled.
|
// Check to see if any reports have been cancelled.
|
||||||
if (progressPanel.getStatus() == ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() == ReportStatus.CANCELED) {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
fileReportModule.addRow(file, enabled);
|
fileReportModule.addRow(file, enabled);
|
||||||
progressPanel.increment();
|
progressIndicator.increment();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i % 100) == 0) {
|
if ((i % 100) == 0) {
|
||||||
progressPanel.updateStatusLabel(
|
progressIndicator.updateStatusLabel(
|
||||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
|
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
|
||||||
file.getName()));
|
file.getName()));
|
||||||
}
|
}
|
||||||
@ -351,7 +358,7 @@ public class ReportGenerator {
|
|||||||
|
|
||||||
fileReportModule.endTable();
|
fileReportModule.endTable();
|
||||||
fileReportModule.endReport();
|
fileReportModule.endReport();
|
||||||
progressPanel.complete(ReportStatus.COMPLETE);
|
progressIndicator.complete(ReportStatus.COMPLETE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,7 +369,7 @@ public class ReportGenerator {
|
|||||||
if (portableCaseReportModule != null) {
|
if (portableCaseReportModule != null) {
|
||||||
String reportDir = createReportDirectory(portableCaseReportModule);
|
String reportDir = createReportDirectory(portableCaseReportModule);
|
||||||
setupProgressPanel(portableCaseReportModule, reportDir);
|
setupProgressPanel(portableCaseReportModule, reportDir);
|
||||||
portableCaseReportModule.generateReport(reportDir, settings, progressPanel);
|
portableCaseReportModule.generateReport(reportDir, settings, progressIndicator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,7 +385,7 @@ public class ReportGenerator {
|
|||||||
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
|
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
|
||||||
return absFiles;
|
return absFiles;
|
||||||
} catch (TskCoreException | NoCurrentCaseException ex) {
|
} catch (TskCoreException | NoCurrentCaseException ex) {
|
||||||
progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
progressIndicator.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
||||||
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
|
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
|
||||||
return Collections.<AbstractFile>emptyList();
|
return Collections.<AbstractFile>emptyList();
|
||||||
}
|
}
|
||||||
|
@ -1,405 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy Forensic Browser
|
|
||||||
*
|
|
||||||
* Copyright 2011-2019 Basis Technology Corp.
|
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.sleuthkit.autopsy.report.infrastructure;
|
|
||||||
|
|
||||||
import org.openide.util.NbBundle;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Cursor;
|
|
||||||
import java.awt.Desktop;
|
|
||||||
import java.awt.EventQueue;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.awt.event.MouseListener;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A panel used by a report generation module to show progress.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
|
||||||
class ReportProgressDialog extends javax.swing.JPanel implements ReportProgressPanel {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportProgressDialog.class.getName());
|
|
||||||
private static final Color GREEN = new Color(50, 205, 50);
|
|
||||||
private static final Color RED = new Color(178, 34, 34);
|
|
||||||
private volatile ReportProgressPanel.ReportStatus status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a panel used by report generation module to show progress.
|
|
||||||
*/
|
|
||||||
ReportProgressDialog() {
|
|
||||||
initComponents();
|
|
||||||
reportProgressBar.setIndeterminate(true);
|
|
||||||
reportProgressBar.setMaximum(100);
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.progress.queuing"));
|
|
||||||
status = ReportStatus.QUEUING;
|
|
||||||
reportLabel.setText("");
|
|
||||||
pathLabel.setText(""); //NON-NLS
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets label text.
|
|
||||||
*
|
|
||||||
* @param reportName The name of the report being generated.
|
|
||||||
* @param reportPath The path to the report file.
|
|
||||||
*/
|
|
||||||
void setLabels(String reportName, String reportPath) {
|
|
||||||
reportLabel.setText(reportName);
|
|
||||||
if (null != reportPath) {
|
|
||||||
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
|
||||||
pathLabel.setToolTipText(reportPath);
|
|
||||||
String linkPath = reportPath;
|
|
||||||
pathLabel.addMouseListener(new MouseListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseClicked(MouseEvent mouseEvent) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mousePressed(MouseEvent mouseEvent) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseReleased(MouseEvent mouseEvent) {
|
|
||||||
File file = new File(linkPath);
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().open(file);
|
|
||||||
} catch (IOException ioex) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
|
||||||
} catch (IllegalArgumentException iaEx) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().open(file.getParentFile());
|
|
||||||
} catch (IOException ioEx2) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseEntered(MouseEvent e3) {
|
|
||||||
pathLabel.setForeground(Color.DARK_GRAY);
|
|
||||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseExited(MouseEvent e4) {
|
|
||||||
pathLabel.setForeground(Color.BLACK);
|
|
||||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.initPathLabel.noFile"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current status of the generation of the report.
|
|
||||||
*
|
|
||||||
* @return The report generation status as a ReportStatus enum.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ReportStatus getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the progress bar component of this panel.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void start() {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.start.progress.text"));
|
|
||||||
status = ReportStatus.RUNNING;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the maximum value of the progress bar component of this panel.
|
|
||||||
*
|
|
||||||
* @param max The maximum value.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setMaximumProgress(int max) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setMaximum(max);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Increments the current value of the progress bar component of this panel
|
|
||||||
* by one unit.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the current value of the progress bar component of this panel.
|
|
||||||
*
|
|
||||||
* @param value The value to be set.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setProgress(int value) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setValue(value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the the progress bar component of this panel to be determinate or
|
|
||||||
* indeterminate.
|
|
||||||
*
|
|
||||||
* @param indeterminate True if the progress bar should be set to
|
|
||||||
* indeterminate.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setIndeterminate(boolean indeterminate) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setIndeterminate(indeterminate);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the status message label component of this panel to show a given
|
|
||||||
* processing status message. For example, updateStatusLabel("Now processing
|
|
||||||
* files...") sets the label text to "Now processing files..."
|
|
||||||
*
|
|
||||||
* @param statusMessage String to use as label text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateStatusLabel(String statusMessage) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the final status of
|
|
||||||
* generation of the report.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus) {
|
|
||||||
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE:
|
|
||||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLbl.text"));
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLb2.text"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
complete(reportStatus, "");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the final status of
|
|
||||||
* generation of the report.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
* @param statusMessage String to use as label or error text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
reportProgressBar.setIndeterminate(false);
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE: {
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.COMPLETE;
|
|
||||||
statusMessageLabel.setForeground(Color.BLACK);
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(GREEN);
|
|
||||||
reportProgressBar.setString("Complete"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR: {
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.ERROR;
|
|
||||||
statusMessageLabel.setForeground(RED);
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(RED);
|
|
||||||
reportProgressBar.setString("Error"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate generation of the report was
|
|
||||||
* cancelled.
|
|
||||||
*/
|
|
||||||
void cancel() {
|
|
||||||
switch (status) {
|
|
||||||
case COMPLETE:
|
|
||||||
break;
|
|
||||||
case CANCELED:
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.CANCELED;
|
|
||||||
reportProgressBar.setIndeterminate(false);
|
|
||||||
reportProgressBar.setValue(0);
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(RED); // Red
|
|
||||||
reportProgressBar.setString("Cancelled"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
|
||||||
statusMessageLabel.setForeground(RED);
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.cancel.procLbl.text"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a shortened version of a file path.
|
|
||||||
*
|
|
||||||
* @param path The path to shorten.
|
|
||||||
*
|
|
||||||
* @return The shortened path.
|
|
||||||
*/
|
|
||||||
private String shortenPath(String path) {
|
|
||||||
if (path.length() > 100) {
|
|
||||||
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
|
||||||
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
|
||||||
} else {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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")
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
||||||
private void initComponents() {
|
|
||||||
|
|
||||||
reportProgressBar = new javax.swing.JProgressBar();
|
|
||||||
reportLabel = new javax.swing.JLabel();
|
|
||||||
pathLabel = new javax.swing.JLabel();
|
|
||||||
separationLabel = new javax.swing.JLabel();
|
|
||||||
statusMessageLabel = new javax.swing.JLabel();
|
|
||||||
|
|
||||||
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
setMinimumSize(new java.awt.Dimension(486, 68));
|
|
||||||
|
|
||||||
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
|
|
||||||
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.reportLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.pathLabel.text")); // NOI18N
|
|
||||||
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
|
||||||
|
|
||||||
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.separationLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.statusMessageLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
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()
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addComponent(reportLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(separationLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(reportLabel)
|
|
||||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(separationLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(statusMessageLabel)
|
|
||||||
.addGap(13, 13, 13))
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
private javax.swing.JLabel pathLabel;
|
|
||||||
private javax.swing.JLabel reportLabel;
|
|
||||||
private javax.swing.JProgressBar reportProgressBar;
|
|
||||||
private javax.swing.JLabel separationLabel;
|
|
||||||
private javax.swing.JLabel statusMessageLabel;
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the generation of the report
|
|
||||||
* is completed.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
public void complete() {
|
|
||||||
complete(ReportStatus.COMPLETE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.report.infrastructure;
|
||||||
|
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An adapter that adapts the ReportProgressPanel interface to the
|
||||||
|
* ProgressIndicator interface so that a given progress indicator can be used
|
||||||
|
* where a ReportProgressPanel is expected.
|
||||||
|
*/
|
||||||
|
public class ReportProgressIndicator extends ReportProgressPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private final ProgressIndicator progressIndicator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an adapter that adapts the ReportProgressPanel interface to
|
||||||
|
* the ProgressIndicator interface so that a given progress indicator can be
|
||||||
|
* used where a ReportProgressPanel is expected.
|
||||||
|
*
|
||||||
|
* @param progressIndicator The progress indicator tobe adapted.
|
||||||
|
*/
|
||||||
|
public ReportProgressIndicator(ProgressIndicator progressIndicator) {
|
||||||
|
this.progressIndicator = progressIndicator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLabels(String reportName, String reportPath) {
|
||||||
|
/*
|
||||||
|
* Not expected to be called, method exists for ReportGenerationPanel,
|
||||||
|
* which is not expected to be instantiated when this class is used.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.startMessage=Report generation started"
|
||||||
|
})
|
||||||
|
public void start() {
|
||||||
|
setStatus(ReportStatus.RUNNING);
|
||||||
|
progressIndicator.start(Bundle.ReportProgressIndicator_startMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate"
|
||||||
|
})
|
||||||
|
public void setMaximumProgress(int max) {
|
||||||
|
progressIndicator.switchToDeterminate(Bundle.ReportProgressIndicator_switchToDeterminateMessage(), 0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setProgress(int value) {
|
||||||
|
progressIndicator.progress(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate"
|
||||||
|
})
|
||||||
|
public void setIndeterminate(boolean indeterminate) {
|
||||||
|
progressIndicator.switchToIndeterminate(Bundle.ReportProgressIndicator_switchToIndeterminateMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateStatusLabel(String statusMessage) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
progressIndicator.progress(statusMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.completedMessage=Report generation completed",
|
||||||
|
"ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors",})
|
||||||
|
public void complete(ReportStatus reportStatus) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE: {
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_completedMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ERROR: {
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_completedWithErrorsMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
progressIndicator.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
progressIndicator.progress(statusMessage);
|
||||||
|
}
|
||||||
|
complete(reportStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.cancelledMessage=Report generation cancelled",})
|
||||||
|
public void cancel() {
|
||||||
|
switch (getStatus()) {
|
||||||
|
case COMPLETE:
|
||||||
|
break;
|
||||||
|
case CANCELED:
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
setStatus(ReportStatus.CANCELED);
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_cancelledMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,172 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy Forensic Browser
|
|
||||||
*
|
|
||||||
* Copyright 2019 Basis Technology Corp.
|
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.sleuthkit.autopsy.report.infrastructure;
|
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes progress and status messages to the application log.
|
|
||||||
*/
|
|
||||||
public class ReportProgressLogger implements ReportProgressPanel {
|
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportProgressLogger.class.getName());
|
|
||||||
private volatile ReportProgressPanel.ReportStatus status;
|
|
||||||
|
|
||||||
public ReportProgressLogger() {
|
|
||||||
status = ReportStatus.QUEUING;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current status of the generation of the report.
|
|
||||||
*
|
|
||||||
* @return The report generation status as a ReportStatus enum.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ReportStatus getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs that the report has been started.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void start() {
|
|
||||||
status = ReportStatus.RUNNING;
|
|
||||||
logger.log(Level.INFO, "Report started");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param max The maximum value.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setMaximumProgress(int max) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param value The value to be set.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setProgress(int value) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param indeterminate True if the progress bar should be set to
|
|
||||||
* indeterminate.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setIndeterminate(boolean indeterminate) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the status message.
|
|
||||||
*
|
|
||||||
* @param statusMessage String to use as label text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateStatusLabel(String statusMessage) {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
logger.log(Level.INFO, statusMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
* @param statusMessage String to use as label or error text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
|
||||||
if (!statusMessage.isEmpty()) {
|
|
||||||
logger.log(Level.INFO, statusMessage);
|
|
||||||
}
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE: {
|
|
||||||
status = ReportStatus.COMPLETE;
|
|
||||||
logger.log(Level.INFO, "Report completed");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR: {
|
|
||||||
status = ReportStatus.ERROR;
|
|
||||||
logger.log(Level.INFO, "Report completed with errors");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus) {
|
|
||||||
complete(reportStatus, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs that the generation of the report was cancelled.
|
|
||||||
*/
|
|
||||||
void cancel() {
|
|
||||||
switch (status) {
|
|
||||||
case COMPLETE:
|
|
||||||
break;
|
|
||||||
case CANCELED:
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
status = ReportStatus.CANCELED;
|
|
||||||
logger.log(Level.INFO, "Report cancelled");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
public void complete() {
|
|
||||||
complete(ReportStatus.COMPLETE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,19 +1,19 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-2018 Basis Technology Corp.
|
* Copyright 2013-2018 Basis Technology Corp.
|
||||||
*
|
*
|
||||||
* Copyright 2012 42six Solutions.
|
* Copyright 2012 42six Solutions.
|
||||||
* Contact: aebadirad <at> 42six <dot> com
|
* Contact: aebadirad <at> 42six <dot> com
|
||||||
* Project Contact/Architect: carrier <at> sleuthkit <dot> org
|
* Project Contact/Architect: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
@ -74,10 +74,11 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
* reporting wizard. When the wizard is finished, create a ReportGenerator
|
* reporting wizard. When the wizard is finished, create a ReportGenerator
|
||||||
* with the wizard information, and start all necessary reports.
|
* with the wizard information, and start all necessary reports.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration to use
|
* @param configName Name of the reporting configuration to use
|
||||||
* @param displayCaseSpecificData Flag whether to use case specific data in
|
* @param displayCaseSpecificData Flag whether to use case specific data in
|
||||||
* UI panels or to use all possible result types
|
* UI panels or to use all possible result
|
||||||
* @param runReports Flag whether to produce report(s)
|
* types
|
||||||
|
* @param runReports Flag whether to produce report(s)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static void doReportWizard(String configName, boolean displayCaseSpecificData, boolean runReports) {
|
public static void doReportWizard(String configName, boolean displayCaseSpecificData, boolean runReports) {
|
||||||
@ -92,7 +93,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
} catch (ReportConfigException ex) {
|
} catch (ReportConfigException ex) {
|
||||||
logger.log(Level.SEVERE, "Failed to save reporting configuration " + configName, ex); //NON-NLS
|
logger.log(Level.SEVERE, "Failed to save reporting configuration " + configName, ex); //NON-NLS
|
||||||
NotifyDescriptor descriptor = new NotifyDescriptor.Message(
|
NotifyDescriptor descriptor = new NotifyDescriptor.Message(
|
||||||
NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.unableToSaveConfig.errorLabel.text"),
|
NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.unableToSaveConfig.errorLabel.text"),
|
||||||
NotifyDescriptor.ERROR_MESSAGE);
|
NotifyDescriptor.ERROR_MESSAGE);
|
||||||
DialogDisplayer.getDefault().notify(descriptor);
|
DialogDisplayer.getDefault().notify(descriptor);
|
||||||
}
|
}
|
||||||
@ -110,6 +111,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings(value = "unchecked")
|
||||||
private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
|
private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
|
||||||
|
|
||||||
ReportingConfig reportingConfig = new ReportingConfig(configName);
|
ReportingConfig reportingConfig = new ReportingConfig(configName);
|
||||||
|
@ -55,11 +55,14 @@ final class ReportingConfigLoader {
|
|||||||
* an atomic, thread safe way.
|
* an atomic, thread safe way.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration
|
* @param configName Name of the reporting configuration
|
||||||
|
*
|
||||||
* @return ReportingConfig object if a persisted configuration exists, null
|
* @return ReportingConfig object if a persisted configuration exists, null
|
||||||
* otherwise
|
* otherwise
|
||||||
|
*
|
||||||
* @throws ReportConfigException if an error occurred while reading the
|
* @throws ReportConfigException if an error occurred while reading the
|
||||||
* configuration
|
* configuration
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
|
static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
|
||||||
|
|
||||||
// construct the configuration directory path
|
// construct the configuration directory path
|
||||||
@ -77,7 +80,7 @@ final class ReportingConfigLoader {
|
|||||||
|
|
||||||
// read in the configuration
|
// read in the configuration
|
||||||
ReportingConfig config = new ReportingConfig(configName);
|
ReportingConfig config = new ReportingConfig(configName);
|
||||||
|
|
||||||
// read table report settings
|
// read table report settings
|
||||||
String filePath = reportDirPath.toString() + File.separator + TABLE_REPORT_CONFIG_FILE;
|
String filePath = reportDirPath.toString() + File.separator + TABLE_REPORT_CONFIG_FILE;
|
||||||
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
||||||
@ -85,7 +88,7 @@ final class ReportingConfigLoader {
|
|||||||
} catch (IOException | ClassNotFoundException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
throw new ReportConfigException("Unable to read table report settings " + filePath, ex);
|
throw new ReportConfigException("Unable to read table report settings " + filePath, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read file report settings
|
// read file report settings
|
||||||
filePath = reportDirPath.toString() + File.separator + FILE_REPORT_CONFIG_FILE;
|
filePath = reportDirPath.toString() + File.separator + FILE_REPORT_CONFIG_FILE;
|
||||||
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
||||||
@ -93,7 +96,7 @@ final class ReportingConfigLoader {
|
|||||||
} catch (IOException | ClassNotFoundException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
throw new ReportConfigException("Unable to read file report settings " + filePath, ex);
|
throw new ReportConfigException("Unable to read file report settings " + filePath, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read map of module configuration objects
|
// read map of module configuration objects
|
||||||
Map<String, ReportModuleConfig> moduleConfigs = null;
|
Map<String, ReportModuleConfig> moduleConfigs = null;
|
||||||
filePath = reportDirPath.toString() + File.separator + MODULE_CONFIG_FILE;
|
filePath = reportDirPath.toString() + File.separator + MODULE_CONFIG_FILE;
|
||||||
@ -102,11 +105,11 @@ final class ReportingConfigLoader {
|
|||||||
} catch (IOException | ClassNotFoundException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
throw new ReportConfigException("Unable to read module configurations map " + filePath, ex);
|
throw new ReportConfigException("Unable to read module configurations map " + filePath, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moduleConfigs == null || moduleConfigs.isEmpty()) {
|
if (moduleConfigs == null || moduleConfigs.isEmpty()) {
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
// read each ReportModuleSettings object individually
|
// read each ReportModuleSettings object individually
|
||||||
for (Iterator<Entry<String, ReportModuleConfig>> iterator = moduleConfigs.entrySet().iterator(); iterator.hasNext();) {
|
for (Iterator<Entry<String, ReportModuleConfig>> iterator = moduleConfigs.entrySet().iterator(); iterator.hasNext();) {
|
||||||
ReportModuleConfig moduleConfig = iterator.next().getValue();
|
ReportModuleConfig moduleConfig = iterator.next().getValue();
|
||||||
@ -114,16 +117,19 @@ final class ReportingConfigLoader {
|
|||||||
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
||||||
moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
|
moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
|
||||||
} catch (IOException | ClassNotFoundException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
/* NOTE: we do not want to re-throw the exception because we do not
|
/*
|
||||||
want a single error while reading in a (3rd party) report module
|
* NOTE: we do not want to re-throw the exception because we do
|
||||||
to prevent us from reading the entire reporting configuration.*/
|
* not want a single error while reading in a (3rd party) report
|
||||||
|
* module to prevent us from reading the entire reporting
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
|
logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config.setModuleConfigs(moduleConfigs);
|
config.setModuleConfigs(moduleConfigs);
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,15 +138,16 @@ final class ReportingConfigLoader {
|
|||||||
* an atomic, thread safe way.
|
* an atomic, thread safe way.
|
||||||
*
|
*
|
||||||
* @param reportConfig ReportingConfig object to serialize to disk
|
* @param reportConfig ReportingConfig object to serialize to disk
|
||||||
|
*
|
||||||
* @throws ReportConfigException if an error occurred while saving the
|
* @throws ReportConfigException if an error occurred while saving the
|
||||||
* configuration
|
* configuration
|
||||||
*/
|
*/
|
||||||
static synchronized void saveConfig(ReportingConfig reportConfig) throws ReportConfigException {
|
static synchronized void saveConfig(ReportingConfig reportConfig) throws ReportConfigException {
|
||||||
|
|
||||||
if (reportConfig == null) {
|
if (reportConfig == null) {
|
||||||
throw new ReportConfigException("Reporting configuration is NULL");
|
throw new ReportConfigException("Reporting configuration is NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct the configuration directory path
|
// construct the configuration directory path
|
||||||
Path pathToConfigDir = Paths.get(ReportingConfigLoader.REPORT_CONFIG_FOLDER_PATH, reportConfig.getName());
|
Path pathToConfigDir = Paths.get(ReportingConfigLoader.REPORT_CONFIG_FOLDER_PATH, reportConfig.getName());
|
||||||
|
|
||||||
@ -168,7 +175,7 @@ final class ReportingConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save map of module configuration objects
|
// save map of module configuration objects
|
||||||
filePath = pathToConfigDir.toString() + File.separator + MODULE_CONFIG_FILE;
|
filePath = pathToConfigDir.toString() + File.separator + MODULE_CONFIG_FILE;
|
||||||
try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(filePath))) {
|
try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(filePath))) {
|
||||||
out.writeObject(reportConfig.getModuleConfigs());
|
out.writeObject(reportConfig.getModuleConfigs());
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
@ -176,10 +183,13 @@ final class ReportingConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save each ReportModuleSettings object individually
|
// save each ReportModuleSettings object individually
|
||||||
/* NOTE: This is done to protect us from errors in reading/writing 3rd
|
/*
|
||||||
party report module settings. If we were to serialize the entire ReportingConfig
|
* NOTE: This is done to protect us from errors in reading/writing 3rd
|
||||||
object, then a single error while reading in a 3rd party report module
|
* party report module settings. If we were to serialize the entire
|
||||||
would prevent us from reading the entire reporting configuration.*/
|
* ReportingConfig object, then a single error while reading in a 3rd
|
||||||
|
* party report module would prevent us from reading the entire
|
||||||
|
* reporting configuration.
|
||||||
|
*/
|
||||||
if (reportConfig.getModuleConfigs() == null) {
|
if (reportConfig.getModuleConfigs() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
|||||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import static org.sleuthkit.autopsy.casemodule.services.TagsManager.getNotableTagLabel;
|
import static org.sleuthkit.autopsy.casemodule.services.TagsManager.getNotableTagLabel;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Account;
|
import org.sleuthkit.datamodel.Account;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
@ -60,6 +60,7 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TagName;
|
import org.sleuthkit.datamodel.TagName;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
class TableReportGenerator {
|
class TableReportGenerator {
|
||||||
|
|
||||||
@ -80,10 +81,10 @@ class TableReportGenerator {
|
|||||||
this.progressPanel = progressPanel;
|
this.progressPanel = progressPanel;
|
||||||
this.tableReport = tableReport;
|
this.tableReport = tableReport;
|
||||||
this.columnHeaderMap = new HashMap<>();
|
this.columnHeaderMap = new HashMap<>();
|
||||||
errorList = new ArrayList<>();
|
errorList = new ArrayList<>();
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getAllExistingTags() throws NoCurrentCaseException, TskCoreException {
|
private void getAllExistingTags() throws NoCurrentCaseException, TskCoreException {
|
||||||
List<String> tagNames = new ArrayList<>();
|
List<String> tagNames = new ArrayList<>();
|
||||||
|
|
||||||
@ -98,6 +99,7 @@ class TableReportGenerator {
|
|||||||
tagNamesFilter = new HashSet<>(tagNames);
|
tagNamesFilter = new HashSet<>(tagNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
|
private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
|
||||||
// get all possible artifact types
|
// get all possible artifact types
|
||||||
ArrayList<BlackboardArtifact.Type> doNotReport = new ArrayList<>();
|
ArrayList<BlackboardArtifact.Type> doNotReport = new ArrayList<>();
|
||||||
@ -116,7 +118,7 @@ class TableReportGenerator {
|
|||||||
|
|
||||||
progressPanel.start();
|
progressPanel.start();
|
||||||
progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.readingTagsArtifacts.text"));
|
progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.readingTagsArtifacts.text"));
|
||||||
|
|
||||||
if (settings.useStoredTagsAndArtifactsLists()) {
|
if (settings.useStoredTagsAndArtifactsLists()) {
|
||||||
// Get the artifact types selected by the user.
|
// Get the artifact types selected by the user.
|
||||||
artifactTypes = settings.getArtifactSelections();
|
artifactTypes = settings.getArtifactSelections();
|
||||||
@ -130,7 +132,7 @@ class TableReportGenerator {
|
|||||||
if (settings.getSelectedReportOption() == TableReportSettings.TableReportOption.ALL_TAGGED_RESULTS) {
|
if (settings.getSelectedReportOption() == TableReportSettings.TableReportOption.ALL_TAGGED_RESULTS) {
|
||||||
getAllExistingTags();
|
getAllExistingTags();
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all possible artifact types
|
// get all possible artifact types
|
||||||
getAllExistingArtiactTypes();
|
getAllExistingArtiactTypes();
|
||||||
} catch (NoCurrentCaseException | TskCoreException ex) {
|
} catch (NoCurrentCaseException | TskCoreException ex) {
|
||||||
@ -139,11 +141,11 @@ class TableReportGenerator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the progress indicators for each active TableReportModule.
|
// Start the progress indicators for each active TableReportModule.
|
||||||
progressPanel.setIndeterminate(false);
|
progressPanel.setIndeterminate(false);
|
||||||
progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); // +2 for content and blackboard artifact tags
|
progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); // +2 for content and blackboard artifact tags
|
||||||
|
|
||||||
// report on the blackboard results
|
// report on the blackboard results
|
||||||
if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
|
if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
|
||||||
makeBlackboardArtifactTables();
|
makeBlackboardArtifactTables();
|
||||||
|
@ -35,9 +35,9 @@ import org.sleuthkit.autopsy.casemodule.Case;
|
|||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
||||||
import org.sleuthkit.datamodel.*;
|
import org.sleuthkit.datamodel.*;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BodyFileReport generates a report in the body file format specified on The
|
* BodyFileReport generates a report in the body file format specified on The
|
||||||
|
@ -43,7 +43,6 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifactTag;
|
import org.sleuthkit.datamodel.BlackboardArtifactTag;
|
||||||
@ -55,6 +54,7 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
import org.sleuthkit.datamodel.TagName;
|
import org.sleuthkit.datamodel.TagName;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates CASE-UCO report file for a data source
|
* Generates CASE-UCO report file for a data source
|
||||||
|
@ -46,8 +46,8 @@ import org.jdom2.CDATA;
|
|||||||
import org.openide.filesystems.FileUtil;
|
import org.openide.filesystems.FileUtil;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.report.ReportBranding;
|
import org.sleuthkit.autopsy.report.ReportBranding;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
|
import org.sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a KML file based on geospatial information from the BlackBoard.
|
* Generates a KML file based on geospatial information from the BlackBoard.
|
||||||
|
@ -43,7 +43,6 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
|||||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory;
|
import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoFormatExporter;
|
import org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoFormatExporter;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
@ -63,6 +62,7 @@ import org.sleuthkit.datamodel.TskDataException;
|
|||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
import org.sleuthkit.datamodel.Volume;
|
import org.sleuthkit.datamodel.Volume;
|
||||||
import org.sleuthkit.datamodel.VolumeSystem;
|
import org.sleuthkit.datamodel.VolumeSystem;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a portable case from tagged files
|
* Creates a portable case from tagged files
|
||||||
|
@ -57,9 +57,9 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
|||||||
import org.sleuthkit.autopsy.report.GeneralReportModule;
|
import org.sleuthkit.autopsy.report.GeneralReportModule;
|
||||||
import org.sleuthkit.autopsy.report.NoReportModuleSettings;
|
import org.sleuthkit.autopsy.report.NoReportModuleSettings;
|
||||||
import org.sleuthkit.autopsy.report.ReportModuleSettings;
|
import org.sleuthkit.autopsy.report.ReportModuleSettings;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -32,12 +32,12 @@ import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb;
|
|||||||
import org.sleuthkit.autopsy.report.GeneralReportModule;
|
import org.sleuthkit.autopsy.report.GeneralReportModule;
|
||||||
import org.sleuthkit.autopsy.report.NoReportModuleSettings;
|
import org.sleuthkit.autopsy.report.NoReportModuleSettings;
|
||||||
import org.sleuthkit.autopsy.report.ReportModuleSettings;
|
import org.sleuthkit.autopsy.report.ReportModuleSettings;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.ContentTag;
|
import org.sleuthkit.datamodel.ContentTag;
|
||||||
import org.sleuthkit.datamodel.TagName;
|
import org.sleuthkit.datamodel.TagName;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instances of this class plug in to the reporting infrastructure to provide a
|
* Instances of this class plug in to the reporting infrastructure to provide a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user