summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/manager
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2014-03-10 01:50:49 +0100
committerJames Moger <james.moger@gitblit.com>2014-04-10 18:58:09 -0400
commit84f406bfd20ec2076cf7616e7f396ad480513bc4 (patch)
tree661045f193871d676c1c06b996b831469cfc067c /src/main/java/com/gitblit/manager
parent261ddf0fcf9a55fbb5b4e7c6c2cdb4c2f8c860fe (diff)
downloadgitblit-84f406bfd20ec2076cf7616e7f396ad480513bc4.tar.gz
gitblit-84f406bfd20ec2076cf7616e7f396ad480513bc4.zip
Add plugins/extension infrastructure
Plugins are stored in `${baseFolder}/plugins` and are loaded during startup by the PluginManager. A plugin defines it's metadata in META-INF/MANIFEST.MF: Plugin-Class: com.gitblit.plugins.cookbook.CookbookPlugin Plugin-Dependencies: foo, bar Plugin-Id: gitblit-plugin Plugin-Provider: John Doe Plugin-Version: 1.0 Plugins can define extension points that can be implemented by other plugins and they can depend on other plugins: Plugin-Dependencies: foo, bar During the load phase, a directed acyclic graph is built and the loading order of the dependency chain is reversed using a topological sort; parent followed by children. The parent plugin classloader is the combined classloader of all parent plugins. Change-Id: I738821fa2bff02a5dbe339a944cc7e3c4dd8e299
Diffstat (limited to 'src/main/java/com/gitblit/manager')
-rw-r--r--src/main/java/com/gitblit/manager/GitblitManager.java18
-rw-r--r--src/main/java/com/gitblit/manager/IGitblit.java3
-rw-r--r--src/main/java/com/gitblit/manager/IPluginManager.java39
-rw-r--r--src/main/java/com/gitblit/manager/PluginManager.java56
4 files changed, 114 insertions, 2 deletions
diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java
index 8856715a..34c101e2 100644
--- a/src/main/java/com/gitblit/manager/GitblitManager.java
+++ b/src/main/java/com/gitblit/manager/GitblitManager.java
@@ -43,6 +43,8 @@ import org.eclipse.jgit.transport.RefSpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import ro.fortsoft.pf4j.PluginWrapper;
+
import com.gitblit.Constants;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.AccessRestrictionType;
@@ -116,6 +118,8 @@ public class GitblitManager implements IGitblit {
protected final IFederationManager federationManager;
+ protected final IPluginManager pluginManager;
+
public GitblitManager(
IRuntimeManager runtimeManager,
INotificationManager notificationManager,
@@ -124,7 +128,8 @@ public class GitblitManager implements IGitblit {
IPublicKeyManager publicKeyManager,
IRepositoryManager repositoryManager,
IProjectManager projectManager,
- IFederationManager federationManager) {
+ IFederationManager federationManager,
+ IPluginManager pluginManager) {
this.settings = runtimeManager.getSettings();
this.runtimeManager = runtimeManager;
@@ -135,6 +140,7 @@ public class GitblitManager implements IGitblit {
this.repositoryManager = repositoryManager;
this.projectManager = projectManager;
this.federationManager = federationManager;
+ this.pluginManager = pluginManager;
}
@Override
@@ -1171,4 +1177,14 @@ public class GitblitManager implements IGitblit {
public boolean isIdle(Repository repository) {
return repositoryManager.isIdle(repository);
}
+
+ @Override
+ public <T> List<T> getExtensions(Class<T> clazz) {
+ return pluginManager.getExtensions(clazz);
+ }
+
+ @Override
+ public PluginWrapper whichPlugin(Class<?> clazz) {
+ return pluginManager.whichPlugin(clazz);
+ }
}
diff --git a/src/main/java/com/gitblit/manager/IGitblit.java b/src/main/java/com/gitblit/manager/IGitblit.java
index f4221cf9..7961a06b 100644
--- a/src/main/java/com/gitblit/manager/IGitblit.java
+++ b/src/main/java/com/gitblit/manager/IGitblit.java
@@ -36,7 +36,8 @@ public interface IGitblit extends IManager,
IAuthenticationManager,
IRepositoryManager,
IProjectManager,
- IFederationManager {
+ IFederationManager,
+ IPluginManager {
/**
* Returns a list of repository URLs and the user access permission.
diff --git a/src/main/java/com/gitblit/manager/IPluginManager.java b/src/main/java/com/gitblit/manager/IPluginManager.java
new file mode 100644
index 00000000..670e9769
--- /dev/null
+++ b/src/main/java/com/gitblit/manager/IPluginManager.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.manager;
+
+import java.util.List;
+
+import ro.fortsoft.pf4j.PluginWrapper;
+
+public interface IPluginManager extends IManager {
+
+ /**
+ * Retrieves the extension for given class 'clazz'.
+ *
+ * @param clazz extension point class to retrieve extension for
+ * @return list of extensions
+ */
+ public <T> List<T> getExtensions(Class<T> clazz);
+
+ /**
+ * Retrieves the {@link PluginWrapper} that loaded the given class 'clazz'.
+ *
+ * @param clazz extension point class to retrieve extension for
+ * @return PluginWrapper that loaded the given class
+ */
+ public PluginWrapper whichPlugin(Class<?> clazz);
+}
diff --git a/src/main/java/com/gitblit/manager/PluginManager.java b/src/main/java/com/gitblit/manager/PluginManager.java
new file mode 100644
index 00000000..5eb00e92
--- /dev/null
+++ b/src/main/java/com/gitblit/manager/PluginManager.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.manager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ro.fortsoft.pf4j.DefaultPluginManager;
+
+import com.gitblit.Keys;
+
+/**
+ * The plugin manager maintains the lifecycle of plugins. It is exposed as
+ * Dagger bean. The extension consumers supposed to retrieve plugin manager
+ * from the Dagger DI and retrieve extensions provided by active plugins.
+ *
+ * @author David Ostrovsky
+ *
+ */
+public class PluginManager extends DefaultPluginManager implements
+ IPluginManager {
+
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ public PluginManager(IRuntimeManager runtimeManager) {
+ super(runtimeManager.getFileOrFolder(Keys.plugins.folder,
+ "${baseFolder}/plugins"));
+ }
+
+ @Override
+ public PluginManager start() {
+ logger.info("Plugin manager started");
+ loadPlugins();
+ startPlugins();
+ return this;
+ }
+
+ @Override
+ public PluginManager stop() {
+ stopPlugins();
+ return null;
+ }
+}