19 package org.sleuthkit.autopsy.ingest;
21 import java.util.ArrayList;
22 import java.util.Date;
23 import java.util.List;
24 import java.util.logging.Level;
25 import org.openide.util.NbBundle;
37 final class DataSourceIngestPipeline {
39 private static final IngestManager ingestManager = IngestManager.getInstance();
40 private static final Logger logger = Logger.getLogger(DataSourceIngestPipeline.class.getName());
41 private final DataSourceIngestJob job;
42 private final List<PipelineModule> modules =
new ArrayList<>();
43 private volatile PipelineModule currentModule;
54 DataSourceIngestPipeline(DataSourceIngestJob job, List<IngestModuleTemplate> moduleTemplates) {
56 for (IngestModuleTemplate
template : moduleTemplates) {
57 if (
template.isDataSourceIngestModuleTemplate()) {
58 PipelineModule module =
new PipelineModule(
template.createDataSourceIngestModule(),
template.getModuleName());
70 return modules.isEmpty();
78 synchronized List<IngestModuleError> startUp() {
79 List<IngestModuleError> errors =
new ArrayList<>();
80 for (PipelineModule module : modules) {
82 module.startUp(
new IngestJobContext(this.job));
83 }
catch (Throwable ex) {
84 errors.add(
new IngestModuleError(module.getDisplayName(), ex));
97 synchronized List<IngestModuleError> process(DataSourceIngestTask task) {
98 List<IngestModuleError> errors =
new ArrayList<>();
99 Content dataSource = task.getDataSource();
100 for (PipelineModule module : modules) {
102 this.currentModule = module;
103 String displayName = NbBundle.getMessage(this.getClass(),
104 "IngestJob.progress.dataSourceIngest.displayName",
105 module.getDisplayName(), dataSource.getName());
106 this.job.updateDataSourceIngestProgressBarDisplayName(displayName);
107 this.job.switchDataSourceIngestProgressBarToIndeterminate();
108 DataSourceIngestPipeline.ingestManager.setIngestTaskProgress(task, module.getDisplayName());
109 logger.log(Level.INFO,
"{0} analysis of {1} (jobId={2}) starting",
new Object[]{module.getDisplayName(), this.job.getDataSource().getName(), this.job.getDataSource().getId()});
110 module.process(dataSource,
new DataSourceIngestModuleProgress(this.job));
111 logger.log(Level.INFO,
"{0} analysis of {1} (jobId={2}) finished",
new Object[]{module.getDisplayName(), this.job.getDataSource().getName(), this.job.getDataSource().getId()});
112 }
catch (Throwable ex) {
113 errors.add(
new IngestModuleError(module.getDisplayName(), ex));
114 String msg = ex.getMessage();
118 MessageNotifyUtil.Notify.error(module.getDisplayName() +
" Error", msg);
120 if (this.job.isCancelled()) {
122 }
else if (this.job.currentDataSourceIngestModuleIsCancelled()) {
123 this.job.currentDataSourceIngestModuleCancellationCompleted(currentModule.getDisplayName());
126 this.currentModule = null;
127 ingestManager.setIngestTaskProgressCompleted(task);
136 PipelineModule getCurrentlyRunningModule() {
137 return this.currentModule;
144 static class PipelineModule
implements DataSourceIngestModule {
146 private final DataSourceIngestModule module;
147 private final String displayName;
148 private volatile Date processingStartTime;
157 PipelineModule(DataSourceIngestModule module, String displayName) {
158 this.module = module;
159 this.displayName = displayName;
160 this.processingStartTime =
new Date();
168 String getClassName() {
169 return this.module.getClass().getCanonicalName();
177 String getDisplayName() {
178 return this.displayName;
188 Date getProcessingStartTime() {
189 return this.processingStartTime;
196 public void startUp(IngestJobContext context)
throws IngestModuleException {
197 this.module.startUp(context);
204 public IngestModule.ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) {
205 this.processingStartTime =
new Date();
206 return this.module.process(dataSource, statusHelper);