19 package org.sleuthkit.autopsy.ingest;
 
   21 import java.util.ArrayList;
 
   22 import java.util.HashMap;
 
   23 import java.util.HashSet;
 
   24 import java.util.List;
 
   25 import java.util.TreeMap;
 
   26 import java.util.logging.Level;
 
   27 import org.openide.DialogDisplayer;
 
   28 import org.openide.NotifyDescriptor;
 
   29 import org.openide.util.Lookup;
 
   30 import org.openide.util.NbBundle;
 
   47 final class IngestModuleFactoryLoader {
 
   49     private static final Logger logger = Logger.getLogger(IngestModuleFactoryLoader.class.getName());
 
   50     private static final String SAMPLE_MODULE_FACTORY_CLASS_NAME = SampleIngestModuleFactory.class.getCanonicalName();
 
   51     private static final String SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME = SampleExecutableIngestModuleFactory.class.getCanonicalName();
 
   52     private static final ArrayList<String> coreModuleOrdering = 
new ArrayList<String>() {
 
   56             add(
"org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); 
 
   57             add(HashLookupModuleFactory.class.getCanonicalName());
 
   58             add(FileTypeIdModuleFactory.class.getCanonicalName());
 
   59             add(EmbeddedFileExtractorModuleFactory.class.getCanonicalName());
 
   60             add(ExifParserModuleFactory.class.getCanonicalName());
 
   61             add(
"org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); 
 
   62             add(
"org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); 
 
   63             add(FileExtMismatchDetectorModuleFactory.class.getCanonicalName());
 
   64             add(E01VerifierModuleFactory.class.getCanonicalName());
 
   65             add(InterestingItemsIngestModuleFactory.class.getCanonicalName());
 
   66             add(PhotoRecCarverIngestModuleFactory.class.getCanonicalName());
 
   80     static List<IngestModuleFactory> getIngestModuleFactories() {
 
   84         HashSet<String> moduleDisplayNames = 
new HashSet<>();
 
   85         HashMap<String, IngestModuleFactory> javaFactoriesByClass = 
new HashMap<>();
 
   89         for (IngestModuleFactory factory : Lookup.getDefault().lookupAll(IngestModuleFactory.class)) {
 
   90             IngestModuleFactoryLoader.addFactory(factory, moduleDisplayNames, javaFactoriesByClass);
 
   96         for (IngestModuleFactory factory : Lookup.getDefault().lookupAll(IngestModuleFactoryAdapter.class)) {
 
   97             if (!javaFactoriesByClass.containsValue(factory)) {
 
   98                 IngestModuleFactoryLoader.addFactory(factory, moduleDisplayNames, javaFactoriesByClass);
 
  105         List<IngestModuleFactory> factories = 
new ArrayList<>();
 
  106         for (String className : coreModuleOrdering) {
 
  107             IngestModuleFactory coreFactory = javaFactoriesByClass.remove(className);
 
  108             if (coreFactory != null) {
 
  109                 factories.add(coreFactory);
 
  111                 logger.log(Level.SEVERE, 
"Core factory {0} not loaded", className); 
 
  117         TreeMap<String, IngestModuleFactory> javaFactoriesSortedByName = 
new TreeMap<>();
 
  118         for (IngestModuleFactory factory : javaFactoriesByClass.values()) {
 
  119             javaFactoriesSortedByName.put(factory.getModuleDisplayName(), factory);
 
  121         factories.addAll(javaFactoriesSortedByName.values());
 
  125         for (IngestModuleFactory factory : JythonModuleLoader.getIngestModuleFactories()) {
 
  126             if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) {
 
  127                 moduleDisplayNames.add(factory.getModuleDisplayName());
 
  128                 factories.add(factory);
 
  129                 logger.log(Level.INFO, 
"Found ingest module factory: name = {0}, version = {1}", 
new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); 
 
  131                 logger.log(Level.SEVERE, 
"Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); 
 
  132                 DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(
 
  133                         NbBundle.getMessage(IngestModuleFactoryLoader.class, 
"IngestModuleFactoryLoader.errorMessages.duplicateDisplayName", factory.getModuleDisplayName()),
 
  134                         NotifyDescriptor.ERROR_MESSAGE));
 
  141     private static void addFactory(IngestModuleFactory factory, HashSet<String> moduleDisplayNames, HashMap<String, IngestModuleFactory> javaFactoriesByClass) {
 
  143         String className = factory.getClass().getCanonicalName();
 
  144         if (className.equals(IngestModuleFactoryLoader.SAMPLE_MODULE_FACTORY_CLASS_NAME)
 
  145                 || className.equals(IngestModuleFactoryLoader.SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME)) {
 
  149         if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) {
 
  150             moduleDisplayNames.add(factory.getModuleDisplayName());
 
  151             javaFactoriesByClass.put(factory.getClass().getCanonicalName(), factory);
 
  152             logger.log(Level.INFO, 
"Found ingest module factory: name = {0}, version = {1}", 
new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); 
 
  154             logger.log(Level.SEVERE, 
"Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); 
 
  155             DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(
 
  156                     NbBundle.getMessage(IngestModuleFactoryLoader.class, 
"IngestModuleFactoryLoader.errorMessages.duplicateDisplayName", factory.getModuleDisplayName()),
 
  157                     NotifyDescriptor.ERROR_MESSAGE));