Skip to content

Commit

Permalink
Added Plugin.getInjector() and removed PluginLoader.getPluginInjector…
Browse files Browse the repository at this point in the history
…s() because PluginLoader should work like a stateless plugin factory. We can retrieve a list of plugin injectors by iterating over PluginManager.getLoadedPlugins().
  • Loading branch information
ccidral committed May 14, 2012
1 parent 140077f commit d3b84cd
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.tomighty.plugin;

import com.google.inject.Injector;
import org.tomighty.util.PluginPropertiesReader;
import org.tomighty.util.StringConversionUtil;

Expand All @@ -29,10 +30,12 @@
*/
public class DefaultPlugin implements Plugin {


@Inject
private PluginPropertiesReader pluginPropertiesReader;

@Inject
private Injector injector;

@Override
public String getPluginName() {
String pluginName = pluginPropertiesReader.getPluginName(getClass().getClassLoader());
Expand All @@ -53,4 +56,9 @@ public MenuItem getMenuItem() {
//Don't use a Menu Item by default
return null;
}

@Override
public Injector getInjector() {
return injector;
}
}
9 changes: 9 additions & 0 deletions tomighty-api/src/main/java/org/tomighty/plugin/Plugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package org.tomighty.plugin;

import com.google.inject.Injector;

import java.awt.*;

/**
Expand Down Expand Up @@ -65,4 +67,11 @@ public interface Plugin {
*/
MenuItem getMenuItem();

/**
* Returns the injector used to create this plugin instance.
*
* @return The injector.
*/
Injector getInjector();

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,11 @@

package org.tomighty.plugin;

import com.google.inject.Injector;

/**
* Creates an instance of a plugin.
*/
public interface PluginLoader {

Plugin load(PluginPack pluginPack);

Iterable<Injector> getPluginInjectors();

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,52 +25,28 @@
import org.tomighty.plugin.PluginPack;
import org.tomighty.util.PluginPropertiesReader;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class DefaultPluginLoader implements PluginLoader {

private final Injector injector;
private final PluginPropertiesReader pluginPropertiesReader;

private Set<Injector> injectors;
@Inject private Injector injector;
@Inject private PluginPropertiesReader pluginPropertiesReader;

private final Logger logger = LoggerFactory.getLogger(getClass());

@Inject
public DefaultPluginLoader(Injector injector, PluginPropertiesReader pluginPropertiesReader) {
this.injector = injector;
this.pluginPropertiesReader = pluginPropertiesReader;

injectors = new HashSet<Injector>();
}

@PostConstruct
public void postConstruct() {
injectors.add(injector);
}

@Override
public Plugin load(PluginPack pluginPack) {
logger.info("Loading plugin {}", pluginPack);

URLClassLoader classLoader = createClassLoader(pluginPack);
Class<? extends Plugin> pluginClass = loadPluginClass(classLoader);

Injector pluginInjector = createPluginInjector(classLoader);
injectors.add(pluginInjector);
return pluginInjector.getInstance(pluginClass);
}

@Override
public Iterable<Injector> getPluginInjectors() {
return Collections.unmodifiableSet(injectors);
}

private Injector createPluginInjector(final URLClassLoader classLoader) {
Class<? extends Module> guiceModule = getGuiceModule(classLoader);
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
import com.google.inject.Injector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tomighty.plugin.PluginLoader;
import org.tomighty.plugin.Plugin;
import org.tomighty.plugin.PluginManager;
import org.tomighty.plugin.TomightyLoader;

import javax.inject.Inject;
Expand All @@ -29,22 +30,20 @@
*/
public class DefaultTomightyLoader implements TomightyLoader {

private static final Logger log = LoggerFactory.getLogger(DefaultTomightyLoader.class);
private final PluginManager pluginManager;

private final PluginLoader pluginLoader;
private static final Logger log = LoggerFactory.getLogger(DefaultTomightyLoader.class);

@Inject
public DefaultTomightyLoader(PluginLoader pluginLoader) {

this.pluginLoader = pluginLoader;
public DefaultTomightyLoader(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}

@Override
public <T> T getInstance(final Class<T> clazz) {

Iterable<Injector> pluginInjectors = pluginLoader.getPluginInjectors();

for (Injector pluginInjector : pluginInjectors) {
Iterable<Plugin> plugins = pluginManager.getLoadedPlugins();
for (Plugin plugin : plugins) {
Injector pluginInjector = plugin.getInjector();
try {
//TODO: Add caching for often used instances. And what to do if something is bound in two injectors?
T instance = pluginInjector.getInstance(clazz);
Expand All @@ -55,6 +54,6 @@ public <T> T getInstance(final Class<T> clazz) {
}
log.debug("No Instance found for {}, returning null", clazz);
return null;

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.tomighty.plugin;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import org.junit.Test;

import static org.junit.Assert.assertSame;

public class DefaultPluginTest {

//TODO test getPluginName
//TODO test getPluginVersion
//TODO test getMenuItem

@Test
public void testInjectorIsTheSameUsedToCreateThePlugin() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Plugin.class).to(DefaultPlugin.class);
}
});

Plugin plugin = injector.getInstance(Plugin.class);

assertSame(injector, plugin.getInjector());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.tomighty.plugin.impl;

import com.google.inject.Injector;
import org.junit.Before;
import org.junit.Test;
import org.tomighty.bus.Bus;
Expand Down Expand Up @@ -52,6 +53,11 @@ public PluginVersion getPluginVersion() {
public MenuItem getMenuItem() {
return null;
}

@Override
public Injector getInjector() {
return null;
}
}

@Before
Expand All @@ -68,7 +74,6 @@ public void setUp() throws Exception {

defaultPluginManager = new DefaultPluginManager(loaderMock, pluginPackFactoryMock, mock(Bus.class));
defaultPluginManager.loadPluginsFrom(pluginsDirectory);

}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import org.junit.Before;
import org.junit.Test;
import org.tomighty.plugin.PluginLoader;
import org.tomighty.plugin.Plugin;
import org.tomighty.plugin.PluginManager;
import org.tomighty.plugin.TomightyLoader;

import java.util.HashSet;
import java.util.Set;
import java.util.*;

import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
Expand All @@ -35,34 +36,58 @@
*/
public class DefaultTomightyLoaderTest {

private TomightyLoader tomightyLoader;
private Plugin pluginWithList;
private Plugin pluginWithMap;

@Before
public void setUp() {
pluginWithList = mock(Plugin.class);
pluginWithMap = mock(Plugin.class);

when(pluginWithList.getInjector()).thenReturn(Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(List.class).to(ArrayList.class);
}
}));

when(pluginWithMap.getInjector()).thenReturn(Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Map.class).to(HashMap.class);
}
}));

PluginManager pluginManager = mock(PluginManager.class);
when(pluginManager.getLoadedPlugins()).thenReturn(setOfPlugins(pluginWithList, pluginWithMap));

tomightyLoader = new DefaultTomightyLoader(pluginManager);
}

@Test
public void testReturnNullIfInstanceNotInInjectors() {
PluginLoader pluginLoader = mock(PluginLoader.class);
when(pluginLoader.getPluginInjectors()).thenReturn(new HashSet<Injector>() {{
add(Guice.createInjector());
}});
DefaultTomightyLoader defaultTomightyLoader = new DefaultTomightyLoader(pluginLoader);
Set instance = defaultTomightyLoader.getInstance(Set.class);

assertNull(instance);
Queue queue = tomightyLoader.getInstance(Queue.class);
assertNull(queue);
}

@Test
public void testReturnInstance() {
PluginLoader pluginLoader = mock(PluginLoader.class);
when(pluginLoader.getPluginInjectors()).thenReturn(new HashSet<Injector>() {{
add(Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Set.class).to(HashSet.class);
}
}));
}});
DefaultTomightyLoader defaultTomightyLoader = new DefaultTomightyLoader(pluginLoader);
Set instance = defaultTomightyLoader.getInstance(Set.class);

assertNotNull(instance);
assertThat(instance, instanceOf(HashSet.class));
public void testGetInstanceOfListFromPluginWithList() {
List list = tomightyLoader.getInstance(List.class);
assertThat(list, instanceOf(ArrayList.class));
}

@Test
public void testGetInstanceOfMapFromPluginWithMap() {
Map map = tomightyLoader.getInstance(Map.class);
assertThat(map, instanceOf(HashMap.class));
}

private Set<Plugin> setOfPlugins(Plugin... plugins) {
Set<Plugin> set = new HashSet<Plugin>();
for(Plugin plugin : plugins)
set.add(plugin);
return set;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.tomighty.plugin.integration.pluginloader;

import com.google.inject.Injector;
import org.tomighty.plugin.Plugin;
import org.tomighty.plugin.PluginVersion;

Expand All @@ -37,4 +38,9 @@ public PluginVersion getPluginVersion() {
public MenuItem getMenuItem() {
return null;
}

@Override
public Injector getInjector() {
return null;
}
}

0 comments on commit d3b84cd

Please sign in to comment.