From 22ed6a50dd6742d5b3a964be4b7a8d7c2b58f88e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 04 Sep 2014 20:17:17 -0400
Subject: [PATCH] Allow Plugins to have injected members and Extensions to be constructed

---
 .classpath                                           |    2 
 src/main/java/com/gitblit/manager/PluginManager.java |   75 +++++++++++++++++++++++++------------
 build.moxie                                          |    2 
 gitblit.iml                                          |    6 +-
 4 files changed, 55 insertions(+), 30 deletions(-)

diff --git a/.classpath b/.classpath
index 3e6b8a9..53faa53 100644
--- a/.classpath
+++ b/.classpath
@@ -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 b265115..ea2763c 100644
--- a/build.moxie
+++ b/build.moxie
@@ -176,7 +176,7 @@
 - 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 d36f321..4061daf 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 874e24b..5830375 100644
--- a/src/main/java/com/gitblit/manager/PluginManager.java
+++ b/src/main/java/com/gitblit/manager/PluginManager.java
@@ -37,10 +37,12 @@
 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 PluginManager start() {
 		File dir = runtimeManager.getFileOrFolder(Keys.plugins.folder, "${baseFolder}/plugins");
 		dir.mkdirs();
+
 		pf4j = new DefaultPluginManager(dir) {
+
 			@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;
-		    				}
+			protected PluginFactory createPluginFactory() {
+				return new GuicePluginFactory();
+			}
 
-		    			};
-		    		}
-		    	};
-		        addPluginStateListener(extensionFinder);
-
-		        return extensionFinder;
-		    }
+			@Override
+			protected ExtensionFactory createExtensionFactory() {
+				return new GuiceExtensionFactory();
+			}
 		};
 
 		try {
@@ -600,4 +588,41 @@
 	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;
+		}
+	}
 }

--
Gitblit v1.9.1