Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
WELD-1480 Make it possible to restrict CDI context activation based o…
…n request URI
  • Loading branch information
jharting committed Sep 5, 2013
1 parent a5e01fa commit 70a13e0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
10 changes: 9 additions & 1 deletion impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java
Expand Up @@ -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;
Expand Down Expand Up @@ -115,13 +114,17 @@
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;
import org.jboss.weld.util.reflection.instantiation.InstantiatorFactory;
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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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() {
Expand Down
Expand Up @@ -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
Expand All @@ -48,21 +49,25 @@ public class ConversationFilter implements Filter {

@Inject
private BeanManagerImpl manager;
private HttpContextActivationFilter contextActivationFilter;

private ConversationContextActivator conversationContextActivator;

@Override
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
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
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!
Expand Down
Expand Up @@ -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;

Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 70a13e0

Please sign in to comment.