From a8f216f178276969ad288e72195de3f93a8003c8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 2 Jan 2011 14:33:26 +0100 Subject: [PATCH] improve listener support --- .../main/java/sonia/scm/ListenerSupport.java | 14 ++++ .../sonia/scm/group/AbstractGroupManager.java | 13 +++ .../java/sonia/scm/group/GroupListener.java | 2 + .../repository/AbstractRepositoryHandler.java | 13 +++ .../repository/AbstractRepositoryManager.java | 20 ++++- .../AbstractRepositoryManagerDecorator.java | 18 +++- .../scm/repository/RepositoryListener.java | 6 ++ .../sonia/scm/user/AbstractUserManager.java | 13 +++ .../java/sonia/scm/user/UserListener.java | 2 + .../sonia/scm/BindingExtensionProcessor.java | 83 ++++++++++++++++++- .../java/sonia/scm/ScmContextListener.java | 16 +++- 11 files changed, 193 insertions(+), 7 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/ListenerSupport.java b/scm-core/src/main/java/sonia/scm/ListenerSupport.java index 4699978f67..4d3dc83879 100644 --- a/scm-core/src/main/java/sonia/scm/ListenerSupport.java +++ b/scm-core/src/main/java/sonia/scm/ListenerSupport.java @@ -29,8 +29,14 @@ * */ + + package sonia.scm; +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Collection; + /** * * @author Sebastian Sdorra @@ -48,6 +54,14 @@ public interface ListenerSupport */ public void addListener(T listener); + /** + * Method description + * + * + * @param listeners + */ + public void addListeners(Collection listeners); + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/group/AbstractGroupManager.java b/scm-core/src/main/java/sonia/scm/group/AbstractGroupManager.java index 719b5026af..8982271d7c 100644 --- a/scm-core/src/main/java/sonia/scm/group/AbstractGroupManager.java +++ b/scm-core/src/main/java/sonia/scm/group/AbstractGroupManager.java @@ -39,6 +39,7 @@ import sonia.scm.HandlerEvent; //~--- JDK imports ------------------------------------------------------------ +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -61,6 +62,18 @@ public abstract class AbstractGroupManager implements GroupManager listenerSet.add(listener); } + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + listenerSet.addAll(listeners); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/group/GroupListener.java b/scm-core/src/main/java/sonia/scm/group/GroupListener.java index 8f392e91eb..d09ac6fc21 100644 --- a/scm-core/src/main/java/sonia/scm/group/GroupListener.java +++ b/scm-core/src/main/java/sonia/scm/group/GroupListener.java @@ -36,11 +36,13 @@ package sonia.scm.group; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.HandlerEvent; +import sonia.scm.plugin.ExtensionPoint; /** * * @author Sebastian Sdorra */ +@ExtensionPoint public interface GroupListener { diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java index 940384e05c..931fbcc39d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java @@ -48,6 +48,7 @@ import sonia.scm.store.StoreFactory; import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -102,6 +103,18 @@ public abstract class AbstractRepositoryHandler listeners) + { + listenerSet.addAll(listeners); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManager.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManager.java index 8acf53824a..3d5166a291 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManager.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManager.java @@ -29,11 +29,17 @@ * */ + + package sonia.scm.repository; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.HandlerEvent; + //~--- JDK imports ------------------------------------------------------------ -import sonia.scm.HandlerEvent; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -56,6 +62,18 @@ public abstract class AbstractRepositoryManager implements RepositoryManager listenerSet.add(listener); } + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + listenerSet.addAll(listeners); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManagerDecorator.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManagerDecorator.java index 2108579813..342e8c0c2f 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryManagerDecorator.java @@ -29,18 +29,20 @@ * */ + + package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.SCMContextProvider; +import sonia.scm.Type; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; import java.util.Collection; -import sonia.scm.Type; /** * @@ -61,6 +63,8 @@ public abstract class AbstractRepositoryManagerDecorator this.orginal = orginal; } + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -73,6 +77,18 @@ public abstract class AbstractRepositoryManagerDecorator orginal.addListener(listener); } + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + orginal.addListeners(listeners); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java index 157d45919a..c2b43138e3 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java @@ -29,14 +29,20 @@ * */ + + package sonia.scm.repository; +//~--- non-JDK imports -------------------------------------------------------- + import sonia.scm.HandlerEvent; +import sonia.scm.plugin.ExtensionPoint; /** * * @author Sebastian Sdorra */ +@ExtensionPoint public interface RepositoryListener { diff --git a/scm-core/src/main/java/sonia/scm/user/AbstractUserManager.java b/scm-core/src/main/java/sonia/scm/user/AbstractUserManager.java index d3ca9163fd..f1c8752b5c 100644 --- a/scm-core/src/main/java/sonia/scm/user/AbstractUserManager.java +++ b/scm-core/src/main/java/sonia/scm/user/AbstractUserManager.java @@ -39,6 +39,7 @@ import sonia.scm.HandlerEvent; //~--- JDK imports ------------------------------------------------------------ +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -61,6 +62,18 @@ public abstract class AbstractUserManager implements UserManager listenerSet.add(listener); } + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + listenerSet.addAll(listeners); + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/user/UserListener.java b/scm-core/src/main/java/sonia/scm/user/UserListener.java index 7a9ba08f33..7731dd585a 100644 --- a/scm-core/src/main/java/sonia/scm/user/UserListener.java +++ b/scm-core/src/main/java/sonia/scm/user/UserListener.java @@ -36,11 +36,13 @@ package sonia.scm.user; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.HandlerEvent; +import sonia.scm.plugin.ExtensionPoint; /** * * @author Sebastian Sdorra */ +@ExtensionPoint public interface UserListener { diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index 1f26f683ed..174565abbc 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -42,10 +42,13 @@ import com.google.inject.multibindings.Multibinder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.group.GroupListener; import sonia.scm.plugin.ext.Extension; import sonia.scm.plugin.ext.ExtensionProcessor; import sonia.scm.repository.RepositoryHandler; +import sonia.scm.repository.RepositoryListener; import sonia.scm.security.EncryptionHandler; +import sonia.scm.user.UserListener; import sonia.scm.web.security.AuthenticationHandler; import sonia.scm.web.security.XmlAuthenticationHandler; @@ -125,6 +128,40 @@ public class BindingExtensionProcessor implements ExtensionProcessor binder.bind(extensionClass); authenticators.addBinding().to(extensionClass); } + else if (GroupListener.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind GroupListener {}", extensionClass.getName()); + } + + GroupListener listener = (GroupListener) extensionClass.newInstance(); + + groupListeners.add(listener); + } + else if (UserListener.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind UserListener {}", extensionClass.getName()); + } + + UserListener listener = (UserListener) extensionClass.newInstance(); + + userListeners.add(listener); + } + else if (RepositoryListener.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind RepositoryListener {}", extensionClass.getName()); + } + + RepositoryListener listener = + (RepositoryListener) extensionClass.newInstance(); + + repositoryListeners.add(listener); + } else { if (logger.isInfoEnabled()) @@ -169,6 +206,17 @@ public class BindingExtensionProcessor implements ExtensionProcessor //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + public Set getGroupListeners() + { + return groupListeners; + } + /** * Method description * @@ -180,6 +228,28 @@ public class BindingExtensionProcessor implements ExtensionProcessor return moduleSet; } + /** + * Method description + * + * + * @return + */ + public Set getRepositoryListeners() + { + return repositoryListeners; + } + + /** + * Method description + * + * + * @return + */ + public Set getUserListeners() + { + return userListeners; + } + //~--- methods -------------------------------------------------------------- /** @@ -219,8 +289,7 @@ public class BindingExtensionProcessor implements ExtensionProcessor { if (logger.isDebugEnabled()) { - logger.debug("bind Authenticator {}", type.getName(), - bindingType.getName()); + logger.debug("bind {} of type {}", type.getName(), bindingType.getName()); } binder.bind(type).to(bindingType); @@ -233,4 +302,14 @@ public class BindingExtensionProcessor implements ExtensionProcessor /** Field description */ private Set moduleSet; + + /** Field description */ + private Set repositoryListeners = + 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 ee60f80d77..a31dc4c244 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -125,13 +125,23 @@ public class ScmContextListener extends GuiceServletContextListener injector.getInstance(StoreFactory.class).init(context); // init RepositoryManager - injector.getInstance(RepositoryManager.class).init(context); + RepositoryManager repositoryManager = + injector.getInstance(RepositoryManager.class); + + repositoryManager.addListeners(bindExtProcessor.getRepositoryListeners()); + repositoryManager.init(context); // init UserManager - injector.getInstance(UserManager.class).init(context); + UserManager userManager = injector.getInstance(UserManager.class); + + userManager.addListeners(bindExtProcessor.getUserListeners()); + userManager.init(context); // init GroupManager - injector.getInstance(GroupManager.class).init(context); + GroupManager groupManager = injector.getInstance(GroupManager.class); + + groupManager.addListeners(bindExtProcessor.getGroupListeners()); + groupManager.init(context); // init Authenticator injector.getInstance(AuthenticationManager.class).init(context);