You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/05/04 18:26:12 UTC

tomee git commit: destroying session scope before session in some tomee lifecycles

Repository: tomee
Updated Branches:
  refs/heads/master de0c9893c -> bf1b6e58a


destroying session scope before session in some tomee lifecycles


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

Branch: refs/heads/master
Commit: bf1b6e58a22a4d5f261f9ac09539e09b704b079c
Parents: de0c989
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Mon May 4 18:25:48 2015 +0200
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Mon May 4 18:25:48 2015 +0200

----------------------------------------------------------------------
 .../openejb/cdi/CdiAppContextsService.java      | 49 ++++++++++++--------
 tck/cdi-tomee/src/test/resources/failing.xml    |  2 +-
 .../tomee/catalina/TomEEContainerListener.java  |  2 +-
 3 files changed, 31 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/bf1b6e58/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 d6a202e..02c190f 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
@@ -184,7 +184,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
             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),
+                    new EventMetadataImpl(null, ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[]{DestroyedLiteral.INSTANCE_APPLICATION_SCOPED}, webBeansContext),
                     false);
             applicationContext.setActive(true);
 
@@ -199,6 +199,17 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
                 webBeansContext.getBeanManagerImpl().fireEvent(id, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
             }
         }
+        for (final SessionContext sc : sessionCtxManager.getContextById().values()) { // ensure to destroy session context in time at shutdown and not with session which can happen later
+            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);
+            }
+            destroySessionContext(event);
+        }
         sessionCtxManager.getContextById().clear();
     }
 
@@ -244,12 +255,11 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
             } 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");
+                            + scopeType.getSimpleName()
+                            + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
                 }
             }
         }
-
     }
 
     @Override
@@ -289,8 +299,8 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
             } 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");
+                            + scopeType.getSimpleName()
+                            + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
                 }
             }
         }
@@ -317,7 +327,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
             webBeansContext.getBeanManagerImpl().fireEvent(
                     appEvent,
                     new EventMetadataImpl(null,
-                            ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[] { InitializedLiteral.INSTANCE_APPLICATION_SCOPED },
+                            ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[]{InitializedLiteral.INSTANCE_APPLICATION_SCOPED},
                             webBeansContext),
                     false);
         }
@@ -326,12 +336,11 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
     @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();
-
+                || 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) {
@@ -403,7 +412,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
     }
 
     public void checkConversationState() {
-        final ServletRequestContext rc  = getRequestContext(false);
+        final ServletRequestContext rc = getRequestContext(false);
         if (rc != null && rc.getServletRequest() != null && conversationService != null) {
             final HttpSession session = rc.getServletRequest().getSession(false);
             if (session != null) {
@@ -536,7 +545,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
                 } catch (final Exception e) {
                     return (SessionContext) clazz.newInstance();
                 }
-
             } catch (final Exception e) {
                 logger.error("Can't instantiate " + classname + ", using default session context", e);
             }
@@ -550,7 +558,7 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
      *
      * @param session http session object
      */
-    private void destroySessionContext(final HttpSession session) {
+    private void destroySessionContext(final Object session) {
         if (session != null) {
             final SessionContext context = sessionContext.get();
 
@@ -573,13 +581,15 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
             sessionContext.remove();
 
             //Remove session from manager
-            sessionCtxManager.removeSessionContextWithSessionId(session.getId());
+            if (HttpSession.class.isInstance(session)) {
+                sessionCtxManager.removeSessionContextWithSessionId(HttpSession.class.cast(session).getId());
+            }
         }
     }
 
-    private void doDestroySession(SessionContext context, HttpSession session) {
+    private void doDestroySession(final SessionContext context, final Object event) {
         context.destroy();
-        webBeansContext.getBeanManagerImpl().fireEvent(session, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
+        webBeansContext.getBeanManagerImpl().fireEvent(event, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
     }
 
     //we don't have initApplicationContext
@@ -721,7 +731,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
                 } catch (final Exception e) {
                     logger.error(OWBLogConst.ERROR_0013, e);
                 }
-
             } else {
                 logger.warning("Could NOT lazily initialize session context because NO active request context");
             }

http://git-wip-us.apache.org/repos/asf/tomee/blob/bf1b6e58/tck/cdi-tomee/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee/src/test/resources/failing.xml b/tck/cdi-tomee/src/test/resources/failing.xml
index 6ec10c3..23ceda0 100644
--- a/tck/cdi-tomee/src/test/resources/failing.xml
+++ b/tck/cdi-tomee/src/test/resources/failing.xml
@@ -23,7 +23,7 @@
   -->
   <test name="CDI TCK for developers (debugging)">
     <classes>
-      <class name="org.jboss.cdi.tck.tests.context.request.ws.RequestContextTest" />
+      <class name="org.jboss.cdi.tck.tests.deployment.shutdown.ApplicationShutdownLifecycleTest" />
     </classes>
   </test>
 </suite>

http://git-wip-us.apache.org/repos/asf/tomee/blob/bf1b6e58/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..24fa536 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
@@ -33,7 +33,7 @@ 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())) {
+        } else if (Context.CHANGE_SESSION_ID_EVENT.endsWith(event.getType())) { // note: we could use a javax.servlet.http.HttpSessionIdListener
             final String[] ids = (String[]) event.getData();
 
             final WebBeansContext wbc = WebBeansContext.currentInstance();