19 package org.sleuthkit.autopsy.imagewriter;
21 import com.google.common.util.concurrent.ThreadFactoryBuilder;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.concurrent.Callable;
25 import java.util.concurrent.Executors;
26 import java.util.concurrent.Future;
27 import java.util.concurrent.ScheduledFuture;
28 import java.util.concurrent.ScheduledThreadPoolExecutor;
29 import java.util.concurrent.TimeUnit;
30 import java.util.concurrent.ExecutionException;
31 import java.util.logging.Level;
32 import org.netbeans.api.progress.ProgressHandle;
50 class ImageWriter
implements PropertyChangeListener{
54 private final Long dataSourceId;
57 private Long imageHandle = null;
58 private Future<Integer> finishTask = null;
59 private ProgressHandle progressHandle = null;
60 private ScheduledFuture<?> progressUpdateTask = null;
61 private boolean isCancelled =
false;
62 private boolean isStarted =
false;
63 private final Object currentTasksLock =
new Object();
66 private ScheduledThreadPoolExecutor periodicTasksExecutor = null;
67 private final boolean doUI;
68 private SleuthkitCase caseDb = null;
76 this.dataSourceId = dataSourceId;
77 this.settings = settings;
85 }
catch (IllegalStateException ex){
86 logger.log(Level.SEVERE,
"Unable to load case. Image writer will be cancelled.");
87 this.isCancelled =
true;
94 void subscribeToEvents(){
101 void unsubscribeFromEvents(){
110 public void propertyChange(PropertyChangeEvent evt) {
113 DataSourceAnalysisCompletedEvent
event = (DataSourceAnalysisCompletedEvent)evt;
115 if(event.getDataSource() != null){
116 long imageId =
event.getDataSource().getId();
117 String name =
event.getDataSource().getName();
120 if(imageId != dataSourceId){
124 startFinishImage(name);
128 logger.log(Level.SEVERE,
"DataSourceAnalysisCompletedEvent did not contain a dataSource object");
133 private void startFinishImage(String dataSourceName){
135 synchronized(currentTasksLock){
150 imageHandle = image.getImageHandle();
151 }
catch (IllegalStateException ex){
156 logger.log(Level.WARNING, String.format(
"Case closed before ImageWriter could start the finishing process for %s",
159 }
catch (TskCoreException ex){
160 logger.log(Level.SEVERE,
"Error loading image", ex);
164 logger.log(Level.INFO, String.format(
"Finishing VHD image for %s",
168 periodicTasksExecutor =
new ScheduledThreadPoolExecutor(1,
new ThreadFactoryBuilder().setNameFormat(
"image-writer-progress-update-%d").build());
169 progressHandle = ProgressHandle.createHandle(
"Image writer - " + dataSourceName);
170 progressHandle.start(100);
171 progressUpdateTask = periodicTasksExecutor.scheduleAtFixedRate(
172 new ProgressUpdateTask(progressHandle, imageHandle), 0, 250, TimeUnit.MILLISECONDS);
178 finishTask = Executors.newSingleThreadExecutor().submit(
new Callable<Integer>(){
180 public Integer call()
throws TskCoreException{
182 int result = SleuthkitJNI.finishImageWriter(imageHandle);
188 caseDb.updateImagePath(settings.
getPath(), dataSourceId);
191 }
catch (TskCoreException ex){
192 logger.log(Level.SEVERE,
"Error finishing VHD image", ex);
206 result = finishTask.get();
207 }
catch (InterruptedException | ExecutionException ex){
208 logger.log(Level.SEVERE,
"Error finishing VHD image", ex);
211 synchronized(currentTasksLock){
214 progressUpdateTask.cancel(
true);
215 progressHandle.finish();
216 periodicTasksExecutor.shutdown();
221 logger.log(Level.INFO, String.format(
"Successfully finished writing VHD image for %s", dataSourceName));
223 logger.log(Level.INFO, String.format(
"Finished VHD image for %s with errors", dataSourceName));
233 void cancelIfNotStarted(){
234 synchronized(currentTasksLock){
246 boolean jobIsInProgress(){
247 synchronized(currentTasksLock){
248 return((isStarted) && (! finishTask.isDone()));
257 synchronized(currentTasksLock){
262 SleuthkitJNI.cancelFinishImage(imageHandle);
271 progressUpdateTask.cancel(
true);
272 progressHandle.finish();
282 void waitForJobToFinish(){
283 synchronized(currentTasksLock){
288 }
catch (InterruptedException | ExecutionException ex){
289 Logger.
getLogger(ImageWriter.class.getName()).log(Level.SEVERE,
"Error finishing VHD image", ex);
292 progressUpdateTask.cancel(
true);
302 final long imageHandle;
303 final ProgressHandle progressHandle;
306 this.imageHandle = imageHandle;
307 this.progressHandle = progressHandle;
313 int progress = SleuthkitJNI.getFinishImageProgress(imageHandle);
314 progressHandle.progress(progress);
315 }
catch (Exception ex) {
316 logger.log(Level.SEVERE,
"Unexpected exception in ProgressUpdateTask", ex);
static synchronized IngestManager getInstance()
static boolean runningWithGUI
void removeIngestJobEventListener(final PropertyChangeListener listener)
void addIngestJobEventListener(final PropertyChangeListener listener)
SleuthkitCase getSleuthkitCase()
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
boolean getUpdateDatabasePath()