one more step for @ConversationScoped tcks
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/01a80f1b Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/01a80f1b Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/01a80f1b Branch: refs/heads/master Commit: 01a80f1baef4c9ee5b64c462d4f8fb010f1608a0 Parents: d2ee623 Author: Romain Manni-Bucau <[email protected]> Authored: Wed Mar 4 21:14:05 2015 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Wed Mar 4 21:14:05 2015 +0100 ---------------------------------------------------------------------- .../openejb/cdi/CdiAppContextsService.java | 80 ++++++-------------- .../server/httpd/EndWebBeansListener.java | 22 +++++- tck/cdi-embedded/src/test/resources/failing.xml | 2 +- 3 files changed, 42 insertions(+), 62 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/01a80f1b/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 3870dfa..166a992 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 @@ -38,6 +38,11 @@ import org.apache.webbeans.spi.ConversationService; import org.apache.webbeans.web.context.ServletRequestContext; import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler; +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.BusyConversationException; import javax.enterprise.context.ContextException; @@ -54,11 +59,6 @@ import javax.inject.Singleton; import javax.servlet.ServletRequestEvent; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; public class CdiAppContextsService extends AbstractContextsService implements ContextsService, ConversationService { public static final Object EJB_REQUEST_EVENT = new Object(); @@ -262,7 +262,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co } else if (scopeType.equals(ApplicationScoped.class)) { return getApplicationContext(); } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) { - return getConversationContext(true); + return getConversationContext(); } else if (scopeType.equals(Dependent.class)) { return dependentContext; } else if (scopeType.equals(Singleton.class)) { @@ -285,7 +285,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co initSingletonContext(); } else if (scopeType.equals(Singleton.class)) { //NOPMD // Do nothing - } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) { + } else if (supportsConversation() && scopeType.equals(ConversationScoped.class) && !isTimeout()) { initConversationContext(startParameter); } else { if (logger.isWarningEnabled()) { @@ -337,29 +337,26 @@ public class CdiAppContextsService extends AbstractContextsService implements Co //Re-initialize thread local for session final HttpSession session = request.getSession(false); - String cid = null; + final String cid = request.getParameter("cid"); if (session != null) { initSessionContext(session); - - final ServletRequestContext rc = getRequestContext(false); - if (rc != null && rc.getServletRequest() != null && conversationService != null && !isConversationSkipped(rc)) { - cid = rc.getServletRequest().getParameter("cid"); + if (conversationService != null && !isConversationSkipped(request)) { if (cid != null) { final ConversationManager conversationManager = webBeansContext.getConversationManager(); final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId()); if (c != null) { - conversationContext.set(conversationManager.getConversationContext(c)); + final ConversationContext context = conversationManager.getConversationContext(c); + context.setActive(true); + conversationContext.set(context); + return; } } } - } else { - cid = getConversationId(); } - if (cid == null && conversationContext.get() == null) { + + if (cid == null && !isTimeout()) { // transient but active - final ConversationContext context = new ConversationContext(); - context.setActive(true); - conversationContext.set(context); + initConversationContext(request); } } } else if (event == EJB_REQUEST_EVENT) { @@ -428,7 +425,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co return; } - final ConversationContext cc = getConversationContext(false); + final ConversationContext cc = getConversationContext(); if (cc == null) { return; } @@ -557,9 +554,8 @@ public class CdiAppContextsService extends AbstractContextsService implements Co final HttpServletRequest req = HttpServletRequest.class.isInstance(request) ? HttpServletRequest.class.cast(request) : null; ConversationContext context = ConversationContext.class.isInstance(request) ? ConversationContext.class.cast(request) : null; - final ThreadContext tc = ThreadContext.getThreadContext(); Object event = null; - if (context == null && (tc == null || tc.getCurrentOperation() != Operation.TIMEOUT)) { + if (context == null) { final ConversationContext existingContext = conversationContext.get(); if (existingContext == null) { context = new ConversationContext(); @@ -593,8 +589,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co return; } - final ConversationContext context = getConversationContext(false); - + final ConversationContext context = getConversationContext(); if (context != null) { context.destroy(); final ServletRequestContext servletRequestContext = getRequestContext(false); @@ -610,7 +605,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co } - private ServletRequestContext getRequestContext(final boolean create) { + public ServletRequestContext getRequestContext(final boolean create) { ServletRequestContext context = requestContext.get(); if (context == null && create) { initRequestContext(null); @@ -655,40 +650,11 @@ public class CdiAppContextsService extends AbstractContextsService implements Co * * @return conversation context */ - private ConversationContext getConversationContext(final boolean createIfPropagated) { - ConversationContext context = conversationContext.get(); - if (context == null && createIfPropagated && !isTimeout()) { - final ServletRequestContext rc = getRequestContext(true); // needs to exist for Conversation scope - if (rc != null && rc.getServletRequest() != null && !isConversationSkipped(rc)) { - final HttpServletRequest servletRequest = rc.getServletRequest(); - final HttpSession session = servletRequest.getSession(false); - if (session != null) { - final String cid = rc.getServletRequest().getParameter("cid"); - if (cid != null) { - final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final ConversationImpl conversation = conversationManager.getPropogatedConversation(cid, session.getId()); - if (conversation != null) { - final ConversationContext ctx = conversationManager.getConversationContext(conversation); - if (ctx != null) { - conversationContext.set(ctx); - ctx.setActive(true); - return ctx; - } - } - } - // else create a new one, we ensure we have a session before doing it cause in several cases - stateless - we don't want to create a new one if not - return initConversationContext(servletRequest); - } - } - } - if (context != null && !context.isActive() && createIfPropagated) { - context.setActive(true); - } - return context; + private ConversationContext getConversationContext() { + return conversationContext.get(); } - private boolean isConversationSkipped(final ServletRequestContext rc) { - final HttpServletRequest servletRequest = rc.getServletRequest(); + private boolean isConversationSkipped(final HttpServletRequest servletRequest) { return "none".equals(servletRequest.getParameter("conversationPropagation")) || "true".equals(servletRequest.getParameter("nocid")); } http://git-wip-us.apache.org/repos/asf/tomee/blob/01a80f1b/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 e1a7968..af340ac 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 @@ -154,7 +154,7 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque * {@inheritDoc} */ @Override - public void sessionDestroyed(HttpSessionEvent event) { + public void sessionDestroyed(final HttpSessionEvent event) { if (webBeansContext == null) { return; } @@ -171,16 +171,30 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque WebappWebBeansContext.class.cast(webBeansContext).getParent().getContextsService().endContext(SessionScoped.class, event.getSession()); } + final CdiAppContextsService appContextsService = CdiAppContextsService.class.cast(webBeansContext.getContextsService()); + if (appContextsService.getRequestContext(false) != null) { + appContextsService.pushRequestReleasable(new Runnable() { + @Override + public void run() { + doDestroyConversations(event.getSession().getId()); + } + }); + } else { + doDestroyConversations(event.getSession().getId()); + } + + destroyFakedRequest(); + } + + private void doDestroyConversations(final String id) { final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final Map<Conversation, ConversationContext> cc = conversationManager.getAndRemoveConversationMapWithSessionId(event.getSession().getId()); + final Map<Conversation, ConversationContext> cc = conversationManager.getAndRemoveConversationMapWithSessionId(id); for (final Map.Entry<Conversation, ConversationContext> c : cc.entrySet()) { if (c != null) { c.getValue().destroy(); webBeansContext.getBeanManagerImpl().fireEvent(c.getKey().getId(), CdiAppContextsService.DestroyedLiteral.CONVERSATION); } } - - destroyFakedRequest(); } private void destroyFakedRequest() { http://git-wip-us.apache.org/repos/asf/tomee/blob/01a80f1b/tck/cdi-embedded/src/test/resources/failing.xml ---------------------------------------------------------------------- diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml index 81a4955..613b81e 100644 --- a/tck/cdi-embedded/src/test/resources/failing.xml +++ b/tck/cdi-embedded/src/test/resources/failing.xml @@ -31,7 +31,7 @@ -Dopenejb.embedded.try-jsp=true --> <classes> - <class name="org.jboss.cdi.tck.tests.deployment.initialization.ApplicationInitializationLifecycleTest" /> + <class name="org.jboss.cdi.tck.tests.context.conversation.servlet.ServletConversationTest" /> </classes> </test> </suite>
