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);