From 70a13e0098c6924d983ef74ae2c6f371f52a7076 Mon Sep 17 00:00:00 2001 From: Jozef Hartinger Date: Thu, 5 Sep 2013 12:32:26 +0200 Subject: [PATCH] WELD-1480 Make it possible to restrict CDI context activation based on request URI --- .../java/org/jboss/weld/bootstrap/WeldStartup.java | 10 +++++++++- .../org/jboss/weld/servlet/ConversationFilter.java | 7 ++++++- .../org/jboss/weld/servlet/HttpContextLifecycle.java | 9 +++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java b/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java index ea56295899b..43c812a6cb6 100644 --- a/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java +++ b/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java @@ -27,7 +27,6 @@ import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.Interceptor; -import com.google.common.collect.ImmutableSet; import org.jboss.weld.Container; import org.jboss.weld.ContainerState; import org.jboss.weld.annotated.slim.SlimAnnotatedTypeStore; @@ -115,6 +114,8 @@ import org.jboss.weld.serialization.spi.ContextualStore; import org.jboss.weld.serialization.spi.ProxyServices; import org.jboss.weld.servlet.ServletApi; +import org.jboss.weld.servlet.spi.HttpContextActivationFilter; +import org.jboss.weld.servlet.spi.helpers.AcceptingHttpContextActivationFilter; import org.jboss.weld.transaction.spi.TransactionServices; import org.jboss.weld.util.reflection.Formats; import org.jboss.weld.util.reflection.Reflections; @@ -122,6 +123,8 @@ import org.jboss.weld.util.reflection.instantiation.LoaderInstantiatorFactory; import org.slf4j.cal10n.LocLogger; +import com.google.common.collect.ImmutableSet; + /** * Common bootstrapping functionality that is run at application startup and * detects and register beans @@ -221,6 +224,7 @@ public WeldRuntime startContainer(String contextId, Environment environment, Dep deploymentServices.add(SpecializationAndEnablementRegistry.class, registry.get(SpecializationAndEnablementRegistry.class)); deploymentServices.add(ReflectionCache.class, registry.get(ReflectionCache.class)); deploymentServices.add(GlobalEnablementBuilder.class, registry.get(GlobalEnablementBuilder.class)); + deploymentServices.add(HttpContextActivationFilter.class, registry.get(HttpContextActivationFilter.class)); this.environment = environment; this.deploymentManager = BeanManagerImpl.newRootManager(contextId, "deployment", deploymentServices); @@ -315,6 +319,10 @@ private void addImplementationServices(ServiceRegistry services) { } services.add(ContainerLifecycleEvents.class, new ContainerLifecycleEvents(preloader, services.get(AnnotationDiscovery.class))); services.add(GlobalEnablementBuilder.class, new GlobalEnablementBuilder()); + + if (!services.contains(HttpContextActivationFilter.class)) { + services.add(HttpContextActivationFilter.class, AcceptingHttpContextActivationFilter.INSTANCE); + } } public void startInitialization() { diff --git a/impl/src/main/java/org/jboss/weld/servlet/ConversationFilter.java b/impl/src/main/java/org/jboss/weld/servlet/ConversationFilter.java index 74f4c526b68..3b109071737 100644 --- a/impl/src/main/java/org/jboss/weld/servlet/ConversationFilter.java +++ b/impl/src/main/java/org/jboss/weld/servlet/ConversationFilter.java @@ -31,6 +31,7 @@ import org.jboss.weld.exceptions.IllegalStateException; import org.jboss.weld.manager.BeanManagerImpl; +import org.jboss.weld.servlet.spi.HttpContextActivationFilter; /** * Filter that handles conversation context activation if mapped by the application. Otherwise, conversation context is @@ -48,6 +49,7 @@ public class ConversationFilter implements Filter { @Inject private BeanManagerImpl manager; + private HttpContextActivationFilter contextActivationFilter; private ConversationContextActivator conversationContextActivator; @@ -55,6 +57,7 @@ public class ConversationFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { this.conversationContextActivator = new ConversationContextActivator(manager); filterConfig.getServletContext().setAttribute(CONVERSATION_FILTER_REGISTERED, Boolean.TRUE); + contextActivationFilter = manager.getServices().get(HttpContextActivationFilter.class); } @Override @@ -62,7 +65,9 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha if (request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest) request; - conversationContextActivator.startConversationContext(httpRequest); + if (contextActivationFilter.accepts(httpRequest)) { + conversationContextActivator.startConversationContext(httpRequest); + } chain.doFilter(request, response); /* * We do not deactivate the conversation context in the filer. WeldListener takes care of that! diff --git a/impl/src/main/java/org/jboss/weld/servlet/HttpContextLifecycle.java b/impl/src/main/java/org/jboss/weld/servlet/HttpContextLifecycle.java index f3e80d40806..764a2f094a2 100644 --- a/impl/src/main/java/org/jboss/weld/servlet/HttpContextLifecycle.java +++ b/impl/src/main/java/org/jboss/weld/servlet/HttpContextLifecycle.java @@ -35,6 +35,7 @@ import org.jboss.weld.literal.DestroyedLiteral; import org.jboss.weld.literal.InitializedLiteral; import org.jboss.weld.manager.BeanManagerImpl; +import org.jboss.weld.servlet.spi.HttpContextActivationFilter; import org.jboss.weld.util.reflection.Reflections; import org.slf4j.cal10n.LocLogger; @@ -62,11 +63,13 @@ public class HttpContextLifecycle implements Service { private final BeanManagerImpl beanManager; private final ConversationContextActivator conversationContextActivator; + private final HttpContextActivationFilter contextActivationFilter; public HttpContextLifecycle(BeanManagerImpl beanManager) { this.beanManager = beanManager; this.conversationContextActivator = new ConversationContextActivator(beanManager); this.conversationActivationEnabled = true; + this.contextActivationFilter = beanManager.getServices().get(HttpContextActivationFilter.class); } private HttpSessionDestructionContext getSessionDestructionContext() { @@ -138,6 +141,9 @@ public void requestInitialized(HttpServletRequest request, ServletContext ctx) { if (isIncludedRequest(request)) { return; } + if (!contextActivationFilter.accepts(request)) { + return; + } log.trace(REQUEST_INITIALIZED, request); @@ -177,6 +183,9 @@ public void requestDestroyed(HttpServletRequest request) { if (isIncludedRequest(request) || isRequestDestroyed(request)) { return; } + if (!contextActivationFilter.accepts(request)) { + return; + } log.trace(REQUEST_DESTROYED, request); try {