From 50b0b6b2b8394ba222553406742d3876c2fcce71 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 24 Aug 2014 14:49:35 +0200 Subject: [PATCH] added Default annotation to fix ServletContext injection on eager loading singletons --- scm-annotations/pom.xml | 11 ++++ .../src/main/java/sonia/scm/Default.java | 57 +++++++++++++++++++ .../main/java/sonia/scm/plugin/Extension.java | 4 -- .../java/sonia/scm/ScmContextListener.java | 9 ++- .../main/java/sonia/scm/ScmServletModule.java | 15 ++++- .../scm/resources/DefaultResourceManager.java | 3 +- .../resources/DevelopmentResourceManager.java | 3 +- .../java/sonia/scm/template/ErrorServlet.java | 1 - .../scm/template/MustacheTemplateEngine.java | 3 +- 9 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 scm-annotations/src/main/java/sonia/scm/Default.java diff --git a/scm-annotations/pom.xml b/scm-annotations/pom.xml index 7d64cf3544..43f281069c 100644 --- a/scm-annotations/pom.xml +++ b/scm-annotations/pom.xml @@ -14,5 +14,16 @@ scm-annotations 2.0.0-SNAPSHOT scm-annotations + + + + + com.google.inject + guice + ${guice.version} + true + + + diff --git a/scm-annotations/src/main/java/sonia/scm/Default.java b/scm-annotations/src/main/java/sonia/scm/Default.java new file mode 100644 index 0000000000..3364344735 --- /dev/null +++ b/scm-annotations/src/main/java/sonia/scm/Default.java @@ -0,0 +1,57 @@ +/** + * 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.BindingAnnotation; + +//~--- JDK imports ------------------------------------------------------------ + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The default annotation can be used to inject the default implementation of + * service. The annotation is mainly used to inject the ServletContext. + * + * @author Sebastian Sdorra + * @since 2.0.0 + */ +@Documented +@BindingAnnotation +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface Default {} diff --git a/scm-annotations/src/main/java/sonia/scm/plugin/Extension.java b/scm-annotations/src/main/java/sonia/scm/plugin/Extension.java index c25b901975..ce3bd24406 100644 --- a/scm-annotations/src/main/java/sonia/scm/plugin/Extension.java +++ b/scm-annotations/src/main/java/sonia/scm/plugin/Extension.java @@ -33,10 +33,6 @@ package sonia.scm.plugin; -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.plugin.PluginAnnotation; - //~--- JDK imports ------------------------------------------------------------ import java.lang.annotation.Documented; diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 66e0590d6d..829ddcb6e7 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -204,24 +204,23 @@ public class ScmContextListener extends GuiceServletContextListener * * * - * @param servletContext + * @param servletCtx * @return */ - private Injector getDefaultInjector(ServletContext servletContext) + private Injector getDefaultInjector(ServletContext servletCtx) { DefaultPluginLoader pluginLoader = new DefaultPluginLoader(parent, plugins); ClassOverrides overrides = ClassOverrides.findOverrides(pluginLoader.getUberClassLoader()); - ScmServletModule main = new ScmServletModule(pluginLoader, overrides); List moduleList = Lists.newArrayList(); moduleList.add(new ScmInitializerModule()); moduleList.add(new ScmEventBusModule()); moduleList.add(new EagerSingletonModule()); moduleList.add(ShiroWebModule.guiceFilterModule()); - moduleList.add(main); - moduleList.add(new ScmSecurityModule(servletContext)); + moduleList.add(new ScmServletModule(servletCtx, pluginLoader, overrides)); + moduleList.add(new ScmSecurityModule(servletCtx)); moduleList.addAll(pluginLoader.getInjectionModules()); moduleList.addAll(overrides.getModules()); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index c0cb5a3a2e..780f1202e9 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -143,6 +143,8 @@ import com.sun.jersey.spi.container.servlet.ServletContainer; import java.util.Map; +import javax.servlet.ServletContext; + /** * * @author Sebastian Sdorra @@ -212,11 +214,15 @@ public class ScmServletModule extends JerseyServletModule * Constructs ... * * + * + * @param servletContext * @param pluginLoader * @param overrides */ - ScmServletModule(DefaultPluginLoader pluginLoader, ClassOverrides overrides) + ScmServletModule(ServletContext servletContext, + DefaultPluginLoader pluginLoader, ClassOverrides overrides) { + this.servletContext = servletContext; this.pluginLoader = pluginLoader; this.overrides = overrides; } @@ -244,6 +250,10 @@ public class ScmServletModule extends JerseyServletModule RepositoryProvider.class, Repository.class).to( DefaultRepositoryProvider.class).in(RequestScoped.class); + // bind servlet context + bind(ServletContext.class).annotatedWith(Default.class).toInstance( + servletContext); + // bind event api bind(ScmEventBus.class).toInstance(ScmEventBus.getInstance()); @@ -500,4 +510,7 @@ public class ScmServletModule extends JerseyServletModule /** Field description */ private final DefaultPluginLoader pluginLoader; + + /** Field description */ + private final ServletContext servletContext; } diff --git a/scm-webapp/src/main/java/sonia/scm/resources/DefaultResourceManager.java b/scm-webapp/src/main/java/sonia/scm/resources/DefaultResourceManager.java index 4e5c99c98d..0570addf07 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/DefaultResourceManager.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/DefaultResourceManager.java @@ -53,6 +53,7 @@ import java.util.Map; import java.util.Set; import javax.servlet.ServletContext; +import sonia.scm.Default; /** * @@ -79,7 +80,7 @@ public class DefaultResourceManager extends AbstractResourceManager * @param resourceHandlers */ @Inject - public DefaultResourceManager(ServletContext servletContext, + public DefaultResourceManager(@Default ServletContext servletContext, PluginLoader pluginLoader, Set resourceHandlers) { super(servletContext, pluginLoader, resourceHandlers); diff --git a/scm-webapp/src/main/java/sonia/scm/resources/DevelopmentResourceManager.java b/scm-webapp/src/main/java/sonia/scm/resources/DevelopmentResourceManager.java index 114295626d..c4382204d5 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/DevelopmentResourceManager.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/DevelopmentResourceManager.java @@ -38,6 +38,7 @@ package sonia.scm.resources; import com.google.inject.Inject; import com.google.inject.Singleton; +import sonia.scm.Default; import sonia.scm.plugin.PluginLoader; //~--- JDK imports ------------------------------------------------------------ @@ -72,7 +73,7 @@ public class DevelopmentResourceManager extends AbstractResourceManager * @param resourceHandlers */ @Inject - public DevelopmentResourceManager(ServletContext servletContext, + public DevelopmentResourceManager(@Default ServletContext servletContext, PluginLoader pluginLoader, Set resourceHandlers) { super(servletContext, pluginLoader, resourceHandlers); diff --git a/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java b/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java index 7cfd6342ab..8604324769 100644 --- a/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/template/ErrorServlet.java @@ -86,7 +86,6 @@ public class ErrorServlet extends HttpServlet * * * @param context - * @param handler * @param templateEngineFactory */ @Inject diff --git a/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java b/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java index 5aa36b124d..ccef19a4bb 100644 --- a/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java +++ b/scm-webapp/src/main/java/sonia/scm/template/MustacheTemplateEngine.java @@ -46,6 +46,7 @@ import com.google.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.Default; import sonia.scm.plugin.PluginLoader; //~--- JDK imports ------------------------------------------------------------ @@ -89,7 +90,7 @@ public class MustacheTemplateEngine implements TemplateEngine * @param pluginLoader */ @Inject - public MustacheTemplateEngine(ServletContext context, + public MustacheTemplateEngine(@Default ServletContext context, PluginLoader pluginLoader) { factory = new ServletMustacheFactory(context, pluginLoader);