From 7848d1b1922ab165d5ce057600a05ba1ec86740b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 25 Mar 2012 13:09:05 +0200 Subject: [PATCH] added extensionpoint for ServletContextListener --- .../sonia/scm/BindingExtensionProcessor.java | 22 +++- .../java/sonia/scm/ScmContextListener.java | 7 ++ .../scm/ServletContextListenerHolder.java | 102 ++++++++++++++++++ 3 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/ServletContextListenerHolder.java diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index 54d3a86866..c3195ff97c 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -48,6 +48,8 @@ import sonia.scm.plugin.ext.Extension; import sonia.scm.plugin.ext.ExtensionProcessor; import sonia.scm.repository.ChangesetPreProcessor; import sonia.scm.repository.ChangesetPreProcessorFactory; +import sonia.scm.repository.FileObjectPreProcessor; +import sonia.scm.repository.FileObjectPreProcessorFactory; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryHook; import sonia.scm.repository.RepositoryListener; @@ -63,8 +65,8 @@ import sonia.scm.web.security.DefaultAuthenticationHandler; import java.util.HashSet; import java.util.Set; -import sonia.scm.repository.FileObjectPreProcessor; -import sonia.scm.repository.FileObjectPreProcessorFactory; + +import javax.servlet.ServletContextListener; /** * @@ -109,13 +111,13 @@ public class BindingExtensionProcessor implements ExtensionProcessor Multibinder.newSetBinder(binder, ResourceHandler.class); Multibinder repositoryHookBinder = Multibinder.newSetBinder(binder, RepositoryHook.class); - + // changeset pre processor Multibinder changesetPreProcessorBinder = Multibinder.newSetBinder(binder, ChangesetPreProcessor.class); Multibinder changesetPreProcessorFactoryBinder = Multibinder.newSetBinder(binder, ChangesetPreProcessorFactory.class); - + // fileobject pre processor Multibinder fileObjectPreProcessorBinder = Multibinder.newSetBinder(binder, FileObjectPreProcessor.class); @@ -133,6 +135,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor Multibinder.newSetBinder(binder, AuthenticationListener.class); Multibinder repositoryRequestListenerBinder = Multibinder.newSetBinder(binder, RepositoryRequestListener.class); + Multibinder servletContextListenerBinder = + Multibinder.newSetBinder(binder, ServletContextListener.class); authenticators.addBinding().to(DefaultAuthenticationHandler.class); @@ -283,6 +287,16 @@ public class BindingExtensionProcessor implements ExtensionProcessor repositoryRequestListenerBinder.addBinding().to(extensionClass); } + else if (ServletContextListener.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind ServletContextListener {}", + extensionClass.getName()); + } + + servletContextListenerBinder.addBinding().to(extensionClass); + } else { if (logger.isInfoEnabled()) diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 48368f6536..d11b667fdf 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -55,8 +55,10 @@ import sonia.scm.web.security.LocalSecurityContextHolder; import java.util.ArrayList; import java.util.List; +import java.util.Set; import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; /** * @@ -97,6 +99,8 @@ public class ScmContextListener extends GuiceServletContextListener // remove thread local store injector.getInstance(LocalSecurityContextHolder.class).destroy(); + injector.getInstance(ServletContextListenerHolder.class).contextDestroyed( + servletContextEvent); } super.contextDestroyed(servletContextEvent); @@ -115,6 +119,8 @@ public class ScmContextListener extends GuiceServletContextListener upgradeHandler.doUpgrade(); super.contextInitialized(servletContextEvent); + injector.getInstance(ServletContextListenerHolder.class).contextInitialized( + servletContextEvent); } //~--- get methods ---------------------------------------------------------- @@ -172,6 +178,7 @@ public class ScmContextListener extends GuiceServletContextListener authenticationManager.init(context); + // fetch listeners return injector; } diff --git a/scm-webapp/src/main/java/sonia/scm/ServletContextListenerHolder.java b/scm-webapp/src/main/java/sonia/scm/ServletContextListenerHolder.java new file mode 100644 index 0000000000..c009ac99c0 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/ServletContextListenerHolder.java @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Set; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/** + * + * @author Sebastian Sdorra + */ +@Singleton +public class ServletContextListenerHolder implements ServletContextListener +{ + + /** + * Constructs ... + * + * + * @param listenerSet + */ + @Inject + public ServletContextListenerHolder(Set listenerSet) + { + this.listenerSet = listenerSet; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param sce + */ + @Override + public void contextDestroyed(ServletContextEvent sce) + { + for (ServletContextListener listener : listenerSet) + { + listener.contextDestroyed(sce); + } + } + + /** + * Method description + * + * + * @param sce + */ + @Override + public void contextInitialized(ServletContextEvent sce) + { + for (ServletContextListener listener : listenerSet) + { + listener.contextInitialized(sce); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Set listenerSet; +}