diff --git a/scm-web-api/src/main/java/sonia/scm/web/plugin/SCMPlugin.java b/scm-web-api/src/main/java/sonia/scm/web/plugin/SCMPlugin.java index f361b9300c..485c80d78f 100644 --- a/scm-web-api/src/main/java/sonia/scm/web/plugin/SCMPlugin.java +++ b/scm-web-api/src/main/java/sonia/scm/web/plugin/SCMPlugin.java @@ -29,15 +29,17 @@ * */ + + package sonia.scm.web.plugin; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.RepositoryHandler; +import sonia.scm.user.UserHandler; //~--- JDK imports ------------------------------------------------------------ -import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -62,35 +64,8 @@ public class SCMPlugin */ 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); + repositoryHandlers = new HashSet>(); + userHandlers = new HashSet>(); } //~--- get methods ---------------------------------------------------------- @@ -101,9 +76,9 @@ public class SCMPlugin * * @return */ - public Collection> getHandlers() + public Set> getRepositoryHandlers() { - return handlers; + return repositoryHandlers; } /** @@ -117,6 +92,17 @@ public class SCMPlugin return securityConfig; } + /** + * Method description + * + * + * @return + */ + public Set> getUserHandlers() + { + return userHandlers; + } + /** * Method description * @@ -130,6 +116,18 @@ public class SCMPlugin //~--- set methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param repositoryHandlers + */ + public void setRepositoryHandlers( + Set> repositoryHandlers) + { + this.repositoryHandlers = repositoryHandlers; + } + /** * Method description * @@ -141,6 +139,17 @@ public class SCMPlugin this.securityConfig = securityConfig; } + /** + * Method description + * + * + * @param userHandlers + */ + public void setUserHandlers(Set> userHandlers) + { + this.userHandlers = userHandlers; + } + /** * Method description * @@ -157,12 +166,17 @@ public class SCMPlugin /** Field description */ @XmlElementWrapper(name = "repository-handlers") @XmlElement(name = "repository-handler") - private Set> handlers; + private Set> repositoryHandlers; /** Field description */ @XmlElement(name = "security") private SecurityConfig securityConfig; + /** Field description */ + @XmlElementWrapper(name = "user-handlers") + @XmlElement(name = "user-handler") + private Set> userHandlers; + /** Field description */ @XmlElement(name = "web-plugin") private Class webPlugin; diff --git a/scm-webapp/src/main/java/sonia/scm/ContextListener.java b/scm-webapp/src/main/java/sonia/scm/ContextListener.java index c720c4d48b..e00ea55ae5 100644 --- a/scm-webapp/src/main/java/sonia/scm/ContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ContextListener.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- @@ -42,6 +44,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.RepositoryManager; +import sonia.scm.user.UserManager; import sonia.scm.util.Util; import sonia.scm.web.plugin.SCMPlugin; import sonia.scm.web.plugin.SCMPluginManager; @@ -164,6 +167,9 @@ public class ContextListener extends GuiceServletContextListener // init RepositoryManager injector.getInstance(RepositoryManager.class).init(SCMContext.getContext()); + // init UserManager + injector.getInstance(UserManager.class).init(SCMContext.getContext()); + // init Authenticator injector.getInstance(Authenticator.class).init(SCMContext.getContext()); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index 33fb0f8e18..2d05edaebc 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- @@ -50,6 +52,10 @@ import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.security.EncryptionHandler; import sonia.scm.security.MessageDigestEncryptionHandler; +import sonia.scm.user.BasicUserManager; +import sonia.scm.user.UserHandler; +import sonia.scm.user.UserManager; +import sonia.scm.user.XmlUserHandler; import sonia.scm.util.DebugServlet; import sonia.scm.util.Util; import sonia.scm.web.plugin.SCMPlugin; @@ -154,6 +160,7 @@ public class ScmServletModule extends ServletModule bind(RepositoryManager.class).annotatedWith(Undecorated.class).to( BasicRepositoryManager.class); bind(RepositoryManager.class).to(CacheRepositoryManagerDecorator.class); + bind(UserManager.class).to(BasicUserManager.class); bind(ScmWebPluginContext.class).toInstance(webPluginContext); /* @@ -211,6 +218,28 @@ public class ScmServletModule extends ServletModule } } + /** + * Method description + * + * + * @param userHandlerBinder + * @param handlerSet + */ + private void bindUserHandlers(Multibinder userHandlerBinder, + Set> handlerSet) + { + for (Class handlerClass : handlerSet) + { + if (logger.isInfoEnabled()) + { + logger.info("load UserHandler {}", handlerClass.getName()); + } + + bind(handlerClass); + userHandlerBinder.addBinding().to(handlerClass); + } + } + /** * Method description * @@ -223,22 +252,42 @@ public class ScmServletModule extends ServletModule if (Util.isNotEmpty(pluginSet)) { + + // repository handlers Multibinder repositoryHandlerBinder = Multibinder.newSetBinder(binder(), RepositoryHandler.class); - Set> handlerSet = + Set> repositoryHandlerSet = new LinkedHashSet>(); + + // user handlers + Multibinder userHandlerBinder = + Multibinder.newSetBinder(binder(), UserHandler.class); + Set> userHandlerSet = + new LinkedHashSet>(); + + userHandlerSet.add(XmlUserHandler.class); + + // security stuff Class encryptionHandler = MessageDigestEncryptionHandler.class; Class authenticator = XmlAuthenticator.class; for (SCMPlugin plugin : pluginSet) { - Collection> handlers = - plugin.getHandlers(); + Collection> pluginRepositoryHandlers = + plugin.getRepositoryHandlers(); - if (Util.isNotEmpty(handlers)) + if (Util.isNotEmpty(pluginRepositoryHandlers)) { - handlerSet.addAll(handlers); + repositoryHandlerSet.addAll(pluginRepositoryHandlers); + } + + Collection> pluginUserHandlers = + plugin.getUserHandlers(); + + if (Util.isNotEmpty(pluginUserHandlers)) + { + userHandlerSet.addAll(pluginUserHandlers); } SecurityConfig securityConfig = plugin.getSecurityConfig(); @@ -265,7 +314,8 @@ public class ScmServletModule extends ServletModule bind(EncryptionHandler.class).to(encryptionHandler); bind(Authenticator.class).to(authenticator); - bindRepositoryHandlers(repositoryHandlerBinder, handlerSet); + bindRepositoryHandlers(repositoryHandlerBinder, repositoryHandlerSet); + bindUserHandlers(userHandlerBinder, userHandlerSet); } }