Oh yeah. Tkx!

On Thu, Mar 5, 2015 at 10:33 AM, Romain Manni-Bucau <[email protected]>
wrote:

> I guess it is fixed
>
>
> Romain Manni-Bucau
> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> <http://rmannibucau.wordpress.com> | Github <
> https://github.com/rmannibucau> |
> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
> <http://www.tomitribe.com>
>
> 2015-03-05 16:28 GMT+01:00 Thiago Veronezi <[email protected]>:
>
> > Hi Romain,
> >
> > This change breaks
> >
> >
> tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java
> > with...
> >
> > java.lang.IllegalStateException: Cannot create a session after the
> response
> > has been committed
> > org.apache.catalina.connector.Request.doGetSession(Request.java:2872)
> > org.apache.catalina.connector.Request.getSession(Request.java:2232)
> >
> >
> org.apache.openejb.cdi.CdiAppContextsService.currentSessionId(CdiAppContextsService.java:153)
> >
> >
> org.apache.openejb.cdi.CdiAppContextsService.getConversationSessionId(CdiAppContextsService.java:145)
> >
> >
> org.apache.webbeans.portable.ConversationProducer.newInstance(ConversationProducer.java:54)
> > .
> > .
> > .
> >
> > []s,
> > Thiago.
> >
> >
> > On Wed, Mar 4, 2015 at 3:14 PM, <[email protected]> wrote:
> >
> > > Repository: tomee
> > > Updated Branches:
> > >   refs/heads/develop d2ee62393 -> 01a80f1ba
> > >
> > >
> > > 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/develop
> > > 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>
> > >
> > >
> >
>

Reply via email to