implementing CDI Conversation Filter
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/f8d9492a Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/f8d9492a Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/f8d9492a Branch: refs/heads/master Commit: f8d9492aa3b99c2c7fb5afbcc6c912b7d542f093 Parents: 368e3fa Author: Romain Manni-Bucau <[email protected]> Authored: Sun Mar 22 19:15:27 2015 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Sun Mar 22 19:15:27 2015 +0100 ---------------------------------------------------------------------- .../openejb/cdi/CdiAppContextsService.java | 9 ++++++++ .../server/httpd/EndWebBeansListener.java | 2 +- .../tomee/catalina/OpenEJBContextConfig.java | 21 +++++++++++++++---- .../tomee/catalina/TomcatWebAppBuilder.java | 22 +++++++++++++------- 4 files changed, 42 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/f8d9492a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java index d4a1d06..7b0f4fe 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java @@ -97,6 +97,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co } }; + private volatile boolean autoConversationCheck = true; public CdiAppContextsService(final WebBeansContext wbc) { this(wbc, wbc.getOpenWebBeansConfiguration().supportsConversation()); @@ -390,6 +391,10 @@ public class CdiAppContextsService extends AbstractContextsService implements Co } } + public boolean isAutoConversationCheck() { + return autoConversationCheck; + } + public void checkConversationState() { final ServletRequestContext rc = getRequestContext(false); if (rc != null && rc.getServletRequest() != null && conversationService != null) { @@ -742,6 +747,10 @@ public class CdiAppContextsService extends AbstractContextsService implements Co return webContext; } + public void setAutoConversationCheck(final boolean autoConversationCheck) { + this.autoConversationCheck = autoConversationCheck; + } + private boolean supportsConversation() { return conversationContext != null; } http://git-wip-us.apache.org/repos/asf/tomee/blob/f8d9492a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java index acfc7fd..65d15e1 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java @@ -72,7 +72,7 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque */ @Override public void requestInitialized(ServletRequestEvent event) { - if (contextsService != null) { + if (contextsService != null && contextsService.isAutoConversationCheck()) { contextsService.checkConversationState(); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/f8d9492a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java index 8887a63..a2df62c 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java @@ -35,6 +35,7 @@ import org.apache.openejb.assembler.classic.ResourceInfo; import org.apache.openejb.assembler.classic.ServletInfo; import org.apache.openejb.assembler.classic.WebAppBuilder; import org.apache.openejb.assembler.classic.WebAppInfo; +import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.config.NewLoaderLogic; import org.apache.openejb.config.ServiceUtils; @@ -59,6 +60,7 @@ import org.apache.tomee.common.NamingUtil; import org.apache.tomee.common.ResourceFactory; import org.apache.tomee.jasper.TomEEJasperInitializer; import org.apache.tomee.loader.TomcatHelper; +import org.apache.webbeans.config.WebBeansContext; import org.apache.xbean.finder.IAnnotationFinder; import javax.servlet.Filter; @@ -372,13 +374,13 @@ public class OpenEJBContextConfig extends ContextConfig { webXml.addFilterMapping(mapping); } - { // CDI spec forces it, TODO: use it to replace org.apache.openejb.cdi.CdiAppContextsService conversation boot logic + { final FilterDef filter = new FilterDef(); filter.setAsyncSupported("true"); filter.setDescription("CDI Conversation Filter"); filter.setDisplayName("CDI Conversation Filter"); filter.setFilterName("CDI Conversation Filter"); - filter.setFilterClass(NoopFilter.class.getName()); + filter.setFilterClass(ConversationFilter.class.getName()); webXml.addFilter(filter); } @@ -716,14 +718,25 @@ public class OpenEJBContextConfig extends ContextConfig { return false; } - public static class NoopFilter implements Filter { + public static class ConversationFilter implements Filter { + private WebBeansContext wbc; + private CdiAppContextsService contextsService; + @Override public void init(final FilterConfig filterConfig) throws ServletException { - // no-op + try { + wbc = WebBeansContext.currentInstance(); + contextsService = CdiAppContextsService.class.cast(wbc.getContextsService()); + } catch (final Exception e) { + // no-op + } } @Override public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { + if (contextsService != null) { + contextsService.checkConversationState(); + } chain.doFilter(request, response); } http://git-wip-us.apache.org/repos/asf/tomee/blob/f8d9492a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java index 3052617..d89b5f3 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java @@ -78,6 +78,7 @@ import org.apache.openejb.assembler.classic.ServletInfo; import org.apache.openejb.assembler.classic.WebAppBuilder; import org.apache.openejb.assembler.classic.WebAppInfo; import org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated; +import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.openejb.cdi.CdiBuilder; import org.apache.openejb.cdi.OpenEJBLifecycle; import org.apache.openejb.cdi.Proxys; @@ -1050,14 +1051,21 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare standardContext.setXmlValidation(Boolean.parseBoolean(SystemInstance.get().getProperty("tomee.xml.validation", "false"))); } - /** - * {@inheritDoc} - */ - // context class loader is now defined, but no classes should have been loaded - @SuppressWarnings("unchecked") @Override public void start(final StandardContext standardContext) { - // no-op + final WebContext webContext = WebContext.class.cast(standardContext.getServletContext().getAttribute("openejb.web.context")); + if (webContext == null) { + return; + } + for (final FilterMap map : standardContext.findFilterMaps()) { + if ("CDI Conversation Filter".equals(map.getFilterName()) && webContext.getWebBeansContext() != null) { + final CdiAppContextsService cdiAppContextsService = CdiAppContextsService.class.cast(webContext.getWebBeansContext().getContextsService()); + if (cdiAppContextsService != null) { + cdiAppContextsService.setAutoConversationCheck(false); + } + break; + } + } } /** @@ -1291,6 +1299,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare webContext.getInjections().addAll(injections); appContext.getWebContexts().add(webContext); cs.addWebContext(webContext); + standardContext.getServletContext().setAttribute("openejb.web.context", webContext); if (!contextInfo.appInfo.webAppAlone) { final List<BeanContext> beanContexts = assembler.initEjbs(classLoader, contextInfo.appInfo, appContext, injections, new ArrayList<BeanContext>(), webAppInfo.moduleId); @@ -1321,7 +1330,6 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare standardContext.setInstanceManager(instanceManager); instanceManagers.put(classLoader, instanceManager); standardContext.getServletContext().setAttribute(InstanceManager.class.getName(), standardContext.getInstanceManager()); - } catch (final Exception e) { logger.error("Error merging Java EE JNDI entries in to war " + standardContext.getPath() + ": Exception: " + e.getMessage(), e); if (System.getProperty(TOMEE_EAT_EXCEPTION_PROP) == null) {
