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)