Add module reload listener to dialog panel, add API to reorder modules to loader

This commit is contained in:
adam-m 2012-09-21 13:19:56 -04:00
parent f50b7da833
commit 4e50fafe28
2 changed files with 76 additions and 21 deletions

View File

@ -24,11 +24,14 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JTable; import javax.swing.JTable;
@ -38,6 +41,7 @@ import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import org.openide.util.Exceptions;
import org.sleuthkit.autopsy.casemodule.IngestConfigurator; import org.sleuthkit.autopsy.casemodule.IngestConfigurator;
import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog; import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog;
import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.Image;
@ -73,9 +77,9 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
return instance; return instance;
} }
private void customizeComponents() { private void loadModules() {
modulesTable.setModel(tableModel); this.modules.clear();
this.manager = IngestManager.getDefault(); //this.moduleStates.clear(); maintain the state
Collection<IngestModuleImage> imageModules = manager.enumerateImageModules(); Collection<IngestModuleImage> imageModules = manager.enumerateImageModules();
for (final IngestModuleImage module : imageModules) { for (final IngestModuleImage module : imageModules) {
addModule(module); addModule(module);
@ -84,6 +88,27 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
for (final IngestModuleAbstractFile module : fsModules) { for (final IngestModuleAbstractFile module : fsModules) {
addModule(module); addModule(module);
} }
}
private void customizeComponents() {
modulesTable.setModel(tableModel);
this.manager = IngestManager.getDefault();
loadModules();
try {
IngestModuleLoader.getDefault().addModulesReloadedListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(IngestModuleLoader.Event.ModulesReloaded.toString())) {
loadModules();
}
}
});
} catch (IngestModuleLoaderException ex) {
logger.log(Level.SEVERE, "Could not initialize ingest module loader to listen for module config changes", ex);
}
modulesTable.setTableHeader(null); modulesTable.setTableHeader(null);
modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

View File

@ -59,6 +59,7 @@ import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import org.openide.filesystems.FileSystem;
import org.openide.modules.ModuleInfo; import org.openide.modules.ModuleInfo;
import org.openide.util.Exceptions; import org.openide.util.Exceptions;
import org.openide.util.Lookup; import org.openide.util.Lookup;
@ -76,6 +77,7 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import org.openide.filesystems.Repository;
/** /**
* Class responsible for discovery and loading ingest modules specified in * Class responsible for discovery and loading ingest modules specified in
@ -83,11 +85,16 @@ import org.xml.sax.SAXException;
* application for changes in XML to take effect. * application for changes in XML to take effect.
* *
* Supports module auto-discovery from system-wide and user-dir wide jar files. * Supports module auto-discovery from system-wide and user-dir wide jar files.
* Discovered modules are validated, and if valid, they are added to end of configuration * Discovered modules are validated, and if valid, they are added to end of
* and saved in the XML. * configuration and saved in the XML.
*
* If module is removed/uninstalled, it will remain in the XML file, but it will
* not load because it will fail the validation.
*
* Get a handle to the object by calling static getDefault() method. The
* singleton instance will initialize itself the first time - it will load XML
* and autodiscover currently present ingest modules in the jar classpath..
* *
* If module is removed/uninstalled, it will remain in the XML file, but it will not load
* because it will fail the validation.
* *
* Refer to * Refer to
* http://sleuthkit.org/sleuthkit/docs/framework-docs/pipeline_config_page.html * http://sleuthkit.org/sleuthkit/docs/framework-docs/pipeline_config_page.html
@ -336,6 +343,18 @@ public final class IngestModuleLoader {
} }
} }
/*
* netbeans way, but not public API
org.openide.filesystems.Repository defaultRepository = Repository.getDefault();
FileSystem masterFilesystem = defaultRepository.getDefaultFileSystem();
org.netbeans.core.startup.ModuleSystem moduleSystem = new org.netbeans.core.startup.ModuleSystem(masterFilesystem);
List<File> jars = moduleSystem.getModuleJars();
for (File jar : jars) {
logger.log(Level.INFO, " JAR2: " + jar.getAbsolutePath());
}
//org.netbeans.ModuleManager moduleManager = moduleSystem.getManager();
*/
return urls; return urls;
} }
@ -559,6 +578,16 @@ public final class IngestModuleLoader {
} }
/**
* Set a new order of the module
* @param pipeLineType pipeline type where the module to reorder is present
* @param moduleLocation loaded module name (location), fully qualified class path
* @param newOrder new order to set
*/
void setModuleOrder(XmlPipelineRaw.PIPELINE_TYPE pipeLineType, String moduleLocation, int newOrder) throws IngestModuleLoaderException{
throw new IngestModuleLoaderException("Not yet implemented");
}
/** /**
* add autodiscovered module to raw pipeline to be validated and * add autodiscovered module to raw pipeline to be validated and
* instantiated * instantiated
@ -588,12 +617,13 @@ public final class IngestModuleLoader {
throw new IngestModuleLoaderException("Could not find expected pipeline of type: " + pipelineType.toString() + ", cannot add autodiscovered module: " + moduleLocation); throw new IngestModuleLoaderException("Could not find expected pipeline of type: " + pipelineType.toString() + ", cannot add autodiscovered module: " + moduleLocation);
} else { } else {
pipeline.modules.add(modRaw); pipeline.modules.add(modRaw);
logger.log(Level.INFO, "Added a new module " + moduleClass.getName() + " to pipeline " + pipelineType.toString());
} }
} }
/** /**
* Register a listener for module install/uninstall * Register a listener for module install/uninstall //TODO ensure that
* //TODO ensure that module is actually loadable when Lookup event is fired * module is actually loadable when Lookup event is fired
*/ */
private void registerModulesChange() { private void registerModulesChange() {
final Lookup.Result<ModuleInfo> result = final Lookup.Result<ModuleInfo> result =
@ -656,7 +686,7 @@ public final class IngestModuleLoader {
} }
private boolean saveDoc(final Document doc) { private boolean saveDoc(final Document doc) {
TransformerFactory xf = TransformerFactory.newInstance(); TransformerFactory xf = TransformerFactory.newInstance();
xf.setAttribute("indent-number", new Integer(1)); xf.setAttribute("indent-number", new Integer(1));
boolean success = false; boolean success = false;