destroying session in a SessionManager in embedded mode and not in cdi context
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/bdd8644b Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/bdd8644b Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/bdd8644b Branch: refs/heads/master Commit: bdd8644b96f620ab0c642383d12ceefa9ec525bd Parents: 12e1a44 Author: Romain Manni-Bucau <[email protected]> Authored: Sun May 3 23:59:34 2015 +0200 Committer: Mark Struberg <[email protected]> Committed: Mon May 4 19:54:15 2015 +0200 ---------------------------------------------------------------------- .../server/httpd/BeginWebBeansListener.java | 8 +-- .../openejb/server/httpd/HttpSessionImpl.java | 1 - .../openejb/server/httpd/OpenEJBHttpServer.java | 17 ++++--- .../server/httpd/session/SessionManager.java | 52 ++++++++++++++------ tck/cdi-embedded/src/test/resources/failing.xml | 2 +- 5 files changed, 51 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/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 4a9b6e1..ad73556 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 @@ -95,7 +95,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq elStore.destroyELContextStore(); } - webBeansContext.getContextsService().endContext(RequestScoped.class, event); + contextsService.endContext(RequestScoped.class, event); if (webBeansContext instanceof WebappWebBeansContext) { // end after child ((WebappWebBeansContext) webBeansContext).getParent().getContextsService().endContext(RequestScoped.class, event); } @@ -123,7 +123,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq if (webBeansContext instanceof WebappWebBeansContext) { // start before child ((WebappWebBeansContext) webBeansContext).getParent().getContextsService().startContext(RequestScoped.class, event); } - this.webBeansContext.getContextsService().startContext(RequestScoped.class, event); + contextsService.startContext(RequestScoped.class, event); // we don't initialise the Session here but do it lazily if it gets requested // the first time. See OWB-457 @@ -146,7 +146,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq if (webBeansContext instanceof WebappWebBeansContext) { // start before child ((WebappWebBeansContext) webBeansContext).getParent().getContextsService().startContext(SessionScoped.class, event.getSession()); } - this.webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession()); + contextsService.startContext(SessionScoped.class, event.getSession()); } catch (final Exception e) { logger.error(OWBLogConst.ERROR_0020, event.getSession()); WebBeansUtil.throwRuntimeExceptions(e); @@ -166,7 +166,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId()); } - webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession()); + contextsService.endContext(SessionScoped.class, event.getSession()); WebBeansListenerHelper.destroyFakedRequest(this); } http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java index 657a394..f82b7bf 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java @@ -102,7 +102,6 @@ public class HttpSessionImpl implements HttpSession { } } - attributes.clear(); final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class); if (sessionManager != null) { sessionManager.removeSession(sessionId); http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java index 65e8c66..16277fb 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java @@ -29,12 +29,6 @@ import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; import org.apache.openejb.util.OptionsLog; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -46,6 +40,12 @@ import java.net.URI; import java.util.Map; import java.util.Properties; import java.util.Set; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; /** * This is the main class for the web administration. It takes care of the @@ -62,7 +62,7 @@ public class OpenEJBHttpServer implements HttpServer { private boolean indent; public OpenEJBHttpServer() { - this(getHttpListenerRegistry()); + this(null); } public static HttpListenerRegistry getHttpListenerRegistry() { @@ -76,10 +76,11 @@ public class OpenEJBHttpServer implements HttpServer { } public OpenEJBHttpServer(final HttpListener listener) { - this.listener = new OpenEJBHttpRegistry.ClassLoaderHttpListener(listener, ParentClassLoaderFinder.Helper.get()); if (SystemInstance.get().getComponent(SessionManager.class) == null) { SystemInstance.get().setComponent(SessionManager.class, new SessionManager()); } + this.listener = new OpenEJBHttpRegistry.ClassLoaderHttpListener( + listener == null ? getHttpListenerRegistry() : listener, ParentClassLoaderFinder.Helper.get()); } public static boolean isTextXml(final Map<String, String> headers) { http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java index ad455b1..2284421 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java @@ -19,10 +19,11 @@ package org.apache.openejb.server.httpd.session; import org.apache.openejb.core.WebContext; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.server.httpd.BeginWebBeansListener; -import org.apache.openejb.server.httpd.HttpRequestImpl; +import org.apache.openejb.server.httpd.EndWebBeansListener; import org.apache.openejb.server.httpd.HttpSession; import org.apache.openejb.util.DaemonThreadFactory; import org.apache.openejb.util.Duration; +import org.apache.webbeans.config.WebBeansContext; import java.util.ArrayList; import java.util.Collection; @@ -43,16 +44,37 @@ public class SessionManager { private static volatile ScheduledExecutorService es; public void destroy(final WebContext app) { + if (app == null) { + return; + } + + final WebBeansContext wbc = app.getWebBeansContext(); final Iterator<SessionWrapper> iterator = sessions.values().iterator(); while (iterator.hasNext()) { final SessionWrapper next = iterator.next(); if (next.app == app) { - next.session.invalidate(); + doDestroy(next); iterator.remove(); } } } + private void doDestroy(final SessionWrapper next) { + HttpSessionEvent event = null; + if (next.end != null) { + event = new HttpSessionEvent(next.session); + next.end.sessionDestroyed(event); + next.begin.sessionCreated(event); // just set session thread local + } + try { + next.session.invalidate(); + } finally { + if (next.begin != null) { + next.begin.sessionDestroyed(event); + } + } + } + public void destroy() { if (es == null) { return; @@ -69,7 +91,7 @@ public class SessionManager { return; } final Duration duration = new Duration(SystemInstance.get().getProperty("openejb.http.eviction.duration", "1 minute")); - es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(HttpRequestImpl.class)); + es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(SessionManager.class)); es.scheduleWithFixedDelay(new Runnable() { @Override public void run() { @@ -77,12 +99,8 @@ public class SessionManager { final HttpSession session = data.session; if (session.getMaxInactiveInterval() > 0 && session.getLastAccessedTime() + TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval()) < System.currentTimeMillis()) { - sessions.remove(session.getId()); - session.invalidate(); - - if (data.listener != null) { - data.listener.sessionDestroyed(new HttpSessionEvent(session)); - } + doDestroy(data); + sessions.remove(data.session.getId()); } } } @@ -105,8 +123,10 @@ public class SessionManager { return sessions.size(); } - public SessionWrapper newSession(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) { - final SessionWrapper existing = sessions.putIfAbsent(session.getId(), new SessionWrapper(listener, session, app)); + public SessionWrapper newSession(final BeginWebBeansListener begin, final EndWebBeansListener end, + final HttpSession session, final WebContext app) { + final SessionWrapper wrapper = new SessionWrapper(begin, end, session, app); + final SessionWrapper existing = sessions.putIfAbsent(session.getId(), wrapper); if (existing == null && es == null) { synchronized (this) { if (es == null) { @@ -114,17 +134,19 @@ public class SessionManager { } } } - return existing; + return existing == null ? wrapper : existing; } public static class SessionWrapper extends HttpSessionEvent { - public final BeginWebBeansListener listener; + public final BeginWebBeansListener begin; + public final EndWebBeansListener end; public final HttpSession session; public final WebContext app; - public SessionWrapper(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) { + public SessionWrapper(final BeginWebBeansListener begin, final EndWebBeansListener end, final HttpSession session, final WebContext app) { super(session); - this.listener = listener; + this.begin = begin; + this.end = end; this.session = session; this.app = app; } http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/tck/cdi-embedded/src/test/resources/failing.xml ---------------------------------------------------------------------- diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml index bf0d833..3a10892 100644 --- a/tck/cdi-embedded/src/test/resources/failing.xml +++ b/tck/cdi-embedded/src/test/resources/failing.xml @@ -32,7 +32,7 @@ -Dopenejb.cdi.conversation.http.use-get-parameter=true --> <classes> - <class name="org.jboss.cdi.tck.tests.lookup.injection.non.contextual.InjectionIntoNonContextualComponentTest" /> + <class name="org.jboss.cdi.tck.tests.context.session.listener.shutdown.SessionContextListenerShutdownTest" /> </classes> </test> </suite>
