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 2013/11/04 10:23:11 UTC

svn commit: r1538537 - in /tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd: BeginWebBeansListener.java EndWebBeansListener.java

Author: rmannibucau
Date: Mon Nov  4 09:23:11 2013
New Revision: 1538537

URL: http://svn.apache.org/r1538537
Log:
OWB-910 starting request scope when session is invalidated too

Modified:
    tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
    tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java

Modified: tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java?rev=1538537&r1=1538536&r2=1538537&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java (original)
+++ tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java Mon Nov  4 09:23:11 2013
@@ -84,7 +84,7 @@ public class BeginWebBeansListener imple
 
         try {
             if (logger.isDebugEnabled()) {
-                logger.debug("Starting a new request : [{0}]", event.getServletRequest().getRemoteAddr());
+                logger.debug("Starting a new request : [{0}]", event == null ? "null" : event.getServletRequest().getRemoteAddr());
             }
 
             if (webBeansContext instanceof WebappWebBeansContext) { // start before child
@@ -96,7 +96,7 @@ public class BeginWebBeansListener imple
             // the first time. See OWB-457
 
         } catch (Exception e) {
-            logger.error(OWBLogConst.ERROR_0019, event.getServletRequest());
+            logger.error(OWBLogConst.ERROR_0019, event == null ? "null" : event.getServletRequest());
             WebBeansUtil.throwRuntimeExceptions(e);
         }
     }
@@ -125,13 +125,20 @@ public class BeginWebBeansListener imple
      */
     @Override
     public void sessionDestroyed(HttpSessionEvent event) {
-        // no-op
+        ensureRequestScope();
+    }
+
+    private void ensureRequestScope() {
+        if (!webBeansContext.getContextsService().getCurrentContext(RequestScoped.class).isActive()) {
+            requestInitialized(null);
+            EndWebBeansListener.FAKE_REQUEST.set(true);
+        }
     }
 
 
     @Override
     public void sessionWillPassivate(HttpSessionEvent event) {
-        // no-op
+        ensureRequestScope();
     }
 
     @Override
@@ -145,13 +152,14 @@ public class BeginWebBeansListener imple
     public void contextInitialized(ServletContextEvent servletContextEvent) {
         try {
             OpenEJBLifecycle.initializeServletContext(servletContextEvent.getServletContext(), webBeansContext);
-        } catch (Exception e) {
-            e.printStackTrace();
+        } catch (final Exception e) {
+            logger.warning(e.getMessage(), e);
         }
+        ensureRequestScope();
     }
 
     @Override
     public void contextDestroyed(ServletContextEvent servletContextEvent) {
-        // no-op
+        ensureRequestScope();
     }
 }

Modified: tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java?rev=1538537&r1=1538536&r2=1538537&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java (original)
+++ tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java Mon Nov  4 09:23:11 2013
@@ -29,6 +29,8 @@ import org.apache.webbeans.spi.FailOverS
 import javax.enterprise.context.Conversation;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.SessionScoped;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
 import javax.servlet.ServletRequestEvent;
 import javax.servlet.ServletRequestListener;
 import javax.servlet.http.HttpServletRequest;
@@ -42,7 +44,9 @@ import java.util.Map;
  *
  * Used as a stack executed at the end of the request too. Avoid multiple (useless) listeners.
  */
-public class EndWebBeansListener implements ServletRequestListener, HttpSessionListener, HttpSessionActivationListener {
+public class EndWebBeansListener implements ServletContextListener, ServletRequestListener, HttpSessionListener, HttpSessionActivationListener {
+
+    static final ThreadLocal<Boolean> FAKE_REQUEST = new ThreadLocal<Boolean>();
 
     private final String contextKey;
 
@@ -86,11 +90,17 @@ public class EndWebBeansListener impleme
             logger.debug("Destroying a request : [{0}]", event.getServletRequest().getRemoteAddr());
         }
 
-        final Object oldContext = event.getServletRequest().getAttribute(contextKey);
+        final Object oldContext;
+        if (event != null) {
+            oldContext = event.getServletRequest().getAttribute(contextKey);
+        } else {
+            oldContext = null;
+        }
 
         try {
-            if (failoverService != null &&
-                    failoverService.isSupportFailOver()) {
+            if (event != null
+                && failoverService != null
+                && failoverService.isSupportFailOver()) {
                 Object request = event.getServletRequest();
                 if (request instanceof HttpServletRequest) {
                     HttpServletRequest httpRequest = (HttpServletRequest) request;
@@ -160,6 +170,19 @@ public class EndWebBeansListener impleme
                 c.destroy();
             }
         }
+
+        destroyFakedRequest();
+    }
+
+    private void destroyFakedRequest() {
+        final Boolean faked = FAKE_REQUEST.get();
+        try {
+            if (faked != null && faked) {
+                requestDestroyed(null);
+            }
+        } finally {
+            FAKE_REQUEST.remove();
+        }
     }
 
 
@@ -172,10 +195,21 @@ public class EndWebBeansListener impleme
         if (failoverService != null && failoverService.isSupportPassivation()) {
             failoverService.sessionWillPassivate(event.getSession());
         }
+        destroyFakedRequest();
     }
 
     @Override
     public void sessionDidActivate(HttpSessionEvent event) {
         // no-op
     }
+
+    @Override
+    public void contextInitialized(ServletContextEvent servletContextEvent) {
+        destroyFakedRequest();
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent servletContextEvent) {
+        destroyFakedRequest();
+    }
 }