19 package org.sleuthkit.autopsy.casemodule;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.logging.Level;
24 import org.openide.util.NbBundle;
38 class AddImageTask
implements Runnable {
40 private final Logger logger = Logger.getLogger(AddImageTask.class.getName());
41 private final String deviceId;
42 private final String imagePath;
43 private final String timeZone;
44 private final boolean ignoreFatOrphanFiles;
45 private final DataSourceProcessorProgressMonitor progressMonitor;
46 private final DataSourceProcessorCallback callback;
47 private boolean criticalErrorOccurred;
60 private final Object tskAddImageProcessLock;
61 private boolean tskAddImageProcessStopped;
62 private SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess;
81 AddImageTask(String deviceId, String imagePath, String timeZone,
boolean ignoreFatOrphanFiles, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
82 this.deviceId = deviceId;
83 this.imagePath = imagePath;
84 this.timeZone = timeZone;
85 this.ignoreFatOrphanFiles = ignoreFatOrphanFiles;
86 this.callback = callback;
87 this.progressMonitor = progressMonitor;
88 tskAddImageProcessLock =
new Object();
96 progressMonitor.setIndeterminate(
true);
97 progressMonitor.setProgress(0);
98 Case currentCase = Case.getCurrentCase();
99 List<String> errorMessages =
new ArrayList<>();
100 List<Content> newDataSources =
new ArrayList<>();
102 currentCase.getSleuthkitCase().acquireExclusiveLock();
103 synchronized (tskAddImageProcessLock) {
104 tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone,
true, ignoreFatOrphanFiles);
106 Thread progressUpdateThread =
new Thread(
new ProgressUpdater(progressMonitor, tskAddImageProcess));
107 progressUpdateThread.start();
108 runAddImageProcess(errorMessages);
109 if (null != progressUpdateThread) {
110 progressUpdateThread.interrupt();
112 commitOrRevertAddImageProcess(currentCase, errorMessages, newDataSources);
113 progressMonitor.setProgress(100);
115 currentCase.getSleuthkitCase().releaseExclusiveLock();
116 DataSourceProcessorCallback.DataSourceProcessorResult result;
117 if (criticalErrorOccurred) {
118 result = DataSourceProcessorResult.CRITICAL_ERRORS;
119 }
else if (!errorMessages.isEmpty()) {
120 result = DataSourceProcessorResult.NONCRITICAL_ERRORS;
122 result = DataSourceProcessorResult.NO_ERRORS;
124 callback.done(result, errorMessages, newDataSources);
131 public void cancelTask() {
132 synchronized (tskAddImageProcessLock) {
133 if (null != tskAddImageProcess) {
143 tskAddImageProcess.stop();
144 tskAddImageProcessStopped =
true;
145 }
catch (TskCoreException ex) {
146 logger.log(Level.SEVERE, String.format(
"Error cancelling adding image %s to the case database", imagePath), ex);
158 private void runAddImageProcess(List<String> errorMessages) {
160 tskAddImageProcess.run(deviceId,
new String[]{imagePath});
161 }
catch (TskCoreException ex) {
162 logger.log(Level.SEVERE, String.format(
"Critical error occurred adding image %s", imagePath), ex);
163 criticalErrorOccurred =
true;
164 errorMessages.add(ex.getMessage());
165 }
catch (TskDataException ex) {
166 logger.log(Level.WARNING, String.format(
"Non-critical error occurred adding image %s", imagePath), ex);
167 errorMessages.add(ex.getMessage());
185 private void commitOrRevertAddImageProcess(Case currentCase, List<String> errorMessages, List<Content> newDataSources) {
186 synchronized (tskAddImageProcessLock) {
187 if (tskAddImageProcessStopped || criticalErrorOccurred) {
189 tskAddImageProcess.revert();
190 }
catch (TskCoreException ex) {
191 logger.log(Level.SEVERE, String.format(
"Error reverting adding image %s to the case database", imagePath), ex);
192 errorMessages.add(ex.getMessage());
193 criticalErrorOccurred =
true;
197 long imageId = tskAddImageProcess.commit();
199 Image newImage = currentCase.getSleuthkitCase().getImageById(imageId);
200 String verificationError = newImage.verifyImageSize();
201 if (!verificationError.isEmpty()) {
202 errorMessages.add(verificationError);
204 newDataSources.add(newImage);
206 String errorMessage = String.format(
"Error commiting adding image %s to the case database, no object id returned", imagePath);
207 logger.log(Level.SEVERE, errorMessage);
208 errorMessages.add(errorMessage);
209 criticalErrorOccurred =
true;
211 }
catch (TskCoreException ex) {
212 logger.log(Level.SEVERE, String.format(
"Error committing adding image %s to the case database", imagePath), ex);
213 errorMessages.add(ex.getMessage());
214 criticalErrorOccurred =
true;
248 while (!Thread.currentThread().isInterrupted()) {
250 if (currDir != null) {
251 if (!currDir.isEmpty()) {
253 NbBundle.getMessage(
this.getClass(),
"AddImageTask.run.progress.adding",
268 }
catch (InterruptedException expected) {
void setProgressText(String text)
final SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess
final DataSourceProcessorProgressMonitor progressMonitor