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;
 
   48 final class IngestModuleFactoryLoader {
 
   50     private static final Logger logger = Logger.getLogger(IngestModuleFactoryLoader.class.getName());
 
   51     private static final String SAMPLE_MODULE_FACTORY_CLASS_NAME = SampleIngestModuleFactory.class.getCanonicalName();
 
   52     private static final String SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME = SampleExecutableIngestModuleFactory.class.getCanonicalName();
 
   53     private static final ArrayList<String> coreModuleOrdering = 
new ArrayList<String>() {
 
   57             add(
"org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory"); 
 
   58             add(HashLookupModuleFactory.class.getCanonicalName());
 
   59             add(FileTypeIdModuleFactory.class.getCanonicalName());
 
   60             add(EmbeddedFileExtractorModuleFactory.class.getCanonicalName());
 
   61             add(ExifParserModuleFactory.class.getCanonicalName());
 
   62             add(
"org.sleuthkit.autopsy.keywordsearch.KeywordSearchModuleFactory"); 
 
   63             add(
"org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory"); 
 
   64             add(FileExtMismatchDetectorModuleFactory.class.getCanonicalName());
 
   65             add(E01VerifierModuleFactory.class.getCanonicalName());
 
   66             add(AndroidModuleFactory.class.getCanonicalName());
 
   67             add(InterestingItemsIngestModuleFactory.class.getCanonicalName());
 
   68             add(PhotoRecCarverIngestModuleFactory.class.getCanonicalName());
 
   82     static List<IngestModuleFactory> getIngestModuleFactories() {
 
   86         HashSet<String> moduleDisplayNames = 
new HashSet<>();
 
   87         HashMap<String, IngestModuleFactory> javaFactoriesByClass = 
new HashMap<>();
 
   91         for (IngestModuleFactory factory : Lookup.getDefault().lookupAll(IngestModuleFactory.class)) {
 
   92             IngestModuleFactoryLoader.addFactory(factory, moduleDisplayNames, javaFactoriesByClass);
 
   98         for (IngestModuleFactory factory : Lookup.getDefault().lookupAll(IngestModuleFactoryAdapter.class)) {
 
   99             if (!javaFactoriesByClass.containsValue(factory)) {
 
  100                 IngestModuleFactoryLoader.addFactory(factory, moduleDisplayNames, javaFactoriesByClass);
 
  107         List<IngestModuleFactory> factories = 
new ArrayList<>();
 
  108         for (String className : coreModuleOrdering) {
 
  109             IngestModuleFactory coreFactory = javaFactoriesByClass.remove(className);
 
  110             if (coreFactory != null) {
 
  111                 factories.add(coreFactory);
 
  113                 logger.log(Level.SEVERE, 
"Core factory {0} not loaded", className); 
 
  119         TreeMap<String, IngestModuleFactory> javaFactoriesSortedByName = 
new TreeMap<>(); 
 
  120         for (IngestModuleFactory factory : javaFactoriesByClass.values()) {
 
  121             javaFactoriesSortedByName.put(factory.getModuleDisplayName(), factory);
 
  123         factories.addAll(javaFactoriesSortedByName.values());
 
  127         for (IngestModuleFactory factory : JythonModuleLoader.getIngestModuleFactories()) {
 
  128             if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) {
 
  129                 moduleDisplayNames.add(factory.getModuleDisplayName());
 
  130                 factories.add(factory);
 
  131                 logger.log(Level.INFO, 
"Found ingest module factory: name = {0}, version = {1}", 
new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); 
 
  133                 logger.log(Level.SEVERE, 
"Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); 
 
  134                 DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(
 
  135                         NbBundle.getMessage(IngestModuleFactoryLoader.class, 
"IngestModuleFactoryLoader.errorMessages.duplicateDisplayName", factory.getModuleDisplayName()),
 
  136                         NotifyDescriptor.ERROR_MESSAGE));
 
  143     private static void addFactory(IngestModuleFactory factory, HashSet<String> moduleDisplayNames, HashMap<String, IngestModuleFactory> javaFactoriesByClass) {
 
  145         String className = factory.getClass().getCanonicalName();
 
  146         if (className.equals(IngestModuleFactoryLoader.SAMPLE_MODULE_FACTORY_CLASS_NAME)
 
  147                 || className.equals(IngestModuleFactoryLoader.SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME)) {
 
  151         if (!moduleDisplayNames.contains(factory.getModuleDisplayName())) {
 
  152             moduleDisplayNames.add(factory.getModuleDisplayName());
 
  153             javaFactoriesByClass.put(factory.getClass().getCanonicalName(), factory);
 
  154             logger.log(Level.INFO, 
"Found ingest module factory: name = {0}, version = {1}", 
new Object[]{factory.getModuleDisplayName(), factory.getModuleVersionNumber()}); 
 
  156             logger.log(Level.SEVERE, 
"Found duplicate ingest module display name (name = {0})", factory.getModuleDisplayName()); 
 
  157             DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(
 
  158                     NbBundle.getMessage(IngestModuleFactoryLoader.class, 
"IngestModuleFactoryLoader.errorMessages.duplicateDisplayName", factory.getModuleDisplayName()),
 
  159                     NotifyDescriptor.ERROR_MESSAGE));