From 47782e17c4d9e80f87f9bd611bb4e51838bbd8d2 Mon Sep 17 00:00:00 2001 From: Andriy Kryvtsun Date: Sat, 6 Jun 2015 13:15:56 -0400 Subject: [PATCH] unbind PluginLoader from PicoContainer --- .../azib/ipscan/config/ComponentRegistry.java | 13 ++++++++---- src/net/azib/ipscan/core/PluginLoader.java | 20 ++++++++++++------- .../azib/ipscan/core/PluginLoaderTest.java | 7 ++++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/net/azib/ipscan/config/ComponentRegistry.java b/src/net/azib/ipscan/config/ComponentRegistry.java index e14bdf3a..a27fcf66 100644 --- a/src/net/azib/ipscan/config/ComponentRegistry.java +++ b/src/net/azib/ipscan/config/ComponentRegistry.java @@ -5,10 +5,8 @@ */ package net.azib.ipscan.config; -import net.azib.ipscan.core.PluginLoader; +import net.azib.ipscan.core.*; import net.azib.ipscan.core.Scanner; -import net.azib.ipscan.core.ScannerDispatcherThreadFactory; -import net.azib.ipscan.core.ScanningResultList; import net.azib.ipscan.core.net.PingerRegistry; import net.azib.ipscan.exporters.*; import net.azib.ipscan.fetchers.*; @@ -150,7 +148,14 @@ public class ComponentRegistry { container.registerComponentImplementation(ToolsActions.ChooseFetchers.class); container.registerComponentImplementation(HelpMenuActions.CheckVersion.class); - new PluginLoader().addTo(container); + java.util.List classes = new PluginLoader().getClasses(); + registerComponentImplementations(container, classes); + } + + private void registerComponentImplementations(MutablePicoContainer container, java.util.List classes) { + for (Class clazz: classes) { + container.registerComponentImplementation(clazz); + } } private void start() { diff --git a/src/net/azib/ipscan/core/PluginLoader.java b/src/net/azib/ipscan/core/PluginLoader.java index 6c3324f6..ab3d84b9 100644 --- a/src/net/azib/ipscan/core/PluginLoader.java +++ b/src/net/azib/ipscan/core/PluginLoader.java @@ -7,6 +7,8 @@ import java.io.File; import java.io.FilenameFilter; import java.net.URL; import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.logging.Logger; @@ -29,28 +31,32 @@ import java.util.logging.Logger; * In either way, all plugins must implement {@link net.azib.ipscan.core.Plugin} and one or more of the concrete interfaces. */ public class PluginLoader { - static final Logger LOG = LoggerFactory.getLogger(); + private static final Logger LOG = LoggerFactory.getLogger(); + + public List getClasses() { + List container = new ArrayList(); - public void addTo(MutablePicoContainer container) { loadPluginsSpecifiedInSystemProperties(container); loadPluginJars(container, getOwnFile()); loadPluginJars(container, new File(System.getProperty("user.home"), ".ipscan/placeholder")); - } - void loadPluginsSpecifiedInSystemProperties(MutablePicoContainer container) { + return container; + } + + void loadPluginsSpecifiedInSystemProperties(List container) { String plugins = System.getProperty("ipscan.plugins"); if (plugins != null) { loadPluginClasses(container, getClass().getClassLoader(), plugins); } } - private void loadPluginClasses(MutablePicoContainer container, ClassLoader classLoader, String csvNames) { + private void loadPluginClasses(List container, ClassLoader classLoader, String csvNames) { String[] classes = csvNames.split("\\s*,\\s*"); for (String className : classes) { try { Class clazz = Class.forName(className, true, classLoader); if (Plugin.class.isAssignableFrom(clazz)) - container.registerComponentImplementation(clazz); + container.add(clazz); else LOG.warning("Plugin class " + clazz.getName() + " is not assignable to " + Plugin.class.getName()); } @@ -60,7 +66,7 @@ public class PluginLoader { } } - void loadPluginJars(MutablePicoContainer container, final File ownFile) { + void loadPluginJars(List container, final File ownFile) { if (!ownFile.getParentFile().exists()) return; File[] jars = ownFile.getParentFile().listFiles(new FilenameFilter() { diff --git a/test/net/azib/ipscan/core/PluginLoaderTest.java b/test/net/azib/ipscan/core/PluginLoaderTest.java index 273efb2b..2d51c880 100644 --- a/test/net/azib/ipscan/core/PluginLoaderTest.java +++ b/test/net/azib/ipscan/core/PluginLoaderTest.java @@ -6,6 +6,7 @@ import org.mockito.ArgumentCaptor; import org.picocontainer.MutablePicoContainer; import java.io.File; +import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -14,13 +15,13 @@ import static org.mockito.Mockito.verify; public class PluginLoaderTest { PluginLoader loader = new PluginLoader(); - MutablePicoContainer container = mock(MutablePicoContainer.class); + List container = mock(List.class); @Test public void loadFromSystemProperty() { System.setProperty("ipscan.plugins", DummyFetcher.class.getName()); loader.loadPluginsSpecifiedInSystemProperties(container); - verify(container).registerComponentImplementation(DummyFetcher.class); + verify(container).add(DummyFetcher.class); } @Test @@ -36,7 +37,7 @@ public class PluginLoaderTest { loader.loadPluginJars(container, loader.getClassLocation(getClass())); ArgumentCaptor classCaptor = ArgumentCaptor.forClass(Class.class); - verify(container).registerComponentImplementation(classCaptor.capture()); + verify(container).add(classCaptor.capture()); Class plugin = classCaptor.getValue(); assertEquals("test.TestPlugin", plugin.getName()); assertTrue(Plugin.class.isAssignableFrom(plugin));