19package org.sleuthkit.autopsy.casemodule;
22import java.awt.Cursor;
23import java.awt.EventQueue;
24import java.awt.Window;
25import java.util.ArrayList;
26import java.util.Collections;
27import java.util.HashSet;
28import java.util.Iterator;
32import java.util.logging.Level;
33import javax.swing.JOptionPane;
34import javax.swing.SwingUtilities;
35import javax.swing.event.ChangeEvent;
36import javax.swing.event.ChangeListener;
37import org.openide.WizardDescriptor;
38import org.openide.util.HelpCtx;
39import org.openide.util.Lookup;
40import org.openide.util.NbBundle;
41import org.openide.windows.WindowManager;
42import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
43import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
44import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
45import org.sleuthkit.autopsy.coreutils.PlatformUtil;
46import org.sleuthkit.autopsy.ingest.IngestJobSettings;
47import org.sleuthkit.autopsy.ingest.IngestManager;
48import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescriptorPanel;
49import org.sleuthkit.datamodel.Content;
50import org.sleuthkit.autopsy.coreutils.Logger;
51import org.sleuthkit.datamodel.Host;
61@SuppressWarnings(
"PMD.SingularField")
64 private boolean readyToIngest =
false;
66 private AddImageAction.CleanupTask cleanupTask;
71 private boolean cancelled;
76 private boolean imgAdded =
false;
77 private boolean ingested =
false;
82 private AddImageWizardAddingProgressVisual component;
83 private final Set<ChangeListener> listeners =
new HashSet<>(1);
84 private final List<Content> newContents = Collections.synchronizedList(
new ArrayList<>());
85 private final DSPProgressMonitorImpl dspProgressMonitorImpl =
new DSPProgressMonitorImpl();
89 this.addImageAction = action;
92 DSPProgressMonitorImpl getDSPProgressMonitorImpl() {
93 return dspProgressMonitorImpl;
101 EventQueue.invokeLater(
new Runnable() {
104 getComponent().getProgressBar().setIndeterminate(indeterminate);
112 EventQueue.invokeLater(
new Runnable() {
115 getComponent().getProgressBar().setValue(
progress);
123 EventQueue.invokeLater(
new Runnable() {
126 getComponent().getProgressBar().setMaximum(max);
134 EventQueue.invokeLater(
new Runnable() {
137 getComponent().setProgressMsgText(text);
155 public AddImageWizardAddingProgressVisual getComponent() {
156 if (component ==
null) {
157 component =
new AddImageWizardAddingProgressVisual();
169 public HelpCtx getHelp() {
171 return HelpCtx.DEFAULT_HELP;
181 public boolean isValid() {
184 Lookup.getDefault().lookup(AddImageAction.class).requestFocusButton(
185 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.isValid.focusNext"));
194 void setStateStarted() {
195 component.getProgressBar().setIndeterminate(
true);
196 component.setProgressBarTextAndColor(
197 NbBundle.getMessage(
this.getClass(),
"AddImageWizardAddingProgressPanel.stateStarted.progressBarText"), 0, Color.black);
203 void setStateFinished() {
205 getComponent().setStateFinished();
215 public final void addChangeListener(ChangeListener l) {
216 synchronized (listeners) {
227 public final void removeChangeListener(ChangeListener l) {
228 synchronized (listeners) {
237 protected final void fireChangeEvent() {
238 Iterator<ChangeListener> it;
239 synchronized (listeners) {
240 it =
new HashSet<>(listeners).iterator();
242 ChangeEvent ev =
new ChangeEvent(
this);
243 while (it.hasNext()) {
244 it.next().stateChanged(ev);
255 public void readSettings(WizardDescriptor settings) {
258 settings.setOptions(
new Object[]{WizardDescriptor.PREVIOUS_OPTION, WizardDescriptor.NEXT_OPTION, WizardDescriptor.FINISH_OPTION, WizardDescriptor.CANCEL_OPTION});
260 getComponent().setStateFinished();
264 void resetReadyToIngest() {
265 this.readyToIngest =
false;
269 showWarnings(ingestSettings);
270 this.readyToIngest =
true;
271 this.ingestJobSettings = ingestSettings;
281 public void storeSettings(WizardDescriptor settings) {
295 void addErrors(String errorString,
boolean critical) {
296 getComponent().showErrors(errorString, critical);
303 private void startIngest() {
304 if (!newContents.isEmpty() && readyToIngest && !ingested) {
306 if (dsProcessor !=
null && !dsProcessor.supportsIngestStream()) {
314 List<String> warnings = ingestJobSettings.getWarnings();
315 if (warnings.isEmpty() ==
false) {
316 StringBuilder warningMessage =
new StringBuilder();
317 for (String warning : warnings) {
318 warningMessage.append(warning).append(
"\n");
320 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), warningMessage.toString());
334 if (dsProcessor ==
null) {
335 final UUID dataSourceId = UUID.randomUUID();
342 cleanupTask = addImageAction.new CleanupTask() {
344 void cleanup() throws Exception {
345 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
346 cancelDataSourceProcessing(dataSourceId);
348 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
352 cleanupTask.enable();
357 Logger.
getLogger(AddImageWizardAddingProgressVisual.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
363 dataSourceProcessorDone(dataSourceId, result, errList, contents);
368 if (dsProcessor.supportsIngestStream()) {
370 readyToIngest =
false;
371 dsProcessor.runWithIngestStream(selectedHost, ingestJobSettings, getDSPProgressMonitorImpl(), cbObj);
373 dsProcessor.run(selectedHost, getDSPProgressMonitorImpl(), cbObj);
383 private void cancelDataSourceProcessing(UUID dataSourceId) {
384 dsProcessor.cancel();
393 cleanupTask.disable();
398 java.awt.Toolkit.getDefaultToolkit().beep();
400 AddImageWizardAddingProgressVisual panel = getComponent();
402 Window w = SwingUtilities.getWindowAncestor(panel);
412 getComponent().setProgressBarTextAndColor(
413 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.noErrs.text"), 100, Color.black);
415 getComponent().setProgressBarTextAndColor(
416 NbBundle.getMessage(
this.getClass(),
"AddImageWizardIngestConfigPanel.dsProcDone.errs.text"), 100, Color.red);
420 boolean critErr =
false;
424 for (String err : errList) {
426 addErrors(err, critErr);
428 final Level level = critErr ? Level.SEVERE : Level.WARNING;
432 for (String err : errList) {
433 Logger.
getLogger(AddImageWizardAddingProgressVisual.class.getName()).log(level,
"DatasourceID: {0} Error Message: {1}",
new Object[]{dataSourceId.toString(), err});
437 if (!contents.isEmpty()) {
443 Logger.
getLogger(AddImageWizardAddingProgressVisual.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
449 newContents.addAll(contents);
void setProgress(final int progress)
void setProgressText(final String text)
void setProgressMax(final int max)
void setIndeterminate(final boolean indeterminate)
void notifyFailedAddingDataSource(UUID addingDataSourceEventId)
void notifyAddingDataSource(UUID eventId)
static Case getCurrentCaseThrows()
void notifyDataSourceAdded(Content dataSource, UUID addingDataSourceEventId)
synchronized static Logger getLogger(String name)
static synchronized IngestManager getInstance()
void queueIngestJob(Collection< Content > dataSources, IngestJobSettings settings)