From 030b2e8db09de077e4c760a135aaa9b9fdf95227 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 12 Oct 2010 09:16:40 +0200 Subject: [PATCH] improve plugin structure --- .../api/rest/resources/GitConfigResource.java | 14 +- .../scm/repository/GitRepositoryHandler.java | 3 + .../main/resources/META-INF/scm/plugin.xml | 17 ++ .../sonia.scm.repository.RepositoryHandler | 1 - .../api/rest/resources/HgConfigResource.java | 8 +- .../scm/repository/HgRepositoryHandler.java | 3 + .../main/resources/META-INF/scm/plugin.xml | 17 ++ .../sonia.scm.repository.RepositoryHandler | 1 - .../scm/repository/SvnRepositoryHandler.java | 3 +- .../main/resources/META-INF/scm/plugin.xml | 17 ++ .../sonia.scm.repository.RepositoryHandler | 1 - scm-core/pom.xml | 16 ++ .../java/sonia/scm/BasicContextProvider.java | 147 +----------------- .../java/sonia/scm/SCMContextProvider.java | 33 ---- .../src/main/java/sonia/scm/SCMPlugin.java | 32 ---- .../main/java/sonia/scm/plugin/SCMPlugin.java | 91 +++++++++++ .../sonia/scm/plugin/SCMPluginManager.java | 142 +++++++++++++++++ .../repository/BasicRepositoryManager.java | 40 +++-- scm-web-api/pom.xml | 6 - scm-webapp/pom.xml | 6 + .../main/java/sonia/scm/ScmServletModule.java | 32 +++- 21 files changed, 374 insertions(+), 256 deletions(-) create mode 100644 plugins/scm-git-plugin/src/main/resources/META-INF/scm/plugin.xml delete mode 100644 plugins/scm-git-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler create mode 100644 plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml delete mode 100644 plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler create mode 100644 plugins/scm-svn-plugin/src/main/resources/META-INF/scm/plugin.xml delete mode 100644 plugins/scm-svn-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler delete mode 100644 scm-core/src/main/java/sonia/scm/SCMPlugin.java create mode 100644 scm-core/src/main/java/sonia/scm/plugin/SCMPlugin.java create mode 100644 scm-core/src/main/java/sonia/scm/plugin/SCMPluginManager.java diff --git a/plugins/scm-git-plugin/src/main/java/sonia/scm/api/rest/resources/GitConfigResource.java b/plugins/scm-git-plugin/src/main/java/sonia/scm/api/rest/resources/GitConfigResource.java index 60b24b3704..fe1054f9a3 100644 --- a/plugins/scm-git-plugin/src/main/java/sonia/scm/api/rest/resources/GitConfigResource.java +++ b/plugins/scm-git-plugin/src/main/java/sonia/scm/api/rest/resources/GitConfigResource.java @@ -12,8 +12,8 @@ package sonia.scm.api.rest.resources; import com.google.inject.Inject; import com.google.inject.Singleton; -import sonia.scm.repository.RepositoryManager; - +import sonia.scm.repository.GitConfig; +import sonia.scm.repository.GitRepositoryHandler; //~--- JDK imports ------------------------------------------------------------ @@ -26,8 +26,6 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import sonia.scm.repository.GitConfig; -import sonia.scm.repository.GitRepositoryHandler; /** * @@ -43,13 +41,13 @@ public class GitConfigResource * Constructs ... * * - * @param repositoryManager + * + * @param repositoryHandler */ @Inject - public GitConfigResource(RepositoryManager repositoryManager) + public GitConfigResource(GitRepositoryHandler repositoryHandler) { - repositoryHandler = (GitRepositoryHandler) repositoryManager.getHandler( - GitRepositoryHandler.TYPE_NAME); + this.repositoryHandler = repositoryHandler; } //~--- get methods ---------------------------------------------------------- diff --git a/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java b/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java index 4160ffe2fe..12c5d5b5de 100644 --- a/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java +++ b/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java @@ -9,6 +9,8 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Singleton; + import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; @@ -21,6 +23,7 @@ import java.io.IOException; * * @author Sebastian Sdorra */ +@Singleton public class GitRepositoryHandler extends AbstractSimpleRepositoryHandler { diff --git a/plugins/scm-git-plugin/src/main/resources/META-INF/scm/plugin.xml b/plugins/scm-git-plugin/src/main/resources/META-INF/scm/plugin.xml new file mode 100644 index 0000000000..b9f1986fe8 --- /dev/null +++ b/plugins/scm-git-plugin/src/main/resources/META-INF/scm/plugin.xml @@ -0,0 +1,17 @@ + + + + + + + + sonia.scm.repository.GitRepositoryHandler + + + diff --git a/plugins/scm-git-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler b/plugins/scm-git-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler deleted file mode 100644 index 26825926b7..0000000000 --- a/plugins/scm-git-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler +++ /dev/null @@ -1 +0,0 @@ -sonia.scm.repository.GitRepositoryHandler \ No newline at end of file diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java index 9aecc3f5a5..684a8fd734 100644 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java @@ -47,13 +47,13 @@ public class HgConfigResource * Constructs ... * * - * @param repositoryManager + * + * @param handler */ @Inject - public HgConfigResource(RepositoryManager repositoryManager) + public HgConfigResource(HgRepositoryHandler handler) { - handler = (HgRepositoryHandler) repositoryManager.getHandler( - HgRepositoryHandler.TYPE_NAME); + this.handler = handler; } //~--- get methods ---------------------------------------------------------- diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index 74a35728dc..628c752e5f 100644 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -9,6 +9,8 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Singleton; + import sonia.scm.ConfigurationException; import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; @@ -37,6 +39,7 @@ import java.util.logging.Logger; * * @author Sebastian Sdorra */ +@Singleton public class HgRepositoryHandler extends AbstractRepositoryHandler { diff --git a/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml b/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml new file mode 100644 index 0000000000..2ade20e967 --- /dev/null +++ b/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml @@ -0,0 +1,17 @@ + + + + + + + + sonia.scm.repository.HgRepositoryHandler + + + diff --git a/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler b/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler deleted file mode 100644 index 510a52f2a0..0000000000 --- a/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler +++ /dev/null @@ -1 +0,0 @@ -sonia.scm.repository.HgRepositoryHandler \ No newline at end of file diff --git a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index 60e1bd1845..a8be527e25 100644 --- a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -13,7 +13,7 @@ import sonia.scm.ConfigurationException; import sonia.scm.SCMContextProvider; import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; -import sonia.scm.util.Util; +import sonia.scm.util.IOUtil; //~--- JDK imports ------------------------------------------------------------ @@ -28,7 +28,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXB; -import sonia.scm.util.IOUtil; /** * diff --git a/plugins/scm-svn-plugin/src/main/resources/META-INF/scm/plugin.xml b/plugins/scm-svn-plugin/src/main/resources/META-INF/scm/plugin.xml new file mode 100644 index 0000000000..307d22a9f9 --- /dev/null +++ b/plugins/scm-svn-plugin/src/main/resources/META-INF/scm/plugin.xml @@ -0,0 +1,17 @@ + + + + + + + + sonia.scm.repository.SvnRepositoryHandler + + + diff --git a/plugins/scm-svn-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler b/plugins/scm-svn-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler deleted file mode 100644 index ab9c76f40a..0000000000 --- a/plugins/scm-svn-plugin/src/main/resources/META-INF/services/sonia.scm.repository.RepositoryHandler +++ /dev/null @@ -1 +0,0 @@ -sonia.scm.repository.SvnRepositoryHandler \ No newline at end of file diff --git a/scm-core/pom.xml b/scm-core/pom.xml index fced383e7b..1e66c71a7b 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -15,4 +15,20 @@ 1.0-SNAPSHOT scm-core + + + + com.google.inject + guice + ${guice.version} + + + + com.google.inject.extensions + guice-multibindings + ${guice.version} + + + + diff --git a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java index 44456a50df..7896704948 100644 --- a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java +++ b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java @@ -9,12 +9,6 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.group.GroupManager; -import sonia.scm.repository.BasicRepositoryManager; -import sonia.scm.repository.RepositoryManager; -import sonia.scm.security.EncryptionHandler; -import sonia.scm.security.MessageDigestEncryptionHandler; -import sonia.scm.util.ServiceUtil; import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ @@ -22,11 +16,6 @@ import sonia.scm.util.Util; import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * * @author Sebastian Sdorra @@ -63,33 +52,14 @@ public class BasicContextProvider implements SCMContextProvider * @throws IOException */ @Override - public void close() throws IOException - { - for (SCMPlugin plugin : plugins) - { - plugin.contextDestroyed(this); - } - - for (GroupManager manager : groupManagerMap.values()) - { - manager.close(); - } - - repositoryManager.close(); - } + public void close() throws IOException {} /** * Method description * */ @Override - public void init() - { - loadGroupManagers(); - loadRepositoryManager(); - loadEncryptionHandler(); - loadPlugins(); - } + public void init() {} //~--- get methods ---------------------------------------------------------- @@ -105,45 +75,6 @@ public class BasicContextProvider implements SCMContextProvider return baseDirectory; } - /** - * Method description - * - * - * @return - */ - @Override - public EncryptionHandler getEncryptionHandler() - { - return encryptionHandler; - } - - /** - * Method description - * - * - * @param type - * - * @return - */ - @Override - public GroupManager getGroupManager(String type) - { - return groupManagerMap.get(type); - } - - /** - * Method description - * - * - * - * @return - */ - @Override - public RepositoryManager getRepositoryManager() - { - return repositoryManager; - } - //~--- methods -------------------------------------------------------------- /** @@ -177,82 +108,8 @@ public class BasicContextProvider implements SCMContextProvider return directory; } - /** - * Method description - * - */ - private void loadEncryptionHandler() - { - encryptionHandler = ServiceUtil.getService(EncryptionHandler.class); - - if (encryptionHandler == null) - { - encryptionHandler = new MessageDigestEncryptionHandler(); - } - } - - /** - * Method description - * - */ - private void loadGroupManagers() - { - groupManagerMap = new HashMap(); - - List groupManagers = - ServiceUtil.getServices(GroupManager.class); - - for (GroupManager manager : groupManagers) - { - manager.init(this); - groupManagerMap.put(manager.getType(), manager); - } - } - - /** - * Method description - * - */ - private void loadPlugins() - { - plugins = ServiceUtil.getServices(SCMPlugin.class); - - for (SCMPlugin plugin : plugins) - { - plugin.contextInitialized(this); - } - } - - /** - * Method description - * - */ - private void loadRepositoryManager() - { - repositoryManager = ServiceUtil.getService(RepositoryManager.class); - - if (repositoryManager == null) - { - repositoryManager = new BasicRepositoryManager(); - } - - repositoryManager.init(this); - } - //~--- fields --------------------------------------------------------------- /** Field description */ private File baseDirectory; - - /** Field description */ - private EncryptionHandler encryptionHandler; - - /** Field description */ - private Map groupManagerMap; - - /** Field description */ - private List plugins; - - /** Field description */ - private RepositoryManager repositoryManager; } diff --git a/scm-core/src/main/java/sonia/scm/SCMContextProvider.java b/scm-core/src/main/java/sonia/scm/SCMContextProvider.java index 34b5f22fe6..91eaf99381 100644 --- a/scm-core/src/main/java/sonia/scm/SCMContextProvider.java +++ b/scm-core/src/main/java/sonia/scm/SCMContextProvider.java @@ -7,12 +7,6 @@ package sonia.scm; -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.group.GroupManager; -import sonia.scm.repository.RepositoryManager; -import sonia.scm.security.EncryptionHandler; - //~--- JDK imports ------------------------------------------------------------ import java.io.Closeable; @@ -40,31 +34,4 @@ public interface SCMContextProvider extends Closeable * @return */ public File getBaseDirectory(); - - /** - * Method description - * - * - * @return - */ - public EncryptionHandler getEncryptionHandler(); - - /** - * Method description - * - * - * - * @param type - * @return - */ - public GroupManager getGroupManager(String type); - - /** - * Method description - * - * - * - * @return - */ - public RepositoryManager getRepositoryManager(); } diff --git a/scm-core/src/main/java/sonia/scm/SCMPlugin.java b/scm-core/src/main/java/sonia/scm/SCMPlugin.java deleted file mode 100644 index 112ebd9b00..0000000000 --- a/scm-core/src/main/java/sonia/scm/SCMPlugin.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - - - -package sonia.scm; - -/** - * - * @author Sebastian Sdorra - */ -public interface SCMPlugin -{ - - /** - * Method description - * - * - * @param context - */ - public void contextDestroyed(SCMContextProvider context); - - /** - * Method description - * - * - * @param context - */ - public void contextInitialized(SCMContextProvider context); -} diff --git a/scm-core/src/main/java/sonia/scm/plugin/SCMPlugin.java b/scm-core/src/main/java/sonia/scm/plugin/SCMPlugin.java new file mode 100644 index 0000000000..ef3d7ca287 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/plugin/SCMPlugin.java @@ -0,0 +1,91 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.repository.RepositoryHandler; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Sebastian Sdorra + */ +@XmlRootElement(name = "plugin-config") +@XmlAccessorType(XmlAccessType.FIELD) +public class SCMPlugin +{ + + /** + * Constructs ... + * + */ + public SCMPlugin() + { + handlers = new HashSet>(); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param handlerClass + * + * @return + */ + public boolean addHandler(Class handlerClass) + { + return handlers.add(handlerClass); + } + + /** + * Method description + * + * + * @param handlerClass + * + * @return + */ + public boolean removeHandler(Class handlerClass) + { + return handlers.remove(handlerClass); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public Collection> getHandlers() + { + return handlers; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + @XmlElementWrapper(name = "repository-handlers") + @XmlElement(name = "handler") + private Set> handlers; +} diff --git a/scm-core/src/main/java/sonia/scm/plugin/SCMPluginManager.java b/scm-core/src/main/java/sonia/scm/plugin/SCMPluginManager.java new file mode 100644 index 0000000000..9c98555f54 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/plugin/SCMPluginManager.java @@ -0,0 +1,142 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.repository.RepositoryHandler; +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +import java.net.URL; + +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.bind.JAXB; + +/** + * + * @author Sebastian Sdorra + */ +public class SCMPluginManager +{ + + /** Field description */ + public static final String PATH_PLUGINCONFIG = "META-INF/scm/plugin.xml"; + + /** Field description */ + private static final Logger logger = + Logger.getLogger(SCMPluginManager.class.getName()); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public SCMPluginManager() + { + repositoryHandlers = new HashSet>(); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @throws IOException + */ + public void load() throws IOException + { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + + if (classLoader == null) + { + classLoader = SCMPluginManager.class.getClassLoader(); + } + + load(classLoader); + } + + /** + * Method description + * + * + * @param classLoader + * + * @throws IOException + */ + public void load(ClassLoader classLoader) throws IOException + { + Enumeration urlEnum = classLoader.getResources(PATH_PLUGINCONFIG); + + if (urlEnum != null) + { + while (urlEnum.hasMoreElements()) + { + URL url = urlEnum.nextElement(); + + loadPlugin(url); + } + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public Set> getRepositoryHandlers() + { + return repositoryHandlers; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param url + */ + private void loadPlugin(URL url) + { + try + { + SCMPlugin plugin = JAXB.unmarshal(url, SCMPlugin.class); + Collection> handlers = + plugin.getHandlers(); + + if (Util.isNotEmpty(handlers)) + { + repositoryHandlers.addAll(handlers); + } + } + catch (Exception ex) + { + logger.log(Level.SEVERE, null, ex); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Set> repositoryHandlers; +} diff --git a/scm-core/src/main/java/sonia/scm/repository/BasicRepositoryManager.java b/scm-core/src/main/java/sonia/scm/repository/BasicRepositoryManager.java index 5a1a637395..aff5325edb 100644 --- a/scm-core/src/main/java/sonia/scm/repository/BasicRepositoryManager.java +++ b/scm-core/src/main/java/sonia/scm/repository/BasicRepositoryManager.java @@ -9,12 +9,14 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Inject; +import com.google.inject.Singleton; + import sonia.scm.ConfigurationException; import sonia.scm.SCMContext; import sonia.scm.SCMContextProvider; import sonia.scm.util.AssertUtil; -import sonia.scm.util.ServiceUtil; -import sonia.scm.util.Util; +import sonia.scm.util.IOUtil; //~--- JDK imports ------------------------------------------------------------ @@ -32,17 +34,26 @@ import java.util.Set; * * @author Sebastian Sdorra */ +@Singleton public class BasicRepositoryManager extends AbstractRepositoryManager { /** * Constructs ... * + * + * @param handlerSet */ - public BasicRepositoryManager() + @Inject + public BasicRepositoryManager(Set handlerSet) { handlerMap = new HashMap(); types = new ArrayList(); + + for (RepositoryHandler handler : handlerSet) + { + addHandler(handler); + } } //~--- methods -------------------------------------------------------------- @@ -70,6 +81,7 @@ public class BasicRepositoryManager extends AbstractRepositoryManager handlerMap.put(type.getName(), handler); handler.init(SCMContext.getContext()); + types.add(type); } /** @@ -81,9 +93,9 @@ public class BasicRepositoryManager extends AbstractRepositoryManager @Override public void close() throws IOException { - for (RepositoryHandler manager : handlerMap.values()) + for (RepositoryHandler handler : handlerMap.values()) { - manager.close(); + IOUtil.close(handler); } } @@ -128,23 +140,7 @@ public class BasicRepositoryManager extends AbstractRepositoryManager * @param context */ @Override - public void init(SCMContextProvider context) - { - List handlerList = - ServiceUtil.getServices(RepositoryHandler.class); - - if (Util.isNotEmpty(handlerList)) - { - for (RepositoryHandler handler : handlerList) - { - RepositoryType type = handler.getType(); - - types.add(type); - handlerMap.put(type.getName(), handler); - handler.init(context); - } - } - } + public void init(SCMContextProvider context) {} /** * Method description diff --git a/scm-web-api/pom.xml b/scm-web-api/pom.xml index fd21c89f05..73f44b65d2 100644 --- a/scm-web-api/pom.xml +++ b/scm-web-api/pom.xml @@ -36,12 +36,6 @@ ${jersey.version} - - com.google.inject - guice - ${guice.version} - - com.google.inject.extensions guice-servlet diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index f2d466eb32..205b98edf0 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -79,6 +79,12 @@ ${jersey.version} + + com.google.inject.extensions + guice-multibindings + ${guice.version} + + net.sf.ehcache ehcache-core diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index ede8d3cee9..75beaa632f 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -9,10 +9,14 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.multibindings.Multibinder; import com.google.inject.servlet.ServletModule; import sonia.scm.api.rest.UriExtensionsConfig; +import sonia.scm.plugin.SCMPluginManager; import sonia.scm.plugin.ScriptResourceServlet; +import sonia.scm.repository.BasicRepositoryManager; +import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.web.ScmWebPluginContext; import sonia.scm.web.security.Authenticator; @@ -25,8 +29,12 @@ import com.sun.jersey.api.core.ResourceConfig; import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; import com.sun.jersey.spi.container.servlet.ServletContainer; +import java.io.IOException; + import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -88,8 +96,30 @@ public class ScmServletModule extends ServletModule SCMContextProvider context = SCMContext.getContext(); bind(SCMContextProvider.class).toInstance(context); + + Multibinder repositoryHandlerBinder = + Multibinder.newSetBinder(binder(), RepositoryHandler.class); + SCMPluginManager pluginManager = new SCMPluginManager(); + + try + { + pluginManager.load(); + } + catch (IOException ex) + { + Logger.getLogger(ScmServletModule.class.getName()).log(Level.SEVERE, + null, ex); + } + + for (Class handler : + pluginManager.getRepositoryHandlers()) + { + bind(handler); + repositoryHandlerBinder.addBinding().to(handler); + } + bind(Authenticator.class).to(DemoAuthenticator.class); - bind(RepositoryManager.class).toInstance(context.getRepositoryManager()); + bind(RepositoryManager.class).to(BasicRepositoryManager.class); bind(ScmWebPluginContext.class).toInstance(webPluginContext); /*