diff --git a/ext/junit/junit.jar b/ext/junit/junit.jar index e2099945..5b4bb849 100644 Binary files a/ext/junit/junit.jar and b/ext/junit/junit.jar differ diff --git a/ext/mockito/mockito-all.jar b/ext/mockito/mockito-all.jar new file mode 100644 index 00000000..4b0395ed Binary files /dev/null and b/ext/mockito/mockito-all.jar differ diff --git a/src/net/azib/ipscan/config/ComponentRegistry.java b/src/net/azib/ipscan/config/ComponentRegistry.java index 0cfe23fd..dba4b595 100755 --- a/src/net/azib/ipscan/config/ComponentRegistry.java +++ b/src/net/azib/ipscan/config/ComponentRegistry.java @@ -12,6 +12,7 @@ import net.azib.ipscan.core.ScannerDispatcherThreadFactory; import net.azib.ipscan.core.ScanningResultList; import net.azib.ipscan.core.net.PingerRegistry; import net.azib.ipscan.core.net.PingerRegistryImpl; +import net.azib.ipscan.core.plugins.PluginLoader; import net.azib.ipscan.exporters.CSVExporter; import net.azib.ipscan.exporters.ExporterRegistry; import net.azib.ipscan.exporters.IPListExporter; @@ -195,6 +196,8 @@ public class ComponentRegistry { Logger.getLogger(getClass().getName()).warning("Cannot initialize MacApplicationMenu: " + e); } } + + new PluginLoader().addTo(container); } private void start() { diff --git a/src/net/azib/ipscan/core/plugins/PluginLoader.java b/src/net/azib/ipscan/core/plugins/PluginLoader.java new file mode 100644 index 00000000..cf5cb126 --- /dev/null +++ b/src/net/azib/ipscan/core/plugins/PluginLoader.java @@ -0,0 +1,26 @@ +package net.azib.ipscan.core.plugins; + +import net.azib.ipscan.config.LoggerFactory; +import org.picocontainer.MutablePicoContainer; + +import java.util.logging.Logger; + +public class PluginLoader { + static final Logger LOG = LoggerFactory.getLogger(); + + public void addTo(MutablePicoContainer container) { + String plugins = System.getProperty("ipscan.plugins"); + if (plugins != null) { + String[] classes = plugins.split("\\s*,\\s*"); + for (String className : classes) { + try { + Class clazz = Class.forName(className); + container.registerComponentImplementation(clazz); + } + catch (ClassNotFoundException e) { + LOG.warning("Unable to load plugin: " + className); + } + } + } + } +} diff --git a/test/net/azib/ipscan/core/plugins/PluginLoaderTest.java b/test/net/azib/ipscan/core/plugins/PluginLoaderTest.java new file mode 100644 index 00000000..5c6bee81 --- /dev/null +++ b/test/net/azib/ipscan/core/plugins/PluginLoaderTest.java @@ -0,0 +1,28 @@ +package net.azib.ipscan.core.plugins; + +import net.azib.ipscan.core.ScanningSubject; +import net.azib.ipscan.fetchers.AbstractFetcher; +import org.junit.Test; +import org.picocontainer.MutablePicoContainer; + +import static org.mockito.Mockito.*; + +public class PluginLoaderTest { + @Test + public void loadFromSystemProperty() { + System.setProperty("ipscan.plugins", DummyFetcher.class.getName()); + MutablePicoContainer container = mock(MutablePicoContainer.class); + new PluginLoader().addTo(container); + verify(container).registerComponentImplementation(DummyFetcher.class); + } + + public static class DummyFetcher extends AbstractFetcher { + public Object scan(ScanningSubject subject) { + return "dummy"; + } + + public String getId() { + return "dummy"; + } + } +}