unbind PluginLoader from PicoContainer

This commit is contained in:
Andriy Kryvtsun 2015-06-06 13:15:56 -04:00
parent 5a17df49ae
commit 47782e17c4
3 changed files with 26 additions and 14 deletions

View File

@ -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<Class> classes = new PluginLoader().getClasses();
registerComponentImplementations(container, classes);
}
private void registerComponentImplementations(MutablePicoContainer container, java.util.List<Class> classes) {
for (Class clazz: classes) {
container.registerComponentImplementation(clazz);
}
}
private void start() {

View File

@ -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<Class> getClasses() {
List<Class> container = new ArrayList<Class>();
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<Class> 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<Class> 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<Class> container, final File ownFile) {
if (!ownFile.getParentFile().exists()) return;
File[] jars = ownFile.getParentFile().listFiles(new FilenameFilter() {

View File

@ -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<Class> 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<Class> 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));