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 javax.swing.JOptionPane;
33 import javax.swing.SwingUtilities;
34 import javax.swing.event.ChangeEvent;
35 import javax.swing.event.ChangeListener;
36 import org.openide.WizardDescriptor;
37 import org.openide.util.HelpCtx;
38 import org.openide.util.Lookup;
39 import org.openide.util.NbBundle;
40 import org.openide.windows.WindowManager;
58 class AddImageWizardAddingProgressPanel
extends ShortcutWizardDescriptorPanel {
60 private boolean readyToIngest =
false;
62 private AddImageAction.CleanupTask cleanupTask;
64 private final AddImageAction addImageAction;
66 private DataSourceProcessor dsProcessor = null;
67 private boolean cancelled;
72 private boolean imgAdded =
false;
73 private boolean ingested =
false;
78 private AddImageWizardAddingProgressVisual component;
79 private final Set<ChangeListener> listeners =
new HashSet<>(1);
80 private final List<Content> newContents = Collections.synchronizedList(
new ArrayList<Content>());
81 private final DSPProgressMonitorImpl dspProgressMonitorImpl =
new DSPProgressMonitorImpl();
82 private IngestJobSettings ingestJobSettings;
84 AddImageWizardAddingProgressPanel(AddImageAction action) {
85 this.addImageAction = action;
88 DSPProgressMonitorImpl getDSPProgressMonitorImpl() {
89 return dspProgressMonitorImpl;
97 EventQueue.invokeLater(
new Runnable() {
100 getComponent().getProgressBar().setIndeterminate(indeterminate);
108 EventQueue.invokeLater(
new Runnable() {
111 getComponent().getProgressBar().setValue(progress);
119 EventQueue.invokeLater(
new Runnable() {
122 getComponent().setProgressMsgText(text);
140 public AddImageWizardAddingProgressVisual getComponent() {
141 if (component == null) {
142 component =
new AddImageWizardAddingProgressVisual();
154 public HelpCtx getHelp() {
156 return HelpCtx.DEFAULT_HELP;
166 public boolean isValid() {
169 Lookup.getDefault().lookup(AddImageAction.class).requestFocusButton(
170 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.isValid.focusNext"));
179 void setStateStarted() {
180 component.getProgressBar().setIndeterminate(
true);
181 component.setProgressBarTextAndColor(
182 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.stateStarted.progressBarText"), 0, Color.black);
188 void setStateFinished() {
190 getComponent().setStateFinished();
200 public final void addChangeListener(ChangeListener l) {
201 synchronized (listeners) {
212 public final void removeChangeListener(ChangeListener l) {
213 synchronized (listeners) {
222 protected final void fireChangeEvent() {
223 Iterator<ChangeListener> it;
224 synchronized (listeners) {
225 it =
new HashSet<>(listeners).iterator();
227 ChangeEvent ev =
new ChangeEvent(
this);
228 while (it.hasNext()) {
229 it.next().stateChanged(ev);
240 public void readSettings(WizardDescriptor settings) {
243 settings.setOptions(
new Object[]{WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, WizardDescriptor.CANCEL_OPTION});
245 getComponent().setStateFinished();
249 void resetReadyToIngest() {
250 this.readyToIngest =
false;
253 void setIngestJobSettings(IngestJobSettings ingestSettings) {
254 showWarnings(ingestSettings);
255 this.readyToIngest =
true;
256 this.ingestJobSettings = ingestSettings;
266 public void storeSettings(WizardDescriptor settings) {
280 void addErrors(String errorString,
boolean critical) {
281 getComponent().showErrors(errorString, critical);
288 private void startIngest() {
289 if (!newContents.isEmpty() && readyToIngest && !ingested) {
291 IngestManager.getInstance().queueIngestJob(newContents, ingestJobSettings);
296 private static void showWarnings(IngestJobSettings ingestJobSettings) {
297 List<String> warnings = ingestJobSettings.getWarnings();
298 if (warnings.isEmpty() ==
false) {
299 StringBuilder warningMessage =
new StringBuilder();
300 for (String warning : warnings) {
301 warningMessage.append(warning).append(
"\n");
303 JOptionPane.showMessageDialog(null, warningMessage.toString());
311 void startDataSourceProcessing(DataSourceProcessor dsp) {
312 if (dsProcessor == null) {
313 final UUID dataSourceId = UUID.randomUUID();
316 readyToIngest =
false;
321 cleanupTask = addImageAction.new CleanupTask() {
323 void cleanup() throws Exception {
324 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
325 cancelDataSourceProcessing(dataSourceId);
327 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
331 cleanupTask.enable();
334 Case.getCurrentCase().notifyAddingDataSource(dataSourceId);
336 DataSourceProcessorCallback cbObj =
new DataSourceProcessorCallback() {
338 public void doneEDT(DataSourceProcessorCallback.DataSourceProcessorResult result, List<String> errList, List<Content> contents) {
339 dataSourceProcessorDone(dataSourceId, result, errList, contents);
346 dsProcessor.run(getDSPProgressMonitorImpl(), cbObj);
353 private void cancelDataSourceProcessing(UUID dataSourceId) {
354 dsProcessor.cancel();
361 private void dataSourceProcessorDone(UUID dataSourceId, DataSourceProcessorCallback.DataSourceProcessorResult result, List<String> errList, List<Content> contents) {
363 cleanupTask.disable();
367 if (PlatformUtil.isWindowsOS() ==
true) {
368 java.awt.Toolkit.getDefaultToolkit().beep();
370 AddImageWizardAddingProgressVisual panel = getComponent();
372 Window w = SwingUtilities.getWindowAncestor(panel);
381 if (result == DataSourceProcessorCallback.DataSourceProcessorResult.NO_ERRORS) {
382 getComponent().setProgressBarTextAndColor(
383 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text"), 100, Color.black);
385 getComponent().setProgressBarTextAndColor(
386 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.errs.text"), 100, Color.red);
390 boolean critErr =
false;
391 if (result == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
394 for (String err : errList) {
396 addErrors(err, critErr);
401 if (!contents.isEmpty()) {
402 Case.getCurrentCase().notifyDataSourceAdded(contents.get(0), dataSourceId);
404 Case.getCurrentCase().notifyFailedAddingDataSource(dataSourceId);
410 newContents.addAll(contents);
void setIndeterminate(final boolean indeterminate)
void setProgressText(final String text)
void setProgress(final int progress)