diff options
author | James Moger <james.moger@gitblit.com> | 2014-09-04 20:17:17 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-09-04 20:17:17 -0400 |
commit | 22ed6a50dd6742d5b3a964be4b7a8d7c2b58f88e (patch) | |
tree | 811226b3ebb95538152b380217173b6740b60161 | |
parent | 426f5c1729554d318989041457554f2abfa79d3e (diff) | |
download | gitblit-22ed6a50dd6742d5b3a964be4b7a8d7c2b58f88e.tar.gz gitblit-22ed6a50dd6742d5b3a964be4b7a8d7c2b58f88e.zip |
Allow Plugins to have injected members and Extensions to be constructed
-rw-r--r-- | .classpath | 2 | ||||
-rw-r--r-- | build.moxie | 2 | ||||
-rw-r--r-- | gitblit.iml | 6 | ||||
-rw-r--r-- | src/main/java/com/gitblit/manager/PluginManager.java | 77 |
4 files changed, 56 insertions, 31 deletions
@@ -75,7 +75,7 @@ <classpathentry kind="lib" path="ext/args4j-2.0.26.jar" sourcepath="ext/src/args4j-2.0.26.jar" /> <classpathentry kind="lib" path="ext/jedis-2.3.1.jar" sourcepath="ext/src/jedis-2.3.1.jar" /> <classpathentry kind="lib" path="ext/commons-pool2-2.0.jar" sourcepath="ext/src/commons-pool2-2.0.jar" /> - <classpathentry kind="lib" path="ext/pf4j-0.8.0.jar" sourcepath="ext/src/pf4j-0.8.0.jar" /> + <classpathentry kind="lib" path="ext/pf4j-0.9.0.jar" sourcepath="ext/src/pf4j-0.9.0.jar" /> <classpathentry kind="lib" path="ext/tika-core-1.5.jar" sourcepath="ext/src/tika-core-1.5.jar" /> <classpathentry kind="lib" path="ext/junit-4.11.jar" sourcepath="ext/src/junit-4.11.jar" /> <classpathentry kind="lib" path="ext/hamcrest-core-1.3.jar" sourcepath="ext/src/hamcrest-core-1.3.jar" /> diff --git a/build.moxie b/build.moxie index b2651154..ea2763c4 100644 --- a/build.moxie +++ b/build.moxie @@ -176,7 +176,7 @@ dependencies: - compile 'args4j:args4j:2.0.26' :war :fedclient - compile 'commons-codec:commons-codec:1.7' :war - compile 'redis.clients:jedis:2.3.1' :war -- compile 'ro.fortsoft.pf4j:pf4j:0.8.0' :war +- compile 'ro.fortsoft.pf4j:pf4j:0.9.0' :war - compile 'org.apache.tika:tika-core:1.5' :war - test 'junit' # Dependencies for Selenium web page testing diff --git a/gitblit.iml b/gitblit.iml index d36f3218..4061daf4 100644 --- a/gitblit.iml +++ b/gitblit.iml @@ -780,13 +780,13 @@ </library> </orderEntry> <orderEntry type="module-library"> - <library name="pf4j-0.8.0.jar"> + <library name="pf4j-0.9.0.jar"> <CLASSES> - <root url="jar://$MODULE_DIR$/ext/pf4j-0.8.0.jar!/" /> + <root url="jar://$MODULE_DIR$/ext/pf4j-0.9.0.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> - <root url="jar://$MODULE_DIR$/ext/src/pf4j-0.8.0.jar!/" /> + <root url="jar://$MODULE_DIR$/ext/src/pf4j-0.9.0.jar!/" /> </SOURCES> </library> </orderEntry> diff --git a/src/main/java/com/gitblit/manager/PluginManager.java b/src/main/java/com/gitblit/manager/PluginManager.java index 874e24b5..58303750 100644 --- a/src/main/java/com/gitblit/manager/PluginManager.java +++ b/src/main/java/com/gitblit/manager/PluginManager.java @@ -37,10 +37,12 @@ import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ro.fortsoft.pf4j.DefaultExtensionFinder; +import ro.fortsoft.pf4j.DefaultPluginFactory; import ro.fortsoft.pf4j.DefaultPluginManager; -import ro.fortsoft.pf4j.ExtensionFinder; +import ro.fortsoft.pf4j.ExtensionFactory; +import ro.fortsoft.pf4j.Plugin; import ro.fortsoft.pf4j.PluginClassLoader; +import ro.fortsoft.pf4j.PluginFactory; import ro.fortsoft.pf4j.PluginState; import ro.fortsoft.pf4j.PluginStateEvent; import ro.fortsoft.pf4j.PluginStateListener; @@ -105,32 +107,18 @@ public class PluginManager implements IPluginManager, PluginStateListener { public PluginManager start() { File dir = runtimeManager.getFileOrFolder(Keys.plugins.folder, "${baseFolder}/plugins"); dir.mkdirs(); + pf4j = new DefaultPluginManager(dir) { + + @Override + protected PluginFactory createPluginFactory() { + return new GuicePluginFactory(); + } + @Override - protected ExtensionFinder createExtensionFinder() { - DefaultExtensionFinder extensionFinder = new DefaultExtensionFinder(this) { - @Override - protected ExtensionFactory createExtensionFactory() { - return new ExtensionFactory() { - @Override - public Object create(Class<?> extensionType) { - // instantiate && inject the extension - logger.debug("Create instance for extension '{}'", extensionType.getName()); - try { - return runtimeManager.getInjector().getInstance(extensionType); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return null; - } - - }; - } - }; - addPluginStateListener(extensionFinder); - - return extensionFinder; - } + protected ExtensionFactory createExtensionFactory() { + return new GuiceExtensionFactory(); + } }; try { @@ -600,4 +588,41 @@ public class PluginManager implements IPluginManager, PluginStateListener { protected String getProxyAuthorization(URL url) { return ""; } + + /** + * Instantiates a plugin using pf4j but injects member fields + * with Guice. + */ + private class GuicePluginFactory extends DefaultPluginFactory { + + @Override + public Plugin create(PluginWrapper pluginWrapper) { + // use pf4j to create the plugin + Plugin plugin = super.create(pluginWrapper); + + if (plugin != null) { + // allow Guice to inject member fields + runtimeManager.getInjector().injectMembers(plugin); + } + + return plugin; + } + } + + /** + * Instantiates an extension using Guice. + */ + private class GuiceExtensionFactory implements ExtensionFactory { + @Override + public Object create(Class<?> extensionClass) { + // instantiate && inject the extension + logger.debug("Create instance for extension '{}'", extensionClass.getName()); + try { + return runtimeManager.getInjector().getInstance(extensionClass); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + } } |