19 package org.sleuthkit.autopsy.report;
 
   21 import java.awt.Dimension;
 
   22 import java.awt.Toolkit;
 
   23 import java.awt.event.ActionEvent;
 
   24 import java.awt.event.ActionListener;
 
   25 import java.awt.event.WindowAdapter;
 
   26 import java.awt.event.WindowEvent;
 
   28 import java.io.IOException;
 
   29 import java.text.DateFormat;
 
   30 import java.text.SimpleDateFormat;
 
   31 import java.util.ArrayList;
 
   32 import java.util.Collections;
 
   33 import java.util.Date;
 
   34 import java.util.List;
 
   36 import java.util.Map.Entry;
 
   37 import java.util.concurrent.ExecutionException;
 
   38 import java.util.logging.Level;
 
   39 import javax.swing.JDialog;
 
   40 import javax.swing.JFrame;
 
   41 import javax.swing.SwingWorker;
 
   42 import org.openide.filesystems.FileUtil;
 
   43 import org.openide.util.NbBundle;
 
   44 import org.openide.windows.WindowManager;
 
   55 class ReportGenerator {
 
   57     private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
 
   59     private Case currentCase = Case.getCurrentCase();
 
   64     private ReportProgressPanel progressPanel;
 
   66     private final String reportPath;
 
   67     private final ReportGenerationPanel reportGenerationPanel = 
new ReportGenerationPanel();
 
   69     static final String REPORTS_DIR = 
"Reports"; 
 
   71     private List<String> errorList;
 
   77     private void displayReportErrors() {
 
   78         if (!errorList.isEmpty()) {
 
   79             String errorString = 
"";
 
   80             for (String error : errorList) {
 
   81                 errorString += error + 
"\n";
 
   83             MessageNotifyUtil.Notify.error(
 
   84                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.notifyErr.errsDuringRptGen"), errorString);
 
   93         DateFormat dateFormat = 
new SimpleDateFormat(
"MM-dd-yyyy-HH-mm-ss");
 
   94         Date date = 
new Date();
 
   95         String dateNoTime = dateFormat.format(date);
 
   96         this.reportPath = currentCase.getReportDirectory() + File.separator + currentCase.getDisplayName() + 
" " + dateNoTime + File.separator;
 
   98         this.errorList = 
new ArrayList<>();
 
  102             FileUtil.createFolder(
new File(this.reportPath));
 
  103         } 
catch (IOException ex) {
 
  104             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedMakeRptFolder"));
 
  105             logger.log(Level.SEVERE, 
"Failed to make report folder, may be unable to generate reports.", ex); 
 
  113     private void displayProgressPanel() {
 
  114         final JDialog dialog = 
new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), 
true);
 
  115         dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
 
  116         dialog.setTitle(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.displayProgress.title.text"));
 
  117         dialog.add(this.reportGenerationPanel);
 
  120         reportGenerationPanel.addCloseAction(
new ActionListener() {
 
  122             public void actionPerformed(ActionEvent e) {
 
  127         dialog.addWindowListener(
new WindowAdapter() {
 
  129             public void windowClosing(WindowEvent e) {
 
  130                 reportGenerationPanel.close();
 
  134         Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
 
  135         int w = dialog.getSize().width;
 
  136         int h = dialog.getSize().height;
 
  139         dialog.setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2);
 
  140         dialog.setVisible(
true);
 
  146     void generateGeneralReport(GeneralReportModule generalReportModule) {
 
  147         if (generalReportModule != null) {
 
  148             setupProgressPanel(generalReportModule);
 
  149             ReportWorker worker = 
new ReportWorker(() -> {
 
  150                 generalReportModule.generateReport(reportPath, progressPanel);
 
  153             displayProgressPanel();
 
  165     void generateTableReport(TableReportModule tableReport, Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections) {
 
  166         if (tableReport != null && null != artifactTypeSelections) {
 
  167             setupProgressPanel(tableReport);
 
  168             ReportWorker worker = 
new ReportWorker(() -> {
 
  169                 tableReport.startReport(reportPath);
 
  170                 TableReportGenerator generator = 
new TableReportGenerator(artifactTypeSelections, tagNameSelections, progressPanel, tableReport);
 
  172                 tableReport.endReport();
 
  174                 progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
 
  175                 errorList = generator.getErrorList();
 
  178             displayProgressPanel();
 
  188     void generateFileListReport(FileReportModule fileReportModule, Map<FileReportDataTypes, Boolean> enabledInfo) {
 
  189         if (fileReportModule != null && null != enabledInfo) {
 
  190             List<FileReportDataTypes> enabled = 
new ArrayList<>();
 
  191             for (Entry<FileReportDataTypes, Boolean> e : enabledInfo.entrySet()) {
 
  193                     enabled.add(e.getKey());
 
  196             setupProgressPanel(fileReportModule);
 
  197             ReportWorker worker = 
new ReportWorker(() -> {
 
  198                 if (progressPanel.getStatus() != ReportStatus.CANCELED) {
 
  199                     progressPanel.start();
 
  200                     progressPanel.updateStatusLabel(
 
  201                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.queryingDb.text"));
 
  204                 List<AbstractFile> files = getFiles();
 
  205                 int numFiles = files.size();
 
  206                 if (progressPanel.getStatus() != ReportStatus.CANCELED) {
 
  207                     fileReportModule.startReport(reportPath);
 
  208                     fileReportModule.startTable(enabled);
 
  210                 progressPanel.setIndeterminate(
false);
 
  211                 progressPanel.setMaximumProgress(numFiles);
 
  215                 for (AbstractFile file : files) {
 
  217                     if (progressPanel.getStatus() == ReportStatus.CANCELED) {
 
  220                         fileReportModule.addRow(file, enabled);
 
  221                         progressPanel.increment();
 
  224                     if ((i % 100) == 0) {
 
  225                         progressPanel.updateStatusLabel(
 
  226                                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingFile.text",
 
  232                 fileReportModule.endTable();
 
  233                 fileReportModule.endReport();
 
  234                 progressPanel.complete(ReportStatus.COMPLETE);
 
  237             displayProgressPanel();
 
  246     private List<AbstractFile> getFiles() {
 
  247         List<AbstractFile> absFiles;
 
  249             SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
 
  250             absFiles = skCase.findAllFilesWhere(
"meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); 
 
  252         } 
catch (TskCoreException ex) {
 
  253             MessageNotifyUtil.Notify.show(
 
  254                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errors.reportErrorTitle"),
 
  255                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage(),
 
  256                     MessageNotifyUtil.MessageType.ERROR);
 
  257             logger.log(Level.SEVERE, 
"failed to generate reports. Unable to get all files in the image.", ex); 
 
  258             return Collections.<AbstractFile>emptyList();
 
  262     private void setupProgressPanel(ReportModule module) {
 
  263         String reportFilePath = module.getRelativeFilePath();
 
  264         if (!reportFilePath.isEmpty()) {
 
  265             this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportPath + reportFilePath);
 
  267             this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
 
  281             doInBackground.run();
 
  289             } 
catch (InterruptedException | ExecutionException ex) {
 
  291                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errors.reportErrorTitle"),
 
  292                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage(),
 
  294                 logger.log(Level.SEVERE, 
"failed to generate reports", ex); 
 
  296             catch (java.util.concurrent.CancellationException ex) {
 
  298                 displayReportErrors();
 
static void show(String title, String message, MessageType type, ActionListener actionListener)
 
final Runnable doInBackground
 
ReportWorker(Runnable doInBackground)