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(); + } }