19 package org.sleuthkit.autopsy.casemodule;
21 import java.awt.Color;
22 import java.awt.Cursor;
23 import java.awt.EventQueue;
24 import java.awt.Window;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.HashSet;
28 import java.util.Iterator;
29 import java.util.List;
31 import java.util.UUID;
32 import java.util.logging.Level;
33 import javax.swing.JOptionPane;
34 import javax.swing.SwingUtilities;
35 import javax.swing.event.ChangeEvent;
36 import javax.swing.event.ChangeListener;
37 import org.openide.WizardDescriptor;
38 import org.openide.util.HelpCtx;
39 import org.openide.util.Lookup;
40 import org.openide.util.NbBundle;
41 import org.openide.windows.WindowManager;
60 class AddImageWizardAddingProgressPanel
extends ShortcutWizardDescriptorPanel {
62 private boolean readyToIngest =
false;
64 private AddImageAction.CleanupTask cleanupTask;
66 private final AddImageAction addImageAction;
68 private DataSourceProcessor dsProcessor = null;
69 private boolean cancelled;
74 private boolean imgAdded =
false;
75 private boolean ingested =
false;
80 private AddImageWizardAddingProgressVisual component;
81 private final Set<ChangeListener> listeners =
new HashSet<>(1);
82 private final List<Content> newContents = Collections.synchronizedList(
new ArrayList<Content>());
83 private final DSPProgressMonitorImpl dspProgressMonitorImpl =
new DSPProgressMonitorImpl();
84 private IngestJobSettings ingestJobSettings;
86 AddImageWizardAddingProgressPanel(AddImageAction action) {
87 this.addImageAction = action;
90 DSPProgressMonitorImpl getDSPProgressMonitorImpl() {
91 return dspProgressMonitorImpl;
99 EventQueue.invokeLater(
new Runnable() {
102 getComponent().getProgressBar().setIndeterminate(indeterminate);
110 EventQueue.invokeLater(
new Runnable() {
113 getComponent().getProgressBar().setValue(progress);
121 EventQueue.invokeLater(
new Runnable() {
124 getComponent().getProgressBar().setMaximum(max);
132 EventQueue.invokeLater(
new Runnable() {
135 getComponent().setProgressMsgText(text);
153 public AddImageWizardAddingProgressVisual getComponent() {
154 if (component == null) {
155 component =
new AddImageWizardAddingProgressVisual();
167 public HelpCtx getHelp() {
169 return HelpCtx.DEFAULT_HELP;
179 public boolean isValid() {
182 Lookup.getDefault().lookup(AddImageAction.class).requestFocusButton(
183 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.isValid.focusNext"));
192 void setStateStarted() {
193 component.getProgressBar().setIndeterminate(
true);
194 component.setProgressBarTextAndColor(
195 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.stateStarted.progressBarText"), 0, Color.black);
201 void setStateFinished() {
203 getComponent().setStateFinished();
213 public final void addChangeListener(ChangeListener l) {
214 synchronized (listeners) {
225 public final void removeChangeListener(ChangeListener l) {
226 synchronized (listeners) {
235 protected final void fireChangeEvent() {
236 Iterator<ChangeListener> it;
237 synchronized (listeners) {
238 it =
new HashSet<>(listeners).iterator();
240 ChangeEvent ev =
new ChangeEvent(
this);
241 while (it.hasNext()) {
242 it.next().stateChanged(ev);
253 public void readSettings(WizardDescriptor settings) {
256 settings.setOptions(
new Object[]{WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, WizardDescriptor.CANCEL_OPTION});
258 getComponent().setStateFinished();
262 void resetReadyToIngest() {
263 this.readyToIngest =
false;
266 void setIngestJobSettings(IngestJobSettings ingestSettings) {
267 showWarnings(ingestSettings);
268 this.readyToIngest =
true;
269 this.ingestJobSettings = ingestSettings;
279 public void storeSettings(WizardDescriptor settings) {
293 void addErrors(String errorString,
boolean critical) {
294 getComponent().showErrors(errorString, critical);
301 private void startIngest() {
302 if (!newContents.isEmpty() && readyToIngest && !ingested) {
304 IngestManager.getInstance().queueIngestJob(newContents, ingestJobSettings);
309 private static void showWarnings(IngestJobSettings ingestJobSettings) {
310 List<String> warnings = ingestJobSettings.getWarnings();
311 if (warnings.isEmpty() ==
false) {
312 StringBuilder warningMessage =
new StringBuilder();
313 for (String warning : warnings) {
314 warningMessage.append(warning).append(
"\n");
316 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), warningMessage.toString());
324 void startDataSourceProcessing(DataSourceProcessor dsp) {
325 if (dsProcessor == null) {
326 final UUID dataSourceId = UUID.randomUUID();
329 readyToIngest =
false;
334 cleanupTask = addImageAction.new CleanupTask() {
336 void cleanup() throws Exception {
337 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
338 cancelDataSourceProcessing(dataSourceId);
340 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
344 cleanupTask.enable();
348 Case.getOpenCase().notifyAddingDataSource(dataSourceId);
349 }
catch (NoCurrentCaseException ex) {
350 Logger.getLogger(AddImageWizardAddingProgressVisual.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
353 DataSourceProcessorCallback cbObj =
new DataSourceProcessorCallback() {
355 public void doneEDT(DataSourceProcessorCallback.DataSourceProcessorResult result, List<String> errList, List<Content> contents) {
356 dataSourceProcessorDone(dataSourceId, result, errList, contents);
363 dsProcessor.run(getDSPProgressMonitorImpl(), cbObj);
370 private void cancelDataSourceProcessing(UUID dataSourceId) {
371 dsProcessor.cancel();
378 private void dataSourceProcessorDone(UUID dataSourceId, DataSourceProcessorCallback.DataSourceProcessorResult result, List<String> errList, List<Content> contents) {
380 cleanupTask.disable();
384 if (PlatformUtil.isWindowsOS() ==
true) {
385 java.awt.Toolkit.getDefaultToolkit().beep();
387 AddImageWizardAddingProgressVisual panel = getComponent();
389 Window w = SwingUtilities.getWindowAncestor(panel);
398 if (result == DataSourceProcessorCallback.DataSourceProcessorResult.NO_ERRORS) {
399 getComponent().setProgressBarTextAndColor(
400 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text"), 100, Color.black);
402 getComponent().setProgressBarTextAndColor(
403 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.errs.text"), 100, Color.red);
407 boolean critErr =
false;
408 if (result == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
411 for (String err : errList) {
413 addErrors(err, critErr);
419 if (!contents.isEmpty()) {
420 Case.getOpenCase().notifyDataSourceAdded(contents.get(0), dataSourceId);
422 Case.getOpenCase().notifyFailedAddingDataSource(dataSourceId);
424 }
catch (NoCurrentCaseException ex) {
425 Logger.getLogger(AddImageWizardAddingProgressVisual.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
431 newContents.addAll(contents);
void setIndeterminate(final boolean indeterminate)
void setProgressText(final String text)
void setProgressMax(final int max)
void setProgress(final int progress)