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