added Default annotation to fix ServletContext injection on eager loading singletons

This commit is contained in:
Sebastian Sdorra
2014-08-24 14:49:35 +02:00
parent 9d1480acee
commit 50b0b6b2b8
9 changed files with 92 additions and 14 deletions

View File

@@ -14,5 +14,16 @@
<artifactId>scm-annotations</artifactId> <artifactId>scm-annotations</artifactId>
<version>2.0.0-SNAPSHOT</version> <version>2.0.0-SNAPSHOT</version>
<name>scm-annotations</name> <name>scm-annotations</name>
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>${guice.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</project> </project>

View File

@@ -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 {}

View File

@@ -33,10 +33,6 @@
package sonia.scm.plugin; package sonia.scm.plugin;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.plugin.PluginAnnotation;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.lang.annotation.Documented; import java.lang.annotation.Documented;

View File

@@ -204,24 +204,23 @@ public class ScmContextListener extends GuiceServletContextListener
* *
* *
* *
* @param servletContext * @param servletCtx
* @return * @return
*/ */
private Injector getDefaultInjector(ServletContext servletContext) private Injector getDefaultInjector(ServletContext servletCtx)
{ {
DefaultPluginLoader pluginLoader = new DefaultPluginLoader(parent, plugins); DefaultPluginLoader pluginLoader = new DefaultPluginLoader(parent, plugins);
ClassOverrides overrides = ClassOverrides overrides =
ClassOverrides.findOverrides(pluginLoader.getUberClassLoader()); ClassOverrides.findOverrides(pluginLoader.getUberClassLoader());
ScmServletModule main = new ScmServletModule(pluginLoader, overrides);
List<Module> moduleList = Lists.newArrayList(); List<Module> moduleList = Lists.newArrayList();
moduleList.add(new ScmInitializerModule()); moduleList.add(new ScmInitializerModule());
moduleList.add(new ScmEventBusModule()); moduleList.add(new ScmEventBusModule());
moduleList.add(new EagerSingletonModule()); moduleList.add(new EagerSingletonModule());
moduleList.add(ShiroWebModule.guiceFilterModule()); moduleList.add(ShiroWebModule.guiceFilterModule());
moduleList.add(main); moduleList.add(new ScmServletModule(servletCtx, pluginLoader, overrides));
moduleList.add(new ScmSecurityModule(servletContext)); moduleList.add(new ScmSecurityModule(servletCtx));
moduleList.addAll(pluginLoader.getInjectionModules()); moduleList.addAll(pluginLoader.getInjectionModules());
moduleList.addAll(overrides.getModules()); moduleList.addAll(overrides.getModules());

View File

@@ -143,6 +143,8 @@ import com.sun.jersey.spi.container.servlet.ServletContainer;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletContext;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
@@ -212,11 +214,15 @@ public class ScmServletModule extends JerseyServletModule
* Constructs ... * Constructs ...
* *
* *
*
* @param servletContext
* @param pluginLoader * @param pluginLoader
* @param overrides * @param overrides
*/ */
ScmServletModule(DefaultPluginLoader pluginLoader, ClassOverrides overrides) ScmServletModule(ServletContext servletContext,
DefaultPluginLoader pluginLoader, ClassOverrides overrides)
{ {
this.servletContext = servletContext;
this.pluginLoader = pluginLoader; this.pluginLoader = pluginLoader;
this.overrides = overrides; this.overrides = overrides;
} }
@@ -244,6 +250,10 @@ public class ScmServletModule extends JerseyServletModule
RepositoryProvider.class, Repository.class).to( RepositoryProvider.class, Repository.class).to(
DefaultRepositoryProvider.class).in(RequestScoped.class); DefaultRepositoryProvider.class).in(RequestScoped.class);
// bind servlet context
bind(ServletContext.class).annotatedWith(Default.class).toInstance(
servletContext);
// bind event api // bind event api
bind(ScmEventBus.class).toInstance(ScmEventBus.getInstance()); bind(ScmEventBus.class).toInstance(ScmEventBus.getInstance());
@@ -500,4 +510,7 @@ public class ScmServletModule extends JerseyServletModule
/** Field description */ /** Field description */
private final DefaultPluginLoader pluginLoader; private final DefaultPluginLoader pluginLoader;
/** Field description */
private final ServletContext servletContext;
} }

View File

@@ -53,6 +53,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import sonia.scm.Default;
/** /**
* *
@@ -79,7 +80,7 @@ public class DefaultResourceManager extends AbstractResourceManager
* @param resourceHandlers * @param resourceHandlers
*/ */
@Inject @Inject
public DefaultResourceManager(ServletContext servletContext, public DefaultResourceManager(@Default ServletContext servletContext,
PluginLoader pluginLoader, Set<ResourceHandler> resourceHandlers) PluginLoader pluginLoader, Set<ResourceHandler> resourceHandlers)
{ {
super(servletContext, pluginLoader, resourceHandlers); super(servletContext, pluginLoader, resourceHandlers);

View File

@@ -38,6 +38,7 @@ package sonia.scm.resources;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import sonia.scm.Default;
import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginLoader;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -72,7 +73,7 @@ public class DevelopmentResourceManager extends AbstractResourceManager
* @param resourceHandlers * @param resourceHandlers
*/ */
@Inject @Inject
public DevelopmentResourceManager(ServletContext servletContext, public DevelopmentResourceManager(@Default ServletContext servletContext,
PluginLoader pluginLoader, Set<ResourceHandler> resourceHandlers) PluginLoader pluginLoader, Set<ResourceHandler> resourceHandlers)
{ {
super(servletContext, pluginLoader, resourceHandlers); super(servletContext, pluginLoader, resourceHandlers);

View File

@@ -86,7 +86,6 @@ public class ErrorServlet extends HttpServlet
* *
* *
* @param context * @param context
* @param handler
* @param templateEngineFactory * @param templateEngineFactory
*/ */
@Inject @Inject

View File

@@ -46,6 +46,7 @@ import com.google.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.Default;
import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginLoader;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -89,7 +90,7 @@ public class MustacheTemplateEngine implements TemplateEngine
* @param pluginLoader * @param pluginLoader
*/ */
@Inject @Inject
public MustacheTemplateEngine(ServletContext context, public MustacheTemplateEngine(@Default ServletContext context,
PluginLoader pluginLoader) PluginLoader pluginLoader)
{ {
factory = new ServletMustacheFactory(context, pluginLoader); factory = new ServletMustacheFactory(context, pluginLoader);