diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index 4aec99346c..d7c0fc5ba2 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -109,6 +109,16 @@ public class BindingExtensionProcessor implements ExtensionProcessor Multibinder changesetPreProcessorFactoryBinder = Multibinder.newSetBinder(binder, ChangesetPreProcessorFactory.class); + // listeners + Multibinder repositoryListenerBinder = + Multibinder.newSetBinder(binder, RepositoryListener.class); + Multibinder userListenerBinder = + Multibinder.newSetBinder(binder, UserListener.class); + Multibinder groupListenerBinder = + Multibinder.newSetBinder(binder, GroupListener.class); + Multibinder authenticationListenerBinder = + Multibinder.newSetBinder(binder, AuthenticationListener.class); + authenticators.addBinding().to(XmlAuthenticationHandler.class); for (Class extensionClass : extensions) @@ -147,9 +157,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor logger.info("bind GroupListener {}", extensionClass.getName()); } - GroupListener listener = (GroupListener) extensionClass.newInstance(); - - groupListeners.add(listener); + binder.bind(extensionClass); + groupListenerBinder.addBinding().to(extensionClass); } else if (UserListener.class.isAssignableFrom(extensionClass)) { @@ -158,9 +167,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor logger.info("bind UserListener {}", extensionClass.getName()); } - UserListener listener = (UserListener) extensionClass.newInstance(); - - userListeners.add(listener); + binder.bind(extensionClass); + userListenerBinder.addBinding().to(extensionClass); } else if (RepositoryListener.class.isAssignableFrom(extensionClass)) { @@ -169,10 +177,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor logger.info("bind RepositoryListener {}", extensionClass.getName()); } - RepositoryListener listener = - (RepositoryListener) extensionClass.newInstance(); - - repositoryListeners.add(listener); + binder.bind(extensionClass); + repositoryListenerBinder.addBinding().to(extensionClass); } else if (AuthenticationListener.class.isAssignableFrom(extensionClass)) { @@ -182,10 +188,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor extensionClass.getName()); } - AuthenticationListener listener = - (AuthenticationListener) extensionClass.newInstance(); - - authenticationListeners.add(listener); + binder.bind(extensionClass); + authenticationListenerBinder.addBinding().to(extensionClass); } else if (ResourceHandler.class.isAssignableFrom(extensionClass)) { @@ -285,17 +289,6 @@ public class BindingExtensionProcessor implements ExtensionProcessor //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - public Set getAuthenticationListeners() - { - return authenticationListeners; - } - /** * Method description * @@ -307,17 +300,6 @@ public class BindingExtensionProcessor implements ExtensionProcessor return fileSystemClass; } - /** - * Method description - * - * - * @return - */ - public Set getGroupListeners() - { - return groupListeners; - } - /** * Method description * @@ -340,28 +322,6 @@ public class BindingExtensionProcessor implements ExtensionProcessor return moduleSet; } - /** - * Method description - * - * - * @return - */ - public Set getRepositoryListeners() - { - return repositoryListeners; - } - - /** - * Method description - * - * - * @return - */ - public Set getUserListeners() - { - return userListeners; - } - //~--- methods -------------------------------------------------------------- /** @@ -420,18 +380,4 @@ public class BindingExtensionProcessor implements ExtensionProcessor /** Field description */ private Set moduleSet; - - /** Field description */ - private Set repositoryListeners = - new HashSet(); - - /** Field description */ - private Set authenticationListeners = - new HashSet(); - - /** Field description */ - private Set userListeners = new HashSet(); - - /** Field description */ - private Set groupListeners = new HashSet(); } diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index b0c0f02f6a..7f6050becb 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -151,20 +151,17 @@ public class ScmContextListener extends GuiceServletContextListener RepositoryManager repositoryManager = injector.getInstance(RepositoryManager.class); - repositoryManager.addListeners(bindExtProcessor.getRepositoryListeners()); repositoryManager.addHooks(bindExtProcessor.getHooks()); repositoryManager.init(context); // init UserManager UserManager userManager = injector.getInstance(UserManager.class); - userManager.addListeners(bindExtProcessor.getUserListeners()); userManager.init(context); // init GroupManager GroupManager groupManager = injector.getInstance(GroupManager.class); - groupManager.addListeners(bindExtProcessor.getGroupListeners()); groupManager.init(context); // init Authenticator @@ -172,8 +169,6 @@ public class ScmContextListener extends GuiceServletContextListener injector.getInstance(AuthenticationManager.class); authenticationManager.init(context); - authenticationManager.addListeners( - bindExtProcessor.getAuthenticationListeners()); return injector; } diff --git a/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java index 805095c598..7550953461 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java @@ -49,6 +49,7 @@ import sonia.scm.group.AbstractGroupManager; import sonia.scm.group.Group; import sonia.scm.group.GroupAllreadyExistExeption; import sonia.scm.group.GroupException; +import sonia.scm.group.GroupListener; import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchUtil; import sonia.scm.security.SecurityContext; @@ -68,6 +69,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @@ -95,13 +97,16 @@ public class XmlGroupManager extends AbstractGroupManager * * @param securityContextProvider * @param storeFactory + * @param groupListenerProvider */ @Inject public XmlGroupManager(Provider securityContextProvider, - StoreFactory storeFactory) + StoreFactory storeFactory, + Provider> groupListenerProvider) { this.securityContextProvider = securityContextProvider; this.store = storeFactory.getStore(XmlGroupDatabase.class, STORE_NAME); + this.groupListenerProvider = groupListenerProvider; } //~--- methods -------------------------------------------------------------- @@ -215,6 +220,13 @@ public class XmlGroupManager extends AbstractGroupManager { groupDB = new XmlGroupDatabase(); } + + Set listeners = groupListenerProvider.get(); + + if (Util.isNotEmpty(listeners)) + { + addListeners(listeners); + } } /** @@ -482,6 +494,9 @@ public class XmlGroupManager extends AbstractGroupManager /** Field description */ private XmlGroupDatabase groupDB; + /** Field description */ + private Provider> groupListenerProvider; + /** Field description */ private Provider securityContextProvider; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java index 6a4bd1416c..859e77ae63 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java @@ -58,6 +58,7 @@ import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryHandlerNotFoundException; import sonia.scm.repository.RepositoryHook; import sonia.scm.repository.RepositoryHookEvent; +import sonia.scm.repository.RepositoryListener; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.security.ScmSecurityException; import sonia.scm.store.Store; @@ -111,15 +112,18 @@ public class XmlRepositoryManager extends AbstractRepositoryManager * @param securityContextProvider * @param storeFactory * @param handlerSet + * @param repositoryListenersProvider */ @Inject public XmlRepositoryManager( SCMContextProvider contextProvider, Provider securityContextProvider, - StoreFactory storeFactory, Set handlerSet) + StoreFactory storeFactory, Set handlerSet, + Provider> repositoryListenersProvider) { this.securityContextProvider = securityContextProvider; this.store = storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME); + this.repositoryListenersProvider = repositoryListenersProvider; handlerMap = new HashMap(); types = new HashSet(); @@ -288,6 +292,13 @@ public class XmlRepositoryManager extends AbstractRepositoryManager { repositoryDB = new XmlRepositoryDatabase(); } + + Set listeners = repositoryListenersProvider.get(); + + if (Util.isNotEmpty(listeners)) + { + addListeners(listeners); + } } /** @@ -764,6 +775,9 @@ public class XmlRepositoryManager extends AbstractRepositoryManager /** Field description */ private XmlRepositoryDatabase repositoryDB; + /** Field description */ + private Provider> repositoryListenersProvider; + /** Field description */ private Provider securityContextProvider; diff --git a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java index 8531dbde6b..f5d15cae62 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java @@ -54,6 +54,7 @@ import sonia.scm.user.AbstractUserManager; import sonia.scm.user.User; import sonia.scm.user.UserAllreadyExistException; import sonia.scm.user.UserException; +import sonia.scm.user.UserListener; import sonia.scm.util.AssertUtil; import sonia.scm.util.CollectionAppender; import sonia.scm.util.IOUtil; @@ -71,6 +72,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -109,13 +111,16 @@ public class XmlUserManager extends AbstractUserManager * * @param scurityContextProvider * @param storeFactory + * @param userListenerProvider */ @Inject public XmlUserManager(Provider scurityContextProvider, - StoreFactory storeFactory) + StoreFactory storeFactory, + Provider> userListenerProvider) { this.scurityContextProvider = scurityContextProvider; this.store = storeFactory.getStore(XmlUserDatabase.class, STORE_NAME); + this.userListenerProvider = userListenerProvider; } //~--- methods -------------------------------------------------------------- @@ -248,6 +253,13 @@ public class XmlUserManager extends AbstractUserManager userDB = new XmlUserDatabase(); createDefaultAccounts(); } + + Set listeners = userListenerProvider.get(); + + if (Util.isNotEmpty(listeners)) + { + addListeners(listeners); + } } /** @@ -551,4 +563,7 @@ public class XmlUserManager extends AbstractUserManager /** Field description */ private XmlUserDatabase userDB; + + /** Field description */ + private Provider> userListenerProvider; } diff --git a/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java b/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java index b273b93d5e..bdfdddf93c 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java +++ b/scm-webapp/src/main/java/sonia/scm/web/security/ChainAuthenticatonManager.java @@ -36,6 +36,7 @@ package sonia.scm.web.security; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; +import com.google.inject.Provider; import com.google.inject.Singleton; import org.slf4j.Logger; @@ -48,6 +49,7 @@ import sonia.scm.security.EncryptionHandler; import sonia.scm.user.User; import sonia.scm.util.AssertUtil; import sonia.scm.util.IOUtil; +import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ @@ -82,19 +84,24 @@ public class ChainAuthenticatonManager extends AbstractAuthenticationManager * @param authenticationHandlerSet * @param encryptionHandler * @param cacheManager + * @param authenticationListenerProvider */ @Inject public ChainAuthenticatonManager( Set authenticationHandlerSet, - EncryptionHandler encryptionHandler, CacheManager cacheManager) + EncryptionHandler encryptionHandler, CacheManager cacheManager, + Provider> authenticationListenerProvider) { AssertUtil.assertIsNotEmpty(authenticationHandlerSet); AssertUtil.assertIsNotNull(cacheManager); this.authenticationHandlerSet = authenticationHandlerSet; this.encryptionHandler = encryptionHandler; + this.authenticationListenerProvider = authenticationListenerProvider; this.cache = cacheManager.getCache(String.class, AuthenticationCacheValue.class, CACHE_NAME); + + // addListeners(authenticationListeners); } //~--- methods -------------------------------------------------------------- @@ -166,6 +173,14 @@ public class ChainAuthenticatonManager extends AbstractAuthenticationManager { authenticator.init(context); } + + Set listeners = + authenticationListenerProvider.get(); + + if (Util.isNotEmpty(listeners)) + { + addListeners(listeners); + } } /** @@ -297,6 +312,9 @@ public class ChainAuthenticatonManager extends AbstractAuthenticationManager /** Field description */ private Set authenticationHandlerSet; + /** Field description */ + private Provider> authenticationListenerProvider; + /** Field description */ private Cache cache; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java index 16ad325518..65e5f57aac 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java @@ -35,12 +35,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Provider; + import sonia.scm.Manager; import sonia.scm.repository.xml.XmlRepositoryManager; import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.StoreFactory; import sonia.scm.util.MockUtil; +import static org.mockito.Mockito.*; + //~--- JDK imports ------------------------------------------------------------ import java.util.HashSet; @@ -68,8 +72,12 @@ public class XmlRepositoryManagerTest extends RepositoryManagerTestBase factory.init(contextProvider); handlerSet.add(new DummyRepositoryHandler(factory)); + Provider> listenerProvider = mock(Provider.class); + + when(listenerProvider.get()).thenReturn(new HashSet()); + return new XmlRepositoryManager(contextProvider, MockUtil.getAdminSecurityContextProvider(), - factory, handlerSet); + factory, handlerSet, listenerProvider); } } diff --git a/scm-webapp/src/test/java/sonia/scm/user/XmlUserManagerTest.java b/scm-webapp/src/test/java/sonia/scm/user/XmlUserManagerTest.java index 9873ab947b..301bb3bd6f 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/XmlUserManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/user/XmlUserManagerTest.java @@ -35,10 +35,19 @@ package sonia.scm.user; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.util.MockUtil; +import com.google.inject.Provider; + import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.StoreFactory; import sonia.scm.user.xml.XmlUserManager; +import sonia.scm.util.MockUtil; + +import static org.mockito.Mockito.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.HashSet; +import java.util.Set; /** * @@ -60,7 +69,11 @@ public class XmlUserManagerTest extends UserManagerTestBase factory.init(contextProvider); + Provider> listenerProvider = mock(Provider.class); + + when(listenerProvider.get()).thenReturn(new HashSet()); + return new XmlUserManager(MockUtil.getAdminSecurityContextProvider(), - factory); + factory, listenerProvider); } } diff --git a/scm-webapp/src/test/java/sonia/scm/web/security/ChainAuthenticationManagerTest.java b/scm-webapp/src/test/java/sonia/scm/web/security/ChainAuthenticationManagerTest.java index d1b00e739c..0db93edd45 100644 --- a/scm-webapp/src/test/java/sonia/scm/web/security/ChainAuthenticationManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/web/security/ChainAuthenticationManagerTest.java @@ -35,6 +35,8 @@ package sonia.scm.web.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Provider; + import org.junit.Test; import sonia.scm.AbstractTestBase; @@ -48,6 +50,8 @@ import sonia.scm.util.MockUtil; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; @@ -130,8 +134,15 @@ public class ChainAuthenticationManagerTest extends AbstractTestBase trillian.setPassword("trillian123"); handlerSet.add(new SingleUserAuthenticaionHandler("trilliansType", trillian)); + + Provider> listenerProvider = + mock(Provider.class); + + when(listenerProvider.get()).thenReturn( + new HashSet()); manager = new ChainAuthenticatonManager(handlerSet, - new MessageDigestEncryptionHandler(), cacheManager); + new MessageDigestEncryptionHandler(), cacheManager, + listenerProvider); manager.init(contextProvider); request = MockUtil.getHttpServletRequest(); response = MockUtil.getHttpServletResponse(); diff --git a/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java b/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java index c77f2cb74c..e952958d72 100644 --- a/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java @@ -35,6 +35,8 @@ package sonia.scm.web.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Provider; + import org.junit.Test; import sonia.scm.AbstractTestBase; @@ -43,14 +45,20 @@ import sonia.scm.security.MessageDigestEncryptionHandler; import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.StoreFactory; import sonia.scm.user.User; +import sonia.scm.user.UserListener; import sonia.scm.user.UserTestData; import sonia.scm.user.xml.XmlUserManager; import sonia.scm.util.MockUtil; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + //~--- JDK imports ------------------------------------------------------------ +import java.util.HashSet; +import java.util.Set; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -127,9 +135,13 @@ public class XmlAuthenticationHandlerTest extends AbstractTestBase storeFactory.init(contextProvider); + Provider> listenerProvider = mock(Provider.class); + + when(listenerProvider.get()).thenReturn(new HashSet()); + XmlUserManager userManager = new XmlUserManager(MockUtil.getAdminSecurityContextProvider(), - storeFactory); + storeFactory, listenerProvider); userManager.init(contextProvider); userManager.create(slarti);