19 package org.sleuthkit.autopsy.report.infrastructure;
 
   27 import java.awt.event.ActionEvent;
 
   28 import java.awt.event.ActionListener;
 
   29 import java.awt.event.WindowAdapter;
 
   30 import java.awt.event.WindowEvent;
 
   32 import java.io.IOException;
 
   33 import java.text.DateFormat;
 
   34 import java.text.SimpleDateFormat;
 
   35 import java.util.ArrayList;
 
   36 import java.util.Collections;
 
   37 import java.util.Date;
 
   38 import java.util.HashMap;
 
   39 import java.util.List;
 
   41 import java.util.Map.Entry;
 
   42 import java.util.logging.Level;
 
   43 import javax.swing.JDialog;
 
   44 import org.openide.filesystems.FileUtil;
 
   45 import org.openide.util.NbBundle;
 
   46 import org.openide.windows.WindowManager;
 
   68     private static final String 
REPORT_PATH_FMT_STR = 
"%s" + File.separator + 
"%s %s %s" + File.separator;
 
   88         if (!errorList.isEmpty()) {
 
   89             String errorString = 
"";
 
   90             for (String error : errorList) {
 
   91                 errorString += error + 
"\n";
 
  107         this.reportGenerationPanel = null;
 
  120         this.reportGenerationPanel = panel;
 
  121         this.progressIndicator = panel.getProgressPanel();
 
  134         Map<String, ReportModule> modules = 
new HashMap<>();
 
  154         "ReportGenerator.error.noReportModules=No report modules found",
 
  155         "# {0} - report configuration name", 
"ReportGenerator.error.unableToLoadConfig=Unable to load reporting configuration {0}.",
 
  156         "# {0} - report module name", 
"ReportGenerator.error.moduleNotFound=Report module {0} not found",
 
  157         "# {0} - report module name", 
"ReportGenerator.error.noTableReportSettings=No table report settings for report module {0}",
 
  158         "# {0} - report module name", 
"ReportGenerator.error.noFileReportSettings=No file report settings for report module {0}",
 
  159         "# {0} - report module name", 
"ReportGenerator.error.invalidSettings=Invalid settings for report module {0}",
 
  160         "# {0} - report module name", 
"ReportGenerator.error.unsupportedType=Report module {0} has unsupported report module type",
 
  161         "# {0} - report module name", 
"ReportGenerator.error.exception=Exception while running report module {0}"})
 
  175         if (modules == null || modules.isEmpty()) {
 
  176             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noReportModules());
 
  177             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_noReportModules());
 
  181         ReportingConfig config = null;
 
  183             config = ReportingConfigLoader.loadConfig(configName);
 
  184         } 
catch (ReportConfigException ex) {
 
  185             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unableToLoadConfig(configName), ex);
 
  186             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_unableToLoadConfig(configName));
 
  190         if (config == null) {
 
  191             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unableToLoadConfig(configName));
 
  192             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_unableToLoadConfig(configName));
 
  198             for (Map.Entry<String, ReportModuleConfig> entry : config.getModuleConfigs().entrySet()) {
 
  199                 ReportModuleConfig moduleConfig = entry.getValue();
 
  200                 if (moduleConfig == null || !moduleConfig.isEnabled()) {
 
  205                 String moduleName = entry.getKey();
 
  207                 if (module == null) {
 
  208                     logger.log(Level.SEVERE, Bundle.ReportGenerator_error_moduleNotFound(moduleName));
 
  209                     progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_moduleNotFound(moduleName));
 
  215                 if (settings == null) {
 
  233                         TableReportSettings tableSettings = config.getTableReportSettings();
 
  234                         if (tableSettings == null) {
 
  235                             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noTableReportSettings(moduleName)); 
 
  236                             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_noTableReportSettings(moduleName));
 
  245                         FileReportSettings fileSettings = config.getFileReportSettings();
 
  246                         if (fileSettings == null) {
 
  247                             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noFileReportSettings(moduleName));
 
  248                             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_noFileReportSettings(moduleName));
 
  259                             logger.log(Level.SEVERE, Bundle.ReportGenerator_error_invalidSettings(moduleName)); 
 
  260                             progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_invalidSettings(moduleName));
 
  267                         logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unsupportedType(moduleName)); 
 
  268                         progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_unsupportedType(moduleName));
 
  270                 } 
catch (IOException e) {
 
  271                     logger.log(Level.SEVERE, Bundle.ReportGenerator_error_exception(moduleName)); 
 
  272                     progressIndicator.
updateStatusLabel(Bundle.ReportGenerator_error_exception(moduleName));
 
  285     void displayProgressPanel() {
 
  286         if (reportGenerationPanel == null) {
 
  290         final JDialog dialog = 
new JDialog(WindowManager.getDefault().getMainWindow(), 
true);
 
  291         dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
 
  292         dialog.setTitle(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.displayProgress.title.text"));
 
  293         dialog.add(this.reportGenerationPanel);
 
  296         reportGenerationPanel.addCloseAction(
new ActionListener() {
 
  298             public void actionPerformed(ActionEvent e) {
 
  303         dialog.addWindowListener(
new WindowAdapter() {
 
  305             public void windowClosing(WindowEvent e) {
 
  306                 reportGenerationPanel.close();
 
  310         dialog.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
 
  311         dialog.setVisible(
true);
 
  318         if (generalReportModule != null) {
 
  321             reportSettings.setReportDirectoryPath(reportDir);
 
  322             generalReportModule.generateReport(reportSettings, progressIndicator);
 
  333         if (tableReport != null && tableReportSettings != null && null != tableReportSettings.getArtifactSelections()) {
 
  336             tableReport.startReport(reportDir);
 
  337             TableReportGenerator generator = 
new TableReportGenerator(tableReportSettings, progressIndicator, tableReport);
 
  339             tableReport.endReport();
 
  342             errorList = generator.getErrorList();
 
  349             progressIndicator.
complete(finalStatus);
 
  360         if (fileReportModule != null && fileReportSettings != null && null != fileReportSettings.getFileProperties()) {
 
  362             List<FileReportDataTypes> enabled = 
new ArrayList<>();
 
  363             for (Entry<FileReportDataTypes, Boolean> e : fileReportSettings.getFileProperties().entrySet()) {
 
  365                     enabled.add(e.getKey());
 
  370                 progressIndicator.
start();
 
  372                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.queryingDb.text"));
 
  375             List<AbstractFile> files = 
getFiles();
 
  376             int numFiles = files.size();
 
  378                 fileReportModule.startReport(reportDir);
 
  379                 fileReportModule.startTable(enabled);
 
  395                     fileReportModule.addRow(file, enabled);
 
  399                 if ((i % 100) == 0) {
 
  401                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingFile.text",
 
  407             fileReportModule.endTable();
 
  408             fileReportModule.endReport();
 
  414         if (fileReportSettings.getSelectedDataSources() == null) {
 
  425         if (portableCaseReportModule != null) {
 
  428             portableCaseReportModule.generateReport(reportDir, settings, progressIndicator);
 
  438         List<AbstractFile> absFiles;
 
  444             progressIndicator.
updateStatusLabel(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
 
  445             logger.log(Level.SEVERE, 
"failed to generate reports. Unable to get all files in the image.", ex); 
 
  451         if (reportGenerationPanel != null) {
 
  453             if (reportFilePath == null) {
 
  454                 reportGenerationPanel.addReport(module.
getName(), null);
 
  455             } 
else if (reportFilePath.isEmpty()) {
 
  456                 reportGenerationPanel.addReport(module.
getName(), reportDir);
 
  458                 reportGenerationPanel.addReport(module.
getName(), reportDir + reportFilePath);
 
  468             throw new IOException(
"Exception while getting open case.", ex);
 
  471         DateFormat dateFormat = 
new SimpleDateFormat(
"MM-dd-yyyy-HH-mm-ss");
 
  472         Date date = 
new Date();
 
  473         String dateNoTime = dateFormat.format(date);
 
  477             FileUtil.createFolder(
new File(reportPath));
 
  478         } 
catch (IOException ex) {
 
  479             throw new IOException(
"Failed to make report folder, unable to generate reports.", ex);
 
void generatePortableCaseReport(PortableCaseReportModule portableCaseReportModule, PortableCaseReportModuleSettings settings)
static final String REPORTS_DIR
void generateTableReport(TableReportModule tableReport, TableReportSettings tableReportSettings)
final ReportGenerationPanel reportGenerationPanel
final ReportProgressPanel progressIndicator
void complete(ReportStatus reportStatus)
void generateFileListReport(FileReportModule fileReportModule, FileReportSettings fileReportSettings)
static String getReportsDirectory()
long getDataSourceObjectId()
String getReportDirectory()
static final Logger logger
List< AbstractFile > getFiles()
void setIndeterminate(boolean indeterminate)
default ReportModuleSettings getDefaultConfiguration()
ReportGenerator(String configName, ReportProgressIndicator progressIndicator)
default void setConfiguration(ReportModuleSettings settings)
void generateGeneralReport(GeneralReportModule generalReportModule, GeneralReportSettings reportSettings)
void displayReportErrors()
boolean shouldFilterFromReport(AbstractFile file, FileReportSettings fileReportSettings)
String getRelativeFilePath()
void generateReports(Map< String, ReportModule > modules)
void setMaximumProgress(int max)
SleuthkitCase getSleuthkitCase()
void setupProgressPanel(ReportModule module, String reportDir)
List< AbstractFile > findAllFilesWhere(String sqlWhereClause)
synchronized static Logger getLogger(String name)
static String createReportDirectory(ReportModule module)
static Case getCurrentCaseThrows()
void updateStatusLabel(String statusMessage)
static final String REPORT_PATH_FMT_STR
static String normalize(String canonicalClassName)