You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by st...@apache.org on 2015/05/05 07:50:22 UTC

[02/16] tomee git commit: TOMEE-1572 adopt OWB-1.5 changes

TOMEE-1572 adopt OWB-1.5 changes

* improved ConversationHandling
* improved SessionHandling


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e41c460f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e41c460f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e41c460f

Branch: refs/heads/fb_tomee2_owb16
Commit: e41c460fb6410f54f153f54272c8bce7dfea39f2
Parents: d376ef5
Author: Mark Struberg <st...@apache.org>
Authored: Sat May 2 11:44:53 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sat May 2 11:44:53 2015 +0200

----------------------------------------------------------------------
 .../openejb/cdi/CdiAppContextsService.java      | 760 +------------------
 .../java/org/apache/openejb/cdi/CdiPlugin.java  |  14 +-
 .../apache/openejb/cdi/OpenEJBLifecycle.java    |  68 +-
 .../openejb/cdi/ThreadSingletonServiceImpl.java |   4 -
 .../cdi/UpdatableSessionContextManager.java     |  66 --
 .../openejb/testing/ApplicationComposers.java   |   2 +-
 .../openejb/cdi/CdiAppContextsServiceTest.java  |   4 +-
 ...StatefulConversationScopedTOMEE1138Test.java |   4 +-
 .../server/httpd/BeginWebBeansListener.java     |  35 -
 .../server/httpd/EndWebBeansListener.java       |  10 -
 .../server/httpd/HttpListenerRegistry.java      |   8 +-
 .../openejb/server/httpd/HttpRequestImpl.java   |   3 +
 .../server/httpd/WebBeansListenerHelper.java    |   3 +
 .../tomee/catalina/OpenEJBContextConfig.java    |  45 --
 .../tomee/catalina/TomEEContainerListener.java  |  13 +-
 .../tomee/catalina/TomcatWebAppBuilder.java     |   8 +-
 .../cdi/SessionContextBackedByHttpSession.java  | 289 -------
 .../cdi/SessionNormalScopeBeanHandler.java      | 117 ---
 18 files changed, 74 insertions(+), 1379 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 655af39..780728e 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
@@ -18,82 +18,26 @@
 
 package org.apache.openejb.cdi;
 
-import org.apache.openejb.core.Operation;
-import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
-import org.apache.webbeans.annotation.InitializedLiteral;
-import org.apache.webbeans.config.OWBLogConst;
 import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.AbstractContextsService;
-import org.apache.webbeans.context.ApplicationContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.context.DependentContext;
+import org.apache.webbeans.context.RequestContext;
 import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.context.SingletonContext;
-import org.apache.webbeans.conversation.ConversationImpl;
-import org.apache.webbeans.conversation.ConversationManager;
-import org.apache.webbeans.el.ELContextStore;
-import org.apache.webbeans.event.EventMetadataImpl;
 import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.ConversationService;
-import org.apache.webbeans.web.context.ServletRequestContext;
-import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler;
+import org.apache.webbeans.web.context.WebContextsService;
 
-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;
-import javax.enterprise.context.Conversation;
-import javax.enterprise.context.ConversationScoped;
-import javax.enterprise.context.Dependent;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
 import javax.inject.Singleton;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletRequestEvent;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-public class CdiAppContextsService extends AbstractContextsService implements ContextsService, ConversationService {
+
+public class CdiAppContextsService extends WebContextsService implements ContextsService {
     public static final Object EJB_REQUEST_EVENT = new Object();
 
     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class);
 
-    private static final String CID = "cid";
-
-    private final ThreadLocal<ServletRequestContext> requestContext = new ThreadLocal<>();
-
-    private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<>();
-    private final UpdatableSessionContextManager sessionCtxManager = new UpdatableSessionContextManager();
-
-    /**
-     * Conversation context manager
-     */
-    private final ThreadLocal<ConversationContext> conversationContext;
-
-    private final DependentContext dependentContext = new DependentContext();
-
-    private final ApplicationContext applicationContext = new ApplicationContext();
-
-    private final SingletonContext singletonContext = new SingletonContext();
-
-    private final WebBeansContext webBeansContext;
-
-    private final ConversationService conversationService;
-
-    private volatile Object appEvent;
-
-    private final boolean useGetParameter;
-
     private static final ThreadLocal<Collection<Runnable>> endRequestRunnables = new ThreadLocal<Collection<Runnable>>() {
         @Override
         protected Collection<Runnable> initialValue() {
@@ -101,37 +45,13 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
         }
     };
 
-    private volatile boolean autoConversationCheck = true;
 
     public CdiAppContextsService(final WebBeansContext wbc) {
-        this(wbc, wbc.getOpenWebBeansConfiguration().supportsConversation());
+        super(wbc);
     }
 
-    public CdiAppContextsService(final WebBeansContext wbc, final boolean supportsConversation) {
-        if (wbc != null) {
-            webBeansContext = wbc;
-        } else {
-            webBeansContext = WebBeansContext.currentInstance();
-        }
-
-        dependentContext.setActive(true);
-        if (supportsConversation) {
-            conversationService = webBeansContext.getService(ConversationService.class);
-            if (conversationService == null) {
-                conversationContext = null;
-            } else {
-                conversationContext = new ThreadLocal<>();
-            }
-        } else {
-            conversationService = null;
-            conversationContext = null;
-        }
-        applicationContext.setActive(true);
-        singletonContext.setActive(true);
-        useGetParameter = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cdi.conversation.http.use-get-parameter", "false"));
-    }
 
-    private void endRequest() {
+    private void runEndRequestTasks() {
         for (final Runnable r : endRequestRunnables.get()) {
             try {
                 r.run();
@@ -146,30 +66,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
         endRequestRunnables.get().add(runnable);
     }
 
-    @Override
-    public String getConversationId() {
-        return getHttpParameter(CID);
-    }
-
-    @Override
-    public String getConversationSessionId() {
-        return currentSessionId(false);
-    }
-
-    public String currentSessionId(final boolean force) {
-        final ServletRequestContext rc = requestContext.get();
-        if (rc != null) {
-            final HttpServletRequest req = rc.getServletRequest();
-            if (req != null) {
-                final HttpSession session = req.getSession(force);
-                if (session != null) {
-                    return session.getId();
-                }
-            }
-        }
-        return null;
-    }
-
     @Override // this method is called after the deployment (BeansDeployer) but need beans to be here to get events
     public void init(final Object initializeObject) {
         //Start application context
@@ -179,651 +75,17 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
         startContext(Singleton.class, initializeObject);
     }
 
-    public void beforeStop(final Object ignored) {
-        {   // trigger @PreDestroy mainly but keep it active until destroy(xxx)
-            applicationContext.destroy();
-            webBeansContext.getBeanManagerImpl().fireEvent(
-                    appEvent,
-                    new EventMetadataImpl(null, ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class,null, new Annotation[] { DestroyedLiteral.INSTANCE_APPLICATION_SCOPED }, webBeansContext),
-                    false);
-            applicationContext.setActive(true);
-
-            singletonContext.destroy();
-            singletonContext.setActive(true);
-        }
-
-        for (final Map.Entry<Conversation, ConversationContext> conversation : webBeansContext.getConversationManager().getAllConversationContexts().entrySet()) {
-            conversation.getValue().destroy();
-            final String id = conversation.getKey().getId();
-            if (id != null) {
-                webBeansContext.getBeanManagerImpl().fireEvent(id, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
-            }
-        }
-        for (final SessionContext sc : sessionCtxManager.getContextById().values()) {
-            final Object event = HttpSessionContextSessionAware.class.isInstance(sc) ? HttpSessionContextSessionAware.class.cast(sc).getSession() : sc;
-            if (HttpSession.class.isInstance(event)) {
-                final HttpSession httpSession = HttpSession.class.cast(event);
-                if (httpSession.getId() == null) {
-                    continue;
-                }
-                initSessionContext(httpSession);
-                try {
-                    httpSession.invalidate();
-                } catch (final IllegalStateException ise) {
-                    // no-op
-                } finally {
-                    destroySessionContext(httpSession);
-                }
-            } else {
-                sc.destroy();
-            }
-            webBeansContext.getBeanManagerImpl().fireEvent(event, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
-        }
-        sessionCtxManager.getContextById().clear();
-    }
-
     public void destroy(final Object destroyObject) {
-        //Destroy application context
-        endContext(ApplicationScoped.class, destroyObject);
-
-        //Destroy singleton context
-        endContext(Singleton.class, destroyObject);
-
+        super.destroy(destroyObject);
         removeThreadLocals();
     }
 
-    public void removeThreadLocals() {
-        //Remove thread locals
-        //for preventing memory leaks
-        requestContext.set(null);
-        requestContext.remove();
-        sessionContext.set(null);
-        sessionContext.remove();
-
-        if (null != conversationContext) {
-            conversationContext.set(null);
-            conversationContext.remove();
-        }
-    }
-
-    @Override
-    public void endContext(final Class<? extends Annotation> scopeType, final Object endParameters) {
-        if (supportsContext(scopeType)) {
-            if (scopeType.equals(RequestScoped.class)) {
-                destroyRequestContext(endParameters);
-            } else if (scopeType.equals(SessionScoped.class)) {
-                destroySessionContext((HttpSession) endParameters);
-            } else if (scopeType.equals(ApplicationScoped.class)) {
-                destroyApplicationContext();
-            } else if (scopeType.equals(Dependent.class)) { //NOPMD
-                // Do nothing
-            } else if (scopeType.equals(Singleton.class)) {
-                destroySingletonContext();
-            } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
-                destroyConversationContext(endParameters);
-            } else {
-                if (logger.isWarningEnabled()) {
-                    logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
-                        + scopeType.getSimpleName()
-                        + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
-                }
-            }
-        }
-
-    }
-
-    @Override
-    public Context getCurrentContext(final Class<? extends Annotation> scopeType) {
-        if (scopeType.equals(RequestScoped.class)) {
-            return getRequestContext(true);
-        } else if (scopeType.equals(SessionScoped.class)) {
-            return getSessionContext(true);
-        } else if (scopeType.equals(ApplicationScoped.class)) {
-            return getApplicationContext();
-        } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
-            return getConversationContext();
-        } else if (scopeType.equals(Dependent.class)) {
-            return dependentContext;
-        } else if (scopeType.equals(Singleton.class)) {
-            return getSingletonContext();
-        }
-
-        return null;
-    }
 
     @Override
-    public void startContext(final Class<? extends Annotation> scopeType, final Object startParameter) throws ContextException {
-        if (supportsContext(scopeType)) {
-            if (scopeType.equals(RequestScoped.class)) {
-                initRequestContext(startParameter);
-            } else if (scopeType.equals(SessionScoped.class)) {
-                initSessionContext((HttpSession) startParameter);
-            } else if (scopeType.equals(ApplicationScoped.class)) {
-                initApplicationContext(startParameter);
-            } else if (scopeType.equals(Dependent.class)) {
-                initSingletonContext();
-            } else if (scopeType.equals(Singleton.class)) { //NOPMD
-                // Do nothing
-            } else if (supportsConversation() && scopeType.equals(ConversationScoped.class) && !isTimeout()) {
-                initConversationContext(startParameter);
-            } else {
-                if (logger.isWarningEnabled()) {
-                    logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
-                        + scopeType.getSimpleName()
-                        + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
-                }
-            }
-        }
-    }
-
-    private void initSingletonContext() {
-        singletonContext.setActive(true);
-    }
-
-    private void initApplicationContext(final Object init) { // in case contexts are stop/start
-        if (appEvent == null) { // no need of sync cause of the lifecycle
-            Object event = init;
-            if (StartupObject.class.isInstance(init)) {
-                final StartupObject so = StartupObject.class.cast(init);
-                if (so.isFromWebApp()) { // ear webapps
-                    event = so.getWebContext().getServletContext();
-                } else if (so.getAppInfo().webAppAlone) {
-                    event = SystemInstance.get().getComponent(ServletContext.class);
-                }
-            } else if (ServletContextEvent.class.isInstance(init)) {
-                event = ServletContextEvent.class.cast(init).getServletContext();
-            }
-            appEvent = event != null ? event : applicationContext;
-            webBeansContext.getBeanManagerImpl().fireEvent(
-                    appEvent,
-                    new EventMetadataImpl(null,
-                            ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[] { InitializedLiteral.INSTANCE_APPLICATION_SCOPED },
-                            webBeansContext),
-                    false);
-        }
-    }
-
-    @Override
-    public boolean supportsContext(final Class<? extends Annotation> scopeType) {
-        return scopeType.equals(RequestScoped.class)
-            || scopeType.equals(SessionScoped.class)
-            || scopeType.equals(ApplicationScoped.class)
-            || scopeType.equals(Dependent.class)
-            || scopeType.equals(Singleton.class)
-            || scopeType.equals(ConversationScoped.class) && supportsConversation();
-
-    }
-
-    private void initRequestContext(final Object event) {
-        final ServletRequestContext rq = new ServletRequestContext();
-        rq.setActive(true);
-
-        requestContext.set(rq);// set thread local
-        if (event != null && ServletRequestEvent.class.isInstance(event)) {
-            final HttpServletRequest request = (HttpServletRequest) ServletRequestEvent.class.cast(event).getServletRequest();
-            rq.setServletRequest(request);
-
-            if (request != null) {
-                webBeansContext.getBeanManagerImpl().fireEvent(request, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
-            }
-
-            if (request != null) {
-                //Re-initialize thread local for session
-                final HttpSession session = request.getSession(false);
-
-                final String cid = conversationService != null ? (!useGetParameter ? getCid(request) : request.getParameter(CID)) : null;
-                if (session != null) {
-                    initSessionContext(session);
-                    if (autoConversationCheck && conversationService != null && !isConversationSkipped(request)) {
-                        if (cid != null) {
-                            final ConversationManager conversationManager = webBeansContext.getConversationManager();
-                            final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
-                            if (c != null) {
-                                final ConversationContext context = conversationManager.getConversationContext(c);
-                                context.setActive(true);
-                                conversationContext.set(context);
-                                return;
-                            }
-                        }
-                    }
-                }
-
-                if (cid == null && !isTimeout() && autoConversationCheck) {
-                    // transient but active
-                    initConversationContext(request);
-                }
-            }
-        } else if (event == EJB_REQUEST_EVENT) {
-            webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
-        }
-    }
-
-    public static String getCid(final HttpServletRequest req) {
-        return getFromQuery(CID, req.getQueryString());
-    }
-
-    public static String getFromQuery(final String name, final String q) {
-        final int cid = q == null ? -1 : q.indexOf(name + "=");
-        if (cid < 0) {
-            return null;
-        }
-        int end = q.indexOf("&", cid);
-        final int end2 = q.indexOf("#", cid);
-        if (end2 > 0 && end2 < end) {
-            end = end2;
-        }
-        if (end < 0) {
-            end = q.length();
-        }
-        return q.substring(cid + name.length() + 1, end);
-    }
-
-    public boolean isAutoConversationCheck() {
-        return autoConversationCheck;
-    }
-
-    public void checkConversationState() {
-        final ServletRequestContext rc  = getRequestContext(false);
-        if (rc != null && rc.getServletRequest() != null && conversationService != null) {
-            final HttpSession session = rc.getServletRequest().getSession(false);
-            if (session != null) {
-                final String cid = useGetParameter ? rc.getServletRequest().getParameter(CID) : getFromQuery(CID, rc.getServletRequest().getQueryString());
-                if (cid != null) {
-                    final ConversationManager conversationManager = webBeansContext.getConversationManager();
-                    final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
-                    if (!autoConversationCheck) { // lazy association
-                        initConversationContext(rc.getServletRequest());
-                    }
-                    if (c != null) {
-                        if (c.isTransient()) {
-                            throw new IllegalStateException("Conversation " + cid + " missing");
-                        }
-                        if (c.iUseIt() > 1) {
-                            throw new BusyConversationException("busy conversation " + c.getId() + '(' + c.getSessionId() + ')');
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void destroyRequestContext(final Object end) {
-        // execute request tasks
-        endRequest();
-
-        //Get context
-        final ServletRequestContext context = getRequestContext(false);
-
-        //Destroy context
-        if (context != null) {
-            if (supportsConversation()) { // OWB-595
-                cleanupConversation();
-            }
-
-            final HttpServletRequest servletRequest = context.getServletRequest();
-            if (servletRequest != null) {
-                webBeansContext.getBeanManagerImpl().fireEvent(servletRequest, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
-            } else if (end == EJB_REQUEST_EVENT) {
-                webBeansContext.getBeanManagerImpl().fireEvent(end, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
-            }
-            context.destroy();
-        }
-
-        // clean up the EL caches after each request
-        final ELContextStore elStore = ELContextStore.getInstance(false);
-        if (elStore != null) {
-            elStore.destroyELContextStore();
-        }
-
-        //Clear thread locals - only for request to let user do with deltaspike start(session, request)restart(request)...stop()
-        requestContext.remove();
-
-        RequestScopedBeanInterceptorHandler.removeThreadLocals();
-    }
-
-    private void cleanupConversation() {
-        if (conversationService == null) {
-            return;
-        }
-
-        final ConversationContext cc = getConversationContext();
-        if (cc == null) {
-            return;
-        }
-        cc.setActive(false);
-
-        final ConversationManager conversationManager = webBeansContext.getConversationManager();
-        final Conversation conversation = conversationManager.getConversationBeanReference();
-        if (conversation == null) {
-            return;
-        }
-
-        final ConversationImpl conversationImpl = ConversationImpl.class.cast(conversation);
-        conversationImpl.iDontUseItAnymore(); // do it before next call to avoid busy exception if possible
-        try {
-            if (conversation.isTransient()) {
-                endContext(ConversationScoped.class, null);
-                conversationManager.removeConversation(conversation); // in case end() was called
-            } else {
-                conversationImpl.updateTimeOut();
-            }
-        } catch (final BusyConversationException bce) {
-            // no-op, TODO: do something, maybe add internalIsTransient() to avoid to fail here
-        }
-    }
-
-    /**
-     * Creates the session context at the session start.
-     *
-     * @param session http session object
-     */
-    private void initSessionContext(final HttpSession session) {
-        if (session == null) {
-            // no session -> no SessionContext
-            return;
-        }
-
-        final String sessionId = session.getId();
-        //Current context
-        SessionContext currentSessionContext = sessionId == null ? null : sessionCtxManager.getSessionContextWithSessionId(sessionId);
-
-        //No current context
-        boolean fire = false;
-        if (currentSessionContext == null) {
-            currentSessionContext = newSessionContext(session);
-            sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext);
-            fire = true;
-        }
-        //Activate
-        currentSessionContext.setActive(true);
-
-        //Set thread local
-        sessionContext.set(currentSessionContext);
-
-        if (fire) {
-            webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
-        }
-    }
-
-    private SessionContext newSessionContext(final HttpSession session) {
-        final String classname = SystemInstance.get().getComponent(ThreadSingletonService.class).sessionContextClass();
-        if (classname != null) {
-            try {
-                final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(classname);
-                try {
-                    final Constructor<?> constr = clazz.getConstructor(HttpSession.class);
-                    return (SessionContext) constr.newInstance(session);
-                } catch (final Exception e) {
-                    return (SessionContext) clazz.newInstance();
-                }
-
-            } catch (final Exception e) {
-                logger.error("Can't instantiate " + classname + ", using default session context", e);
-            }
-        }
-        return new HttpSessionContextSessionAware(session);
-    }
-
-    /**
-     * Destroys the session context and all of its components at the end of the
-     * session.
-     *
-     * @param session http session object
-     */
-    private void destroySessionContext(final HttpSession session) {
-        if (session != null) {
-            final SessionContext context = sessionContext.get();
-
-            if (context != null && context.isActive()) {
-                final ServletRequestContext servletRequestContext = getRequestContext(false);
-                if (servletRequestContext == null || servletRequestContext.getServletRequest() == null) {
-                    doDestroySession(context, session);
-                } else {
-                    pushRequestReleasable(new Runnable() { // call it at the end of the request
-                        @Override
-                        public void run() {
-                            doDestroySession(context, session);
-                        }
-                    });
-                }
-            }
-
-            //Clear thread locals
-            sessionContext.set(null);
-            sessionContext.remove();
-
-            //Remove session from manager
-            sessionCtxManager.removeSessionContextWithSessionId(session.getId());
-        }
-    }
-
-    private void doDestroySession(SessionContext context, HttpSession session) {
-        context.destroy();
-        webBeansContext.getBeanManagerImpl().fireEvent(session, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
-    }
-
-    //we don't have initApplicationContext
-
-    private void destroyApplicationContext() {
-        applicationContext.destroy();
-    }
-
-    private void destroySingletonContext() {
-        singletonContext.destroy();
-    }
-
-    private ConversationContext initConversationContext(final Object request) {
-        if (conversationService == null) {
-            return null;
-        }
-
-        final HttpServletRequest req = HttpServletRequest.class.isInstance(request) ? HttpServletRequest.class.cast(request) : null;
-        ConversationContext context = ConversationContext.class.isInstance(request) ? ConversationContext.class.cast(request) : null;
-        Object event = null;
-        if (context == null) {
-            final ConversationContext existingContext = conversationContext.get();
-            if (existingContext == null) {
-                context = new ConversationContext();
-                context.setActive(true);
-
-                if (req != null) {
-                    event = req;
-                } else {
-                    final ServletRequestContext servletRequestContext = getRequestContext(true);
-                    event = servletRequestContext != null && servletRequestContext.getServletRequest() != null ? servletRequestContext.getServletRequest() : context;
-                }
-            } else {
-                context = existingContext;
-            }
-        }
-        conversationContext.set(context);
-        context.setActive(true);
-        if (event != null) {
-            webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_CONVERSATION_SCOPED);
-        }
-        return context;
-    }
-
-    /**
-     * Destroy conversation context.
-     */
-    private void destroyConversationContext(final Object destroy) {
-        if (conversationService == null) {
-            return;
-        }
-
-        final ConversationContext context = getConversationContext();
-        if (context != null) {
-            context.destroy();
-            final ServletRequestContext servletRequestContext = getRequestContext(false);
-            final Object destroyObject = servletRequestContext != null && servletRequestContext.getServletRequest() != null ?
-                    servletRequestContext.getServletRequest() : destroy;
-            webBeansContext.getBeanManagerImpl().fireEvent(
-                    destroyObject == null ? context : destroyObject, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
-        }
-
-        if (null != context) {
-            conversationContext.remove();
-        }
-    }
+    protected void destroyRequestContext(Object requestEvent) {
+        // execute endrequest tasks
+        runEndRequestTasks();
 
-
-    public ServletRequestContext getRequestContext(final boolean create) {
-        ServletRequestContext context = requestContext.get();
-        if (context == null && create) {
-            initRequestContext(null);
-            return requestContext.get();
-        }
-        return context;
-    }
-
-    private Context getSessionContext(final boolean create) {
-        SessionContext context = sessionContext.get();
-        if ((context == null || !context.isActive()) && create) {
-            lazyStartSessionContext();
-            context = sessionContext.get();
-            if (context == null) {
-                context = new SessionContext();
-                context.setActive(true);
-                sessionContext.set(context);
-            }
-        }
-        return context;
-    }
-
-    /**
-     * Gets application context.
-     *
-     * @return application context
-     */
-    private ApplicationContext getApplicationContext() {
-        return applicationContext;
-    }
-
-    /**
-     * Gets singleton context.
-     *
-     * @return singleton context
-     */
-    private SingletonContext getSingletonContext() {
-        return singletonContext;
-    }
-
-    /**
-     * Get current conversation ctx.
-     *
-     * @return conversation context
-     */
-    private ConversationContext getConversationContext() {
-        return conversationContext.get();
-    }
-
-    private boolean isConversationSkipped(final HttpServletRequest servletRequest) {
-        final String queryString = servletRequest.getQueryString();
-        return "none".equals(getFromQuery("conversationPropagation", queryString)) || "true".equals(getFromQuery("nocid", queryString));
-    }
-
-    private boolean isTimeout() {
-        final ThreadContext tc = ThreadContext.getThreadContext();
-        return tc != null && tc.getCurrentOperation() == Operation.TIMEOUT;
-    }
-
-    private Context lazyStartSessionContext() {
-
-        if (logger.isDebugEnabled()) {
-            logger.debug(">lazyStartSessionContext");
-        }
-
-        final Context webContext = null;
-        final Context context = getCurrentContext(RequestScoped.class);
-        if (context instanceof ServletRequestContext) {
-            final ServletRequestContext requestContext = (ServletRequestContext) context;
-            final HttpServletRequest servletRequest = requestContext.getServletRequest();
-            if (null != servletRequest) { // this could be null if there is no active request context
-                try {
-                    final HttpSession currentSession = servletRequest.getSession();
-                    initSessionContext(currentSession);
-
-                    /*
-                    final FailOverService failoverService = webBeansContext.getService(FailOverService.class);
-                    if (failoverService != null && failoverService.isSupportFailOver()) {
-                        failoverService.sessionIsInUse(currentSession);
-                    }
-                    */
-
-                    if (logger.isDebugEnabled()) {
-                        logger.debug("Lazy SESSION context initialization SUCCESS");
-                    }
-                } catch (final Exception e) {
-                    logger.error(OWBLogConst.ERROR_0013, e);
-                }
-
-            } else {
-                logger.warning("Could NOT lazily initialize session context because NO active request context");
-            }
-        } else {
-            logger.warning("Could NOT lazily initialize session context because of " + context + " RequestContext");
-        }
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("<lazyStartSessionContext " + webContext);
-        }
-        return webContext;
-    }
-
-    public void setAutoConversationCheck(final boolean autoConversationCheck) {
-        this.autoConversationCheck = autoConversationCheck;
-    }
-
-    private boolean supportsConversation() {
-        return conversationContext != null;
-    }
-
-    public void updateSessionIdMapping(final String oldId, final String newId) {
-        sessionCtxManager.updateSessionIdMapping(oldId, newId);
-    }
-
-    public State saveState() {
-        return new State(requestContext.get(), sessionContext.get(), conversationContext.get());
-    }
-
-    public State restoreState(final State state) {
-        final State old = saveState();
-        requestContext.set(state.request);
-        sessionContext.set(state.session);
-        conversationContext.set(state.conversation);
-        return old;
-    }
-
-    public String getHttpParameter(final String name) {
-        final ServletRequestContext req = getRequestContext(false);
-        if (req != null && req.getServletRequest() != null) {
-            return useGetParameter ? req.getServletRequest().getParameter(name) : getFromQuery(name, req.getServletRequest().getQueryString());
-        }
-        return null;
-    }
-
-    public static class State {
-        private final ServletRequestContext request;
-        private final SessionContext session;
-        private final ConversationContext conversation;
-
-        public State(final ServletRequestContext request, final SessionContext session, final ConversationContext conversation) {
-            this.request = request;
-            this.session = session;
-            this.conversation = conversation;
-        }
-    }
-
-    public static class HttpSessionContextSessionAware extends SessionContext {
-        private final HttpSession session;
-
-        public HttpSessionContextSessionAware(final HttpSession session) {
-            this.session = session;
-        }
-
-        public HttpSession getSession() {
-            return session;
-        }
+        super.destroyRequestContext(requestEvent);
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
index 8dab787..429f7ac 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
@@ -41,14 +41,12 @@ import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
 import org.apache.webbeans.portable.events.generics.GProcessSessionBean;
 import org.apache.webbeans.proxy.NormalScopeProxyFactory;
-import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.ResourceInjectionService;
 import org.apache.webbeans.spi.SecurityService;
 import org.apache.webbeans.spi.TransactionService;
 import org.apache.webbeans.spi.plugins.AbstractOwbPlugin;
 import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
 import org.apache.webbeans.spi.plugins.OpenWebBeansJavaEEPlugin;
-import org.apache.webbeans.spi.plugins.OpenWebBeansWebPlugin;
 import org.apache.webbeans.util.GenericsUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 
@@ -94,12 +92,11 @@ import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 
-public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin, OpenWebBeansWebPlugin {
+public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin {
 
     private Map<Class<?>, BeanContext> beans;
 
     private WebBeansContext webBeansContext;
-    private CdiAppContextsService contexsServices;
     private ClassLoader classLoader;
 
     private Map<Contextual<?>, Object> cacheProxies;
@@ -113,10 +110,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
         }
     }
 
-    @Override
-    public String currentSessionId() {
-        return CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)).currentSessionId(true);
-    }
 
     @Override
     public boolean isEEComponent(final Class<?> impl) {
@@ -157,9 +150,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
         }
     }
 
-    public CdiAppContextsService getContexsServices() {
-        return contexsServices;
-    }
 
     public void stop() throws OpenEJBException {
         final ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
@@ -171,7 +161,7 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
             webBeansContext.getBeanManagerImpl().fireEvent(new BeforeShutdownImpl());
 
             // Destroys context
-            this.contexsServices.destroy(null);
+            webBeansContext.getContextsService().destroy(null);
 
             // Free all plugin resources
             webBeansContext.getPluginLoader().shutDown();

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
index 5747c50..4a05de7 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
@@ -29,10 +29,10 @@ import org.apache.webbeans.component.BuiltInOwbBean;
 import org.apache.webbeans.component.SimpleProducerFactory;
 import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.BeansDeployer;
-import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.config.WebBeansFinder;
 import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.intercept.InterceptorResolutionService;
 import org.apache.webbeans.portable.AbstractProducer;
 import org.apache.webbeans.portable.InjectionTargetImpl;
@@ -48,10 +48,15 @@ import org.apache.webbeans.util.WebBeansConstants;
 import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.el.ELResolver;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.ConversationScoped;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Provider;
+import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletRequest;
@@ -71,7 +76,6 @@ import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @version $Rev:$ $Date:$
@@ -288,12 +292,22 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
                 WebappBeanManager.class.cast(beanManager).beforeStop();
             }
 
-            if (CdiAppContextsService.class.isInstance(contextsService)) {
-                CdiAppContextsService.class.cast(contextsService).beforeStop(endObject);
+            webBeansContext.getContextsService().endContext(RequestScoped.class, endObject);
+            webBeansContext.getContextsService().endContext(ConversationScoped.class, endObject);
+            webBeansContext.getContextsService().endContext(SessionScoped.class, endObject);
+            webBeansContext.getContextsService().endContext(ApplicationScoped.class, endObject);
+            webBeansContext.getContextsService().endContext(Singleton.class, endObject);
+
+            // clean up the EL caches after each request
+            ELContextStore elStore = ELContextStore.getInstance(false);
+            if (elStore != null)
+            {
+                elStore.destroyELContextStore();
             }
+
             this.beanManager.fireEvent(new BeforeShutdownImpl(), true);
 
-            // Destroys context before BeforeShutdown event
+            // this will now even destroy the ExtensionBeans and other internal stuff
             this.contextsService.destroy(endObject);
 
             //Unbind BeanManager
@@ -374,8 +388,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
     }
 
     public static ScheduledExecutorService initializeServletContext(final ServletContext servletContext, final WebBeansContext context) {
-        final String strDelay = context.getOpenWebBeansConfiguration().getProperty(OpenWebBeansConfiguration.CONVERSATION_PERIODIC_DELAY, "150000");
-        final long delay = Long.parseLong(strDelay);
 
         final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() {
             @Override
@@ -385,7 +397,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
                 return t;
             }
         });
-        executorService.scheduleWithFixedDelay(new ConversationCleaner(context), delay, delay, TimeUnit.MILLISECONDS);
 
         final ELAdaptor elAdaptor = context.getService(ELAdaptor.class);
         final ELResolver resolver = elAdaptor.getOwbELResolver();
@@ -393,13 +404,7 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
         if (context.getOpenWebBeansConfiguration().isJspApplication()) {
             logger.debug("Application is configured as JSP. Adding EL Resolver.");
 
-            final JspFactory factory = JspFactory.getDefaultFactory();
-            if (factory != null) {
-                final JspApplicationContext applicationCtx = factory.getJspApplicationContext(servletContext);
-                applicationCtx.addELResolver(resolver);
-            } else {
-                logger.debug("Default JspFactory instance was not found");
-            }
+            setJspELFactory(servletContext, resolver);
         }
 
         // Add BeanManager to the 'javax.enterprise.inject.spi.BeanManager' servlet context attribute
@@ -409,22 +414,37 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
     }
 
     /**
-     * Conversation cleaner thread, that
-     * clears unused conversations.
+     * On Tomcat we need to sometimes force a class load to get our hands on the JspFactory
      */
-    private static final class ConversationCleaner implements Runnable {
-        private final WebBeansContext webBeansContext;
+    private static void setJspELFactory(ServletContext startupObject, ELResolver resolver)
+    {
+        JspFactory factory = JspFactory.getDefaultFactory();
+        if (factory == null)
+        {
+            try
+            {
+                Class.forName("org.apache.jasper.compiler.JspRuntimeContext");
+                factory = JspFactory.getDefaultFactory();
+            }
+            catch (Exception e)
+            {
+                // ignore
+            }
 
-        private ConversationCleaner(final WebBeansContext webBeansContext) {
-            this.webBeansContext = webBeansContext;
         }
 
-        public void run() {
-            webBeansContext.getConversationManager().destroyWithRespectToTimout();
-
+        if (factory != null)
+        {
+            JspApplicationContext applicationCtx = factory.getJspApplicationContext(startupObject);
+            applicationCtx.addELResolver(resolver);
+        }
+        else
+        {
+            logger.warning("Default JSPFactroy instance has not found. Skipping OWB JSP handling");
         }
     }
 
+
     /**
      * Returns servlet context otherwise throws exception.
      *

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index ed48b9e..fef83b3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -121,10 +121,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
             properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped", defaultNormalScopeHandlerClass);
         }
 
-        if (sessionContextClass() != null && tomee) {
-            properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.SessionScoped", "org.apache.tomee.catalina.cdi.SessionNormalScopeBeanHandler");
-        }
-
         if (SystemInstance.get().getOptions().get(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, false)) {
             properties.setProperty(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, "true");
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
deleted file mode 100644
index fe97ef1..0000000
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.openejb.cdi;
-
-import org.apache.openejb.OpenEJBRuntimeException;
-import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.web.context.SessionContextManager;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-
-public class UpdatableSessionContextManager extends SessionContextManager {
-    private static final Field scField;
-
-    static {
-        try {
-            scField = SessionContextManager.class.getDeclaredField("sessionContexts");
-            scField.setAccessible(true);
-        } catch (final NoSuchFieldException e) {
-            throw new OpenEJBRuntimeException("sessionContexts attribute of SessionContextManager not found, you probably use a not compatible version of OWB");
-        }
-    }
-
-    private final Map<String, SessionContext> contextById;
-
-    public UpdatableSessionContextManager() {
-        try {
-            contextById = (Map<String, SessionContext>) scField.get(this);
-        } catch (final IllegalAccessException e) {
-            throw new OpenEJBRuntimeException("can't get session contexts", e);
-        }
-    }
-
-    public Map<String, SessionContext> getContextById() {
-        return contextById;
-    }
-
-    public void updateSessionIdMapping(final String oldId, final String newId) {
-        if (oldId == null) {
-            return;
-        }
-
-        final SessionContext sc = getSessionContextWithSessionId(oldId);
-        if (sc == null) {
-            return;
-        }
-
-        addNewSessionContext(newId, sc);
-        contextById.remove(oldId);
-    }
-}

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
index 9616622..49d4468 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
@@ -1027,9 +1027,9 @@ public class ApplicationComposers {
     public void stopApplication() throws NamingException {
         if (appContext != null) {
             final ContextsService contextsService = appContext.getWebBeansContext().getContextsService();
+            // No need to stop the ConversationContext manually as it gets stored inside the SessionContext as Bean
             contextsService.endContext(SessionScoped.class, session);
             contextsService.endContext(RequestScoped.class, null);
-            contextsService.endContext(ConversationScoped.class, null);
         }
 
         if (appInfo != null) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
index 41ba092..08f6b05 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
@@ -18,12 +18,11 @@ package org.apache.openejb.cdi;
 
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 
 public class CdiAppContextsServiceTest {
     @Test
     public void cid() {
+/*X TODO refactor this over to any cId test in OWB
         assertNull(CdiAppContextsService.getFromQuery("cid", null));
         assertNull(CdiAppContextsService.getFromQuery("cid", ""));
         assertNull(CdiAppContextsService.getFromQuery("cid", "superparam=cejdzl&cfdlcjlzdbc=czlbcjb&cdlzcs&cdlcjkd"));
@@ -32,5 +31,6 @@ public class CdiAppContextsServiceTest {
         assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10"));
         assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
         assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
+*/
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
index c9a4476..c005681 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
@@ -75,8 +75,8 @@ public class StatefulConversationScopedTOMEE1138Test {
             }
 
             @Override
-            public String getConversationSessionId() {
-                return "session-test";
+            public String generateConversationId() {
+                return "cid_1";
             }
         });
         webBeansContext.getService(ContextsService.class).startContext(ConversationScoped.class, null);

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
index 36e83aa..acd4208 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
@@ -22,18 +22,13 @@ import org.apache.openejb.cdi.ThreadSingletonServiceImpl;
 import org.apache.openejb.cdi.WebappWebBeansContext;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
 import org.apache.webbeans.config.OWBLogConst;
 import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.conversation.ConversationManager;
 import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.FailOverService;
 import org.apache.webbeans.util.WebBeansUtil;
 
-import java.util.Map;
-import javax.enterprise.context.Conversation;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.SessionScoped;
 import javax.servlet.ServletContextEvent;
@@ -188,26 +183,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
             logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId());
         }
 
-        // ensure session ThreadLocal is set
-        webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession());
-
-        if (WebappWebBeansContext.class.isInstance(webBeansContext)) { // end after child
-            WebappWebBeansContext.class.cast(webBeansContext).getParent().getContextsService().endContext(SessionScoped.class, event.getSession());
-        }
-
-        final CdiAppContextsService appContextsService = CdiAppContextsService.class.cast(webBeansContext.getContextsService());
-        if (appContextsService.getRequestContext(false) != null) {
-            final String id = event.getSession().getId(); // capture it eagerly!
-            appContextsService.pushRequestReleasable(new Runnable() {
-                @Override
-                public void run() {
-                    doDestroyConversations(id);
-                }
-            });
-        } else {
-            doDestroyConversations(event.getSession().getId());
-        }
-
         webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession());
 
         WebBeansListenerHelper.destroyFakedRequest(this);
@@ -240,14 +215,4 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
         WebBeansListenerHelper.destroyFakedRequest(this);
     }
 
-    private void doDestroyConversations(final String id) {
-        final ConversationManager conversationManager = webBeansContext.getConversationManager();
-        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(), DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 65d15e1..de5841f 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
@@ -19,7 +19,6 @@ package org.apache.openejb.server.httpd;
 import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.FailOverService;
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -36,8 +35,6 @@ import javax.servlet.http.HttpSessionListener;
  */
 public class EndWebBeansListener implements ServletContextListener, ServletRequestListener, HttpSessionListener, HttpSessionActivationListener {
 
-    protected FailOverService failoverService;
-
     /**
      * Manages the container lifecycle
      */
@@ -52,7 +49,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
     public EndWebBeansListener(WebBeansContext webBeansContext) {
         this.webBeansContext = webBeansContext;
         if (webBeansContext != null) {
-            this.failoverService = this.webBeansContext.getService(FailOverService.class);
             this.contextsService = CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class));
         } else {
             this.contextsService = null;
@@ -72,9 +68,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
      */
     @Override
     public void requestInitialized(ServletRequestEvent event) {
-        if (contextsService != null && contextsService.isAutoConversationCheck()) {
-            contextsService.checkConversationState();
-        }
     }
 
     /**
@@ -99,9 +92,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
             return;
         }
 
-        if (failoverService != null && failoverService.isSupportPassivation()) {
-            failoverService.sessionWillPassivate(event.getSession());
-        }
         WebBeansListenerHelper.destroyFakedRequest(this);
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
index 7cbaa0b..ae80d63 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
@@ -35,7 +35,6 @@ import javax.servlet.http.HttpSessionEvent;
 import javax.servlet.http.HttpSessionListener;
 import org.apache.openejb.AppContext;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
-import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.openejb.cdi.Proxys;
 import org.apache.openejb.core.ParentClassLoaderFinder;
 import org.apache.openejb.core.WebContext;
@@ -43,8 +42,7 @@ import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.AppFinder;
 import org.apache.openejb.web.LightweightWebAppBuilder;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
 
 /**
  * @version $Revision$ $Date$
@@ -184,10 +182,6 @@ public class HttpListenerRegistry implements HttpListener {
             for (final Map.Entry<String, HttpListener> entry : listeners.entrySet()) {
                 final String pattern = entry.getKey();
                 if (path.matches(pattern) || path.equals(pattern)) {
-                    final WebBeansContext wbc = WebBeansContext.class.cast(request.getAttribute("openejb_owb_context"));
-                    if (wbc != null) {
-                        CdiAppContextsService.class.cast(wbc.getService(ContextsService.class)).checkConversationState();
-                    }
                     if (pattern.contains("/.*\\.") && HttpRequestImpl.class.isInstance(request)) { // TODO: enhance it, basically servlet *.xxx
                         HttpRequestImpl.class.cast(request).noPathInfo();
                     }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index 3751ef0..6006178 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -104,6 +104,9 @@ public class HttpRequestImpl implements HttpRequest {
             return;
         }
         es.shutdownNow();
+        for (RequestSession requestSession : SESSIONS.values()) {
+            requestSession.session.invalidate();
+        }
         SESSIONS.clear();
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
index db0578c..979e676 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
@@ -22,6 +22,9 @@ import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.spi.Context;
 import javax.servlet.ServletRequestListener;
 
+/**
+ * @deprecated this features is imo highly questionable. We should rather fix the root of the issue
+ */
 public final class WebBeansListenerHelper {
     private static final ThreadLocal<Boolean> FAKE_REQUEST = new ThreadLocal<Boolean>();
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 d7bdbe6..753b021 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,7 +35,6 @@ 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;
@@ -60,16 +59,9 @@ 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;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
 import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServlet;
 import javax.ws.rs.core.Application;
 import java.io.ByteArrayInputStream;
@@ -373,16 +365,6 @@ public class OpenEJBContextConfig extends ContextConfig {
             webXml.addFilterMapping(mapping);
         }
 
-        {
-            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(ConversationFilter.class.getName());
-            webXml.addFilter(filter);
-        }
-
         return webXml;
     }
 
@@ -717,31 +699,4 @@ public class OpenEJBContextConfig extends ContextConfig {
         return false;
     }
 
-    public static class ConversationFilter implements Filter {
-        private WebBeansContext wbc;
-        private CdiAppContextsService contextsService;
-
-        @Override
-        public void init(final FilterConfig filterConfig) throws ServletException {
-            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);
-        }
-
-        @Override
-        public void destroy() {
-            // no-op
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
index 048efa1..f842923 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
@@ -18,11 +18,8 @@ package org.apache.tomee.catalina;
 
 import org.apache.catalina.ContainerEvent;
 import org.apache.catalina.ContainerListener;
-import org.apache.catalina.Context;
 import org.apache.catalina.core.StandardContext;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
 
 public class TomEEContainerListener implements ContainerListener {
     private static final ThreadLocal<StandardContext> context = new ThreadLocal<StandardContext>();
@@ -33,14 +30,6 @@ public class TomEEContainerListener implements ContainerListener {
             context.set((StandardContext) event.getContainer());
         } else if ("afterContextInitialized".equals(event.getType())) {
             context.remove();
-        } else if (Context.CHANGE_SESSION_ID_EVENT.endsWith(event.getType())) {
-            final String[] ids = (String[]) event.getData();
-
-            final WebBeansContext wbc = WebBeansContext.currentInstance();
-            final ContextsService cs = wbc.getContextsService();
-            if (CdiAppContextsService.class.isInstance(cs) && ids.length > 0) {
-                ((CdiAppContextsService) cs).updateSessionIdMapping(ids[0], ids[1]);
-            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 1f9c81a..24a31e0 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,7 +78,6 @@ 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;
@@ -128,6 +127,7 @@ import org.apache.tomee.common.NamingUtil;
 import org.apache.tomee.common.UserTransactionFactory;
 import org.apache.tomee.loader.TomcatHelper;
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.adaptor.ELAdaptor;
 import org.omg.CORBA.ORB;
 
@@ -1071,9 +1071,9 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
         }
         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);
+                ContextsService contextsService = webContext.getWebBeansContext().getContextsService();
+                if (contextsService != null) {
+                    contextsService.setSupportConversations(false);
                 }
                 break;
             }

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
deleted file mode 100644
index 585a011..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.catalina.session.StandardSession;
-import org.apache.catalina.session.StandardSessionFacade;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.reflection.Reflections;
-import org.apache.webbeans.context.creational.BeanInstanceBag;
-import org.apache.webbeans.util.WebBeansUtil;
-
-import javax.enterprise.context.spi.Contextual;
-import javax.servlet.http.HttpSession;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-public class SessionContextBackedByHttpSession extends CdiAppContextsService.HttpSessionContextSessionAware {
-    private static final String WRAPPER = SystemInstance.get().getProperty("tomee.session-context.wrapper", "direct");
-
-    public SessionContextBackedByHttpSession(final HttpSession session) {
-        super(session);
-        setComponentSessionInstanceMap(); // override default map (set in super())
-    }
-
-    @SuppressWarnings("unchecked")
-    public void setComponentSessionInstanceMap() {
-        HttpSession session = getSession();
-        if (session == null) {
-            super.setComponentInstanceMap();
-            return;
-        }
-
-        if (session instanceof StandardSessionFacade) {
-            try {
-                session = (HttpSession) Reflections.get(session, "session");
-            } catch (final Exception e) {
-                // no-op
-            }
-        }
-
-        if (StandardSession.class.equals(session.getClass())) { // local session, use fastest wrapper
-            try {
-                final ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes");
-                if (WRAPPER.equals("direct")) {
-                    componentInstanceMap = new DirectSessionMap(map);
-                } else  {
-                    componentInstanceMap = new HttpSessionMap(session);
-                }
-            } catch (final Exception e) {
-                componentInstanceMap = new HttpSessionMap(session);
-            }
-        } else {
-            componentInstanceMap = new HttpSessionMap(session);
-        }
-    }
-
-    public static String key(final Object key) {
-        if (key instanceof String) { // avoid nested calls
-            return (String) key;
-        }
-
-        final String id = WebBeansUtil.getPassivationId((Contextual<?>) key);
-        if (id != null) {
-            return id;
-        }
-        return key.toString(); // shouldn't occur
-    }
-
-    private static class DirectSessionMap implements ConcurrentMap<Contextual<?>, BeanInstanceBag<?>> {
-        private final ConcurrentHashMap<String, Object> delegate;
-
-        public DirectSessionMap(final ConcurrentHashMap<String, Object> map) {
-            delegate = map;
-        }
-
-        @Override
-        public int size() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean containsValue(final Object value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public Set<Contextual<?>> keySet() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public Collection<BeanInstanceBag<?>> values() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
-            return Collections.emptySet();
-        }
-
-        @Override
-        public boolean containsKey(final Object key) {
-            return delegate.containsKey(key(key));
-        }
-
-        @Override
-        public BeanInstanceBag<?> get(final Object key) {
-            return (BeanInstanceBag<?>) delegate.get(key(key));
-        }
-
-        @Override
-        public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            return (BeanInstanceBag<?>) delegate.put(key(key), value);
-        }
-
-        @Override
-        public BeanInstanceBag<?> remove(final Object key) {
-            return (BeanInstanceBag<?>) delegate.remove(key(key));
-        }
-
-        @Override
-        public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
-            for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) {
-                put(e.getKey(), e.getValue());
-            }
-        }
-
-        @Override
-        public void clear() {
-            final Iterator<String> it = delegate.keySet().iterator();
-            while (it.hasNext()) {
-                if (delegate.get(it.next()) instanceof BeanInstanceBag) {
-                    it.remove();
-                }
-            }
-        }
-
-        @Override
-        public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value);
-        }
-
-        @Override
-        public boolean remove(final Object key, final Object value) {
-            return delegate.remove(key(key), value);
-        }
-
-        @Override
-        public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
-            return delegate.replace(key(key), oldValue, newValue);
-        }
-
-        @Override
-        public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            return (BeanInstanceBag<?>) delegate.replace(key(key), value);
-        }
-    }
-
-    private static class HttpSessionMap implements ConcurrentMap<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
-        private final HttpSession session;
-
-        public HttpSessionMap(final HttpSession session) {
-            this.session = session;
-        }
-
-        @Override
-        public int size() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean containsKey(final Object key) {
-            return session.getAttribute(key(key)) != null;
-        }
-
-        @Override
-        public boolean containsValue(final Object value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public Set<Contextual<?>> keySet() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public Collection<BeanInstanceBag<?>> values() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void clear() {
-            // no-op
-        }
-
-        @Override
-        public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
-            return Collections.emptySet();
-        }
-
-        @Override
-        public BeanInstanceBag<?> get(final Object key) {
-            return (BeanInstanceBag<?>) session.getAttribute(key(key));
-        }
-
-        @Override
-        public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            final BeanInstanceBag<?> bag = get(key);
-            session.setAttribute(key(key), value);
-            return bag;
-        }
-
-        @Override
-        public BeanInstanceBag<?> remove(final Object key) {
-            final BeanInstanceBag<?> bag = get(key);
-            session.removeAttribute(key(key));
-            return bag;
-        }
-
-        @Override
-        public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
-            for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) {
-                put(e.getKey(), e.getValue());
-            }
-        }
-
-        @Override
-        public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) {
-            final String k = key(key);
-            final BeanInstanceBag<?> beanInstanceBag = get(k);
-            if (beanInstanceBag == null) {
-                return put(key, value);
-            }
-            return beanInstanceBag;
-        }
-
-        @Override
-        public boolean remove(final Object key, final Object value) {
-            remove(key(key));
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            return "HttpSessionMap{session=" + session + '}';
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
deleted file mode 100644
index 71b2c2a..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.tomee.catalina.TomEERuntimeException;
-import org.apache.webbeans.context.creational.BeanInstanceBag;
-import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler;
-
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.servlet.http.HttpSession;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class SessionNormalScopeBeanHandler extends NormalScopedBeanInterceptorHandler {
-    private static final Field BAG_INSTANCE;
-    static {
-        try {
-            BAG_INSTANCE = BeanInstanceBag.class.getDeclaredField("beanInstance");
-            BAG_INSTANCE.setAccessible(true);
-        } catch (final NoSuchFieldException e) {
-            throw new TomEERuntimeException(e);
-        }
-    }
-
-    private static final ThreadLocal<Map<Bean<?>, UpdateInfo>> OBJECTS = new ThreadLocal<Map<Bean<?>, UpdateInfo>>() {
-        @Override
-        protected Map<Bean<?>, UpdateInfo> initialValue() {
-            CdiAppContextsService.pushRequestReleasable(new Runnable() { // update in batch
-                @Override
-                public void run() {
-                    final Map<Bean<?>, UpdateInfo> values = OBJECTS.get();
-                    for (final UpdateInfo o : values.values()) {
-                        o.updateBean();
-                    }
-                    values.clear();
-                    OBJECTS.remove();
-                }
-            });
-            return new HashMap<Bean<?>, UpdateInfo>();
-        }
-    };
-
-    public SessionNormalScopeBeanHandler(final BeanManager beanManager, final Bean<?> bean) {
-        super(beanManager, bean);
-    }
-
-    @Override
-    public Object get() {
-        final Object webbeansInstance = getContextualInstance();
-        final Map<Bean<?>, UpdateInfo> beanUpdateInfoMap = OBJECTS.get();
-
-        if (!beanUpdateInfoMap.containsKey(bean)) {
-            beanUpdateInfoMap.put(bean, new UpdateInfo(bean, getBeanManager(), webbeansInstance));
-        }
-
-        return webbeansInstance;
-    }
-
-    protected static class UpdateInfo {
-        private Bean<?> bean;
-        private BeanManager bm;
-        private Object value;
-
-        protected UpdateInfo(final Bean<?> bean, final BeanManager bm, final Object value) {
-            this.bean = bean;
-            this.bm = bm;
-            this.value = value;
-        }
-
-        @SuppressWarnings("unchecked")
-        protected void updateBean() {
-            final HttpSession session = session();
-            if (session == null) {
-                return;
-            }
-
-            // go through all listeners to be able to be replicated or do any processing which can be done
-            final String key = SessionContextBackedByHttpSession.key(bean);
-            final BeanInstanceBag<Object> bag = BeanInstanceBag.class.cast(session.getAttribute(key));
-            if (bag != null) {
-                try {
-                    BAG_INSTANCE.set(bag, value);
-                } catch (final IllegalAccessException e) {
-                    throw new TomEERuntimeException(e);
-                }
-                session.setAttribute(key, bag);
-            }
-        }
-
-        private HttpSession session() {
-            final Context context = bm.getContext(SessionScoped.class);
-            if (!SessionContextBackedByHttpSession.class.isInstance(context)) {
-                return null;
-            }
-            return SessionContextBackedByHttpSession.class.cast(context).getSession();
-        }
-    }
-}