TOMEE-1572 adopt OWB-1.5 changes * improved ConversationHandling * improved SessionHandling
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e41c460f Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e41c460f Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e41c460f Branch: refs/heads/master Commit: e41c460fb6410f54f153f54272c8bce7dfea39f2 Parents: d376ef5 Author: Mark Struberg <[email protected]> Authored: Sat May 2 11:44:53 2015 +0200 Committer: Mark Struberg <[email protected]> Committed: Sat May 2 11:44:53 2015 +0200 ---------------------------------------------------------------------- .../openejb/cdi/CdiAppContextsService.java | 760 +------------------ .../java/org/apache/openejb/cdi/CdiPlugin.java | 14 +- .../apache/openejb/cdi/OpenEJBLifecycle.java | 68 +- .../openejb/cdi/ThreadSingletonServiceImpl.java | 4 - .../cdi/UpdatableSessionContextManager.java | 66 -- .../openejb/testing/ApplicationComposers.java | 2 +- .../openejb/cdi/CdiAppContextsServiceTest.java | 4 +- ...StatefulConversationScopedTOMEE1138Test.java | 4 +- .../server/httpd/BeginWebBeansListener.java | 35 - .../server/httpd/EndWebBeansListener.java | 10 - .../server/httpd/HttpListenerRegistry.java | 8 +- .../openejb/server/httpd/HttpRequestImpl.java | 3 + .../server/httpd/WebBeansListenerHelper.java | 3 + .../tomee/catalina/OpenEJBContextConfig.java | 45 -- .../tomee/catalina/TomEEContainerListener.java | 13 +- .../tomee/catalina/TomcatWebAppBuilder.java | 8 +- .../cdi/SessionContextBackedByHttpSession.java | 289 ------- .../cdi/SessionNormalScopeBeanHandler.java | 117 --- 18 files changed, 74 insertions(+), 1379 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 655af39..780728e 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 @@ -18,82 +18,26 @@ package org.apache.openejb.cdi; -import org.apache.openejb.core.Operation; -import org.apache.openejb.core.ThreadContext; -import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; -import org.apache.webbeans.annotation.DestroyedLiteral; -import org.apache.webbeans.annotation.InitializedLiteral; -import org.apache.webbeans.config.OWBLogConst; import org.apache.webbeans.config.WebBeansContext; -import org.apache.webbeans.context.AbstractContextsService; -import org.apache.webbeans.context.ApplicationContext; -import org.apache.webbeans.context.ConversationContext; -import org.apache.webbeans.context.DependentContext; +import org.apache.webbeans.context.RequestContext; import org.apache.webbeans.context.SessionContext; -import org.apache.webbeans.context.SingletonContext; -import org.apache.webbeans.conversation.ConversationImpl; -import org.apache.webbeans.conversation.ConversationManager; -import org.apache.webbeans.el.ELContextStore; -import org.apache.webbeans.event.EventMetadataImpl; import org.apache.webbeans.spi.ContextsService; -import org.apache.webbeans.spi.ConversationService; -import org.apache.webbeans.web.context.ServletRequestContext; -import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler; +import org.apache.webbeans.web.context.WebContextsService; -import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collection; -import java.util.Map; import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.BusyConversationException; -import javax.enterprise.context.ContextException; -import javax.enterprise.context.Conversation; -import javax.enterprise.context.ConversationScoped; -import javax.enterprise.context.Dependent; -import javax.enterprise.context.RequestScoped; -import javax.enterprise.context.SessionScoped; -import javax.enterprise.context.spi.Context; import javax.inject.Singleton; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletRequestEvent; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -public class CdiAppContextsService extends AbstractContextsService implements ContextsService, ConversationService { + +public class CdiAppContextsService extends WebContextsService implements ContextsService { public static final Object EJB_REQUEST_EVENT = new Object(); private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class); - private static final String CID = "cid"; - - private final ThreadLocal<ServletRequestContext> requestContext = new ThreadLocal<>(); - - private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<>(); - private final UpdatableSessionContextManager sessionCtxManager = new UpdatableSessionContextManager(); - - /** - * Conversation context manager - */ - private final ThreadLocal<ConversationContext> conversationContext; - - private final DependentContext dependentContext = new DependentContext(); - - private final ApplicationContext applicationContext = new ApplicationContext(); - - private final SingletonContext singletonContext = new SingletonContext(); - - private final WebBeansContext webBeansContext; - - private final ConversationService conversationService; - - private volatile Object appEvent; - - private final boolean useGetParameter; - private static final ThreadLocal<Collection<Runnable>> endRequestRunnables = new ThreadLocal<Collection<Runnable>>() { @Override protected Collection<Runnable> initialValue() { @@ -101,37 +45,13 @@ public class CdiAppContextsService extends AbstractContextsService implements Co } }; - private volatile boolean autoConversationCheck = true; public CdiAppContextsService(final WebBeansContext wbc) { - this(wbc, wbc.getOpenWebBeansConfiguration().supportsConversation()); + super(wbc); } - public CdiAppContextsService(final WebBeansContext wbc, final boolean supportsConversation) { - if (wbc != null) { - webBeansContext = wbc; - } else { - webBeansContext = WebBeansContext.currentInstance(); - } - - dependentContext.setActive(true); - if (supportsConversation) { - conversationService = webBeansContext.getService(ConversationService.class); - if (conversationService == null) { - conversationContext = null; - } else { - conversationContext = new ThreadLocal<>(); - } - } else { - conversationService = null; - conversationContext = null; - } - applicationContext.setActive(true); - singletonContext.setActive(true); - useGetParameter = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cdi.conversation.http.use-get-parameter", "false")); - } - private void endRequest() { + private void runEndRequestTasks() { for (final Runnable r : endRequestRunnables.get()) { try { r.run(); @@ -146,30 +66,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co endRequestRunnables.get().add(runnable); } - @Override - public String getConversationId() { - return getHttpParameter(CID); - } - - @Override - public String getConversationSessionId() { - return currentSessionId(false); - } - - public String currentSessionId(final boolean force) { - final ServletRequestContext rc = requestContext.get(); - if (rc != null) { - final HttpServletRequest req = rc.getServletRequest(); - if (req != null) { - final HttpSession session = req.getSession(force); - if (session != null) { - return session.getId(); - } - } - } - return null; - } - @Override // this method is called after the deployment (BeansDeployer) but need beans to be here to get events public void init(final Object initializeObject) { //Start application context @@ -179,651 +75,17 @@ public class CdiAppContextsService extends AbstractContextsService implements Co startContext(Singleton.class, initializeObject); } - public void beforeStop(final Object ignored) { - { // trigger @PreDestroy mainly but keep it active until destroy(xxx) - 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), - false); - applicationContext.setActive(true); - - singletonContext.destroy(); - singletonContext.setActive(true); - } - - for (final Map.Entry<Conversation, ConversationContext> conversation : webBeansContext.getConversationManager().getAllConversationContexts().entrySet()) { - conversation.getValue().destroy(); - final String id = conversation.getKey().getId(); - if (id != null) { - webBeansContext.getBeanManagerImpl().fireEvent(id, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED); - } - } - for (final SessionContext sc : sessionCtxManager.getContextById().values()) { - 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); - try { - httpSession.invalidate(); - } catch (final IllegalStateException ise) { - // no-op - } finally { - destroySessionContext(httpSession); - } - } else { - sc.destroy(); - } - webBeansContext.getBeanManagerImpl().fireEvent(event, DestroyedLiteral.INSTANCE_SESSION_SCOPED); - } - sessionCtxManager.getContextById().clear(); - } - public void destroy(final Object destroyObject) { - //Destroy application context - endContext(ApplicationScoped.class, destroyObject); - - //Destroy singleton context - endContext(Singleton.class, destroyObject); - + super.destroy(destroyObject); removeThreadLocals(); } - public void removeThreadLocals() { - //Remove thread locals - //for preventing memory leaks - requestContext.set(null); - requestContext.remove(); - sessionContext.set(null); - sessionContext.remove(); - - if (null != conversationContext) { - conversationContext.set(null); - conversationContext.remove(); - } - } - - @Override - public void endContext(final Class<? extends Annotation> scopeType, final Object endParameters) { - if (supportsContext(scopeType)) { - if (scopeType.equals(RequestScoped.class)) { - destroyRequestContext(endParameters); - } else if (scopeType.equals(SessionScoped.class)) { - destroySessionContext((HttpSession) endParameters); - } else if (scopeType.equals(ApplicationScoped.class)) { - destroyApplicationContext(); - } else if (scopeType.equals(Dependent.class)) { //NOPMD - // Do nothing - } else if (scopeType.equals(Singleton.class)) { - destroySingletonContext(); - } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) { - destroyConversationContext(endParameters); - } 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"); - } - } - } - - } - - @Override - public Context getCurrentContext(final Class<? extends Annotation> scopeType) { - if (scopeType.equals(RequestScoped.class)) { - return getRequestContext(true); - } else if (scopeType.equals(SessionScoped.class)) { - return getSessionContext(true); - } else if (scopeType.equals(ApplicationScoped.class)) { - return getApplicationContext(); - } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) { - return getConversationContext(); - } else if (scopeType.equals(Dependent.class)) { - return dependentContext; - } else if (scopeType.equals(Singleton.class)) { - return getSingletonContext(); - } - - return null; - } @Override - public void startContext(final Class<? extends Annotation> scopeType, final Object startParameter) throws ContextException { - if (supportsContext(scopeType)) { - if (scopeType.equals(RequestScoped.class)) { - initRequestContext(startParameter); - } else if (scopeType.equals(SessionScoped.class)) { - initSessionContext((HttpSession) startParameter); - } else if (scopeType.equals(ApplicationScoped.class)) { - initApplicationContext(startParameter); - } else if (scopeType.equals(Dependent.class)) { - initSingletonContext(); - } else if (scopeType.equals(Singleton.class)) { //NOPMD - // Do nothing - } else if (supportsConversation() && scopeType.equals(ConversationScoped.class) && !isTimeout()) { - initConversationContext(startParameter); - } 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"); - } - } - } - } - - private void initSingletonContext() { - singletonContext.setActive(true); - } - - private void initApplicationContext(final Object init) { // in case contexts are stop/start - if (appEvent == null) { // no need of sync cause of the lifecycle - Object event = init; - if (StartupObject.class.isInstance(init)) { - final StartupObject so = StartupObject.class.cast(init); - if (so.isFromWebApp()) { // ear webapps - event = so.getWebContext().getServletContext(); - } else if (so.getAppInfo().webAppAlone) { - event = SystemInstance.get().getComponent(ServletContext.class); - } - } else if (ServletContextEvent.class.isInstance(init)) { - event = ServletContextEvent.class.cast(init).getServletContext(); - } - appEvent = event != null ? event : applicationContext; - webBeansContext.getBeanManagerImpl().fireEvent( - appEvent, - new EventMetadataImpl(null, - ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[] { InitializedLiteral.INSTANCE_APPLICATION_SCOPED }, - webBeansContext), - false); - } - } - - @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(); - - } - - private void initRequestContext(final Object event) { - final ServletRequestContext rq = new ServletRequestContext(); - rq.setActive(true); - - requestContext.set(rq);// set thread local - if (event != null && ServletRequestEvent.class.isInstance(event)) { - final HttpServletRequest request = (HttpServletRequest) ServletRequestEvent.class.cast(event).getServletRequest(); - rq.setServletRequest(request); - - if (request != null) { - webBeansContext.getBeanManagerImpl().fireEvent(request, InitializedLiteral.INSTANCE_REQUEST_SCOPED); - } - - if (request != null) { - //Re-initialize thread local for session - final HttpSession session = request.getSession(false); - - final String cid = conversationService != null ? (!useGetParameter ? getCid(request) : request.getParameter(CID)) : null; - if (session != null) { - initSessionContext(session); - if (autoConversationCheck && conversationService != null && !isConversationSkipped(request)) { - if (cid != null) { - final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId()); - if (c != null) { - final ConversationContext context = conversationManager.getConversationContext(c); - context.setActive(true); - conversationContext.set(context); - return; - } - } - } - } - - if (cid == null && !isTimeout() && autoConversationCheck) { - // transient but active - initConversationContext(request); - } - } - } else if (event == EJB_REQUEST_EVENT) { - webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_REQUEST_SCOPED); - } - } - - public static String getCid(final HttpServletRequest req) { - return getFromQuery(CID, req.getQueryString()); - } - - public static String getFromQuery(final String name, final String q) { - final int cid = q == null ? -1 : q.indexOf(name + "="); - if (cid < 0) { - return null; - } - int end = q.indexOf("&", cid); - final int end2 = q.indexOf("#", cid); - if (end2 > 0 && end2 < end) { - end = end2; - } - if (end < 0) { - end = q.length(); - } - return q.substring(cid + name.length() + 1, end); - } - - public boolean isAutoConversationCheck() { - return autoConversationCheck; - } - - public void checkConversationState() { - final ServletRequestContext rc = getRequestContext(false); - if (rc != null && rc.getServletRequest() != null && conversationService != null) { - final HttpSession session = rc.getServletRequest().getSession(false); - if (session != null) { - final String cid = useGetParameter ? rc.getServletRequest().getParameter(CID) : getFromQuery(CID, rc.getServletRequest().getQueryString()); - if (cid != null) { - final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId()); - if (!autoConversationCheck) { // lazy association - initConversationContext(rc.getServletRequest()); - } - if (c != null) { - if (c.isTransient()) { - throw new IllegalStateException("Conversation " + cid + " missing"); - } - if (c.iUseIt() > 1) { - throw new BusyConversationException("busy conversation " + c.getId() + '(' + c.getSessionId() + ')'); - } - } - } - } - } - } - - private void destroyRequestContext(final Object end) { - // execute request tasks - endRequest(); - - //Get context - final ServletRequestContext context = getRequestContext(false); - - //Destroy context - if (context != null) { - if (supportsConversation()) { // OWB-595 - cleanupConversation(); - } - - final HttpServletRequest servletRequest = context.getServletRequest(); - if (servletRequest != null) { - webBeansContext.getBeanManagerImpl().fireEvent(servletRequest, DestroyedLiteral.INSTANCE_REQUEST_SCOPED); - } else if (end == EJB_REQUEST_EVENT) { - webBeansContext.getBeanManagerImpl().fireEvent(end, DestroyedLiteral.INSTANCE_REQUEST_SCOPED); - } - context.destroy(); - } - - // clean up the EL caches after each request - final ELContextStore elStore = ELContextStore.getInstance(false); - if (elStore != null) { - elStore.destroyELContextStore(); - } - - //Clear thread locals - only for request to let user do with deltaspike start(session, request)restart(request)...stop() - requestContext.remove(); - - RequestScopedBeanInterceptorHandler.removeThreadLocals(); - } - - private void cleanupConversation() { - if (conversationService == null) { - return; - } - - final ConversationContext cc = getConversationContext(); - if (cc == null) { - return; - } - cc.setActive(false); - - final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final Conversation conversation = conversationManager.getConversationBeanReference(); - if (conversation == null) { - return; - } - - final ConversationImpl conversationImpl = ConversationImpl.class.cast(conversation); - conversationImpl.iDontUseItAnymore(); // do it before next call to avoid busy exception if possible - try { - if (conversation.isTransient()) { - endContext(ConversationScoped.class, null); - conversationManager.removeConversation(conversation); // in case end() was called - } else { - conversationImpl.updateTimeOut(); - } - } catch (final BusyConversationException bce) { - // no-op, TODO: do something, maybe add internalIsTransient() to avoid to fail here - } - } - - /** - * Creates the session context at the session start. - * - * @param session http session object - */ - private void initSessionContext(final HttpSession session) { - if (session == null) { - // no session -> no SessionContext - return; - } - - final String sessionId = session.getId(); - //Current context - SessionContext currentSessionContext = sessionId == null ? null : sessionCtxManager.getSessionContextWithSessionId(sessionId); - - //No current context - boolean fire = false; - if (currentSessionContext == null) { - currentSessionContext = newSessionContext(session); - sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext); - fire = true; - } - //Activate - currentSessionContext.setActive(true); - - //Set thread local - sessionContext.set(currentSessionContext); - - if (fire) { - webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED); - } - } - - private SessionContext newSessionContext(final HttpSession session) { - final String classname = SystemInstance.get().getComponent(ThreadSingletonService.class).sessionContextClass(); - if (classname != null) { - try { - final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(classname); - try { - final Constructor<?> constr = clazz.getConstructor(HttpSession.class); - return (SessionContext) constr.newInstance(session); - } catch (final Exception e) { - return (SessionContext) clazz.newInstance(); - } - - } catch (final Exception e) { - logger.error("Can't instantiate " + classname + ", using default session context", e); - } - } - return new HttpSessionContextSessionAware(session); - } - - /** - * Destroys the session context and all of its components at the end of the - * session. - * - * @param session http session object - */ - private void destroySessionContext(final HttpSession session) { - if (session != null) { - final SessionContext context = sessionContext.get(); - - if (context != null && context.isActive()) { - final ServletRequestContext servletRequestContext = getRequestContext(false); - if (servletRequestContext == null || servletRequestContext.getServletRequest() == null) { - doDestroySession(context, session); - } else { - pushRequestReleasable(new Runnable() { // call it at the end of the request - @Override - public void run() { - doDestroySession(context, session); - } - }); - } - } - - //Clear thread locals - sessionContext.set(null); - sessionContext.remove(); - - //Remove session from manager - sessionCtxManager.removeSessionContextWithSessionId(session.getId()); - } - } - - private void doDestroySession(SessionContext context, HttpSession session) { - context.destroy(); - webBeansContext.getBeanManagerImpl().fireEvent(session, DestroyedLiteral.INSTANCE_SESSION_SCOPED); - } - - //we don't have initApplicationContext - - private void destroyApplicationContext() { - applicationContext.destroy(); - } - - private void destroySingletonContext() { - singletonContext.destroy(); - } - - private ConversationContext initConversationContext(final Object request) { - if (conversationService == null) { - return null; - } - - final HttpServletRequest req = HttpServletRequest.class.isInstance(request) ? HttpServletRequest.class.cast(request) : null; - ConversationContext context = ConversationContext.class.isInstance(request) ? ConversationContext.class.cast(request) : null; - Object event = null; - if (context == null) { - final ConversationContext existingContext = conversationContext.get(); - if (existingContext == null) { - context = new ConversationContext(); - context.setActive(true); - - if (req != null) { - event = req; - } else { - final ServletRequestContext servletRequestContext = getRequestContext(true); - event = servletRequestContext != null && servletRequestContext.getServletRequest() != null ? servletRequestContext.getServletRequest() : context; - } - } else { - context = existingContext; - } - } - conversationContext.set(context); - context.setActive(true); - if (event != null) { - webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_CONVERSATION_SCOPED); - } - return context; - } - - /** - * Destroy conversation context. - */ - private void destroyConversationContext(final Object destroy) { - if (conversationService == null) { - return; - } - - final ConversationContext context = getConversationContext(); - if (context != null) { - context.destroy(); - final ServletRequestContext servletRequestContext = getRequestContext(false); - final Object destroyObject = servletRequestContext != null && servletRequestContext.getServletRequest() != null ? - servletRequestContext.getServletRequest() : destroy; - webBeansContext.getBeanManagerImpl().fireEvent( - destroyObject == null ? context : destroyObject, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED); - } - - if (null != context) { - conversationContext.remove(); - } - } + protected void destroyRequestContext(Object requestEvent) { + // execute endrequest tasks + runEndRequestTasks(); - - public ServletRequestContext getRequestContext(final boolean create) { - ServletRequestContext context = requestContext.get(); - if (context == null && create) { - initRequestContext(null); - return requestContext.get(); - } - return context; - } - - private Context getSessionContext(final boolean create) { - SessionContext context = sessionContext.get(); - if ((context == null || !context.isActive()) && create) { - lazyStartSessionContext(); - context = sessionContext.get(); - if (context == null) { - context = new SessionContext(); - context.setActive(true); - sessionContext.set(context); - } - } - return context; - } - - /** - * Gets application context. - * - * @return application context - */ - private ApplicationContext getApplicationContext() { - return applicationContext; - } - - /** - * Gets singleton context. - * - * @return singleton context - */ - private SingletonContext getSingletonContext() { - return singletonContext; - } - - /** - * Get current conversation ctx. - * - * @return conversation context - */ - private ConversationContext getConversationContext() { - return conversationContext.get(); - } - - private boolean isConversationSkipped(final HttpServletRequest servletRequest) { - final String queryString = servletRequest.getQueryString(); - return "none".equals(getFromQuery("conversationPropagation", queryString)) || "true".equals(getFromQuery("nocid", queryString)); - } - - private boolean isTimeout() { - final ThreadContext tc = ThreadContext.getThreadContext(); - return tc != null && tc.getCurrentOperation() == Operation.TIMEOUT; - } - - private Context lazyStartSessionContext() { - - if (logger.isDebugEnabled()) { - logger.debug(">lazyStartSessionContext"); - } - - final Context webContext = null; - final Context context = getCurrentContext(RequestScoped.class); - if (context instanceof ServletRequestContext) { - final ServletRequestContext requestContext = (ServletRequestContext) context; - final HttpServletRequest servletRequest = requestContext.getServletRequest(); - if (null != servletRequest) { // this could be null if there is no active request context - try { - final HttpSession currentSession = servletRequest.getSession(); - initSessionContext(currentSession); - - /* - final FailOverService failoverService = webBeansContext.getService(FailOverService.class); - if (failoverService != null && failoverService.isSupportFailOver()) { - failoverService.sessionIsInUse(currentSession); - } - */ - - if (logger.isDebugEnabled()) { - logger.debug("Lazy SESSION context initialization SUCCESS"); - } - } catch (final Exception e) { - logger.error(OWBLogConst.ERROR_0013, e); - } - - } else { - logger.warning("Could NOT lazily initialize session context because NO active request context"); - } - } else { - logger.warning("Could NOT lazily initialize session context because of " + context + " RequestContext"); - } - - if (logger.isDebugEnabled()) { - logger.debug("<lazyStartSessionContext " + webContext); - } - return webContext; - } - - public void setAutoConversationCheck(final boolean autoConversationCheck) { - this.autoConversationCheck = autoConversationCheck; - } - - private boolean supportsConversation() { - return conversationContext != null; - } - - public void updateSessionIdMapping(final String oldId, final String newId) { - sessionCtxManager.updateSessionIdMapping(oldId, newId); - } - - public State saveState() { - return new State(requestContext.get(), sessionContext.get(), conversationContext.get()); - } - - public State restoreState(final State state) { - final State old = saveState(); - requestContext.set(state.request); - sessionContext.set(state.session); - conversationContext.set(state.conversation); - return old; - } - - public String getHttpParameter(final String name) { - final ServletRequestContext req = getRequestContext(false); - if (req != null && req.getServletRequest() != null) { - return useGetParameter ? req.getServletRequest().getParameter(name) : getFromQuery(name, req.getServletRequest().getQueryString()); - } - return null; - } - - public static class State { - private final ServletRequestContext request; - private final SessionContext session; - private final ConversationContext conversation; - - public State(final ServletRequestContext request, final SessionContext session, final ConversationContext conversation) { - this.request = request; - this.session = session; - this.conversation = conversation; - } - } - - public static class HttpSessionContextSessionAware extends SessionContext { - private final HttpSession session; - - public HttpSessionContextSessionAware(final HttpSession session) { - this.session = session; - } - - public HttpSession getSession() { - return session; - } + super.destroyRequestContext(requestEvent); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java index 8dab787..429f7ac 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java @@ -41,14 +41,12 @@ import org.apache.webbeans.exception.WebBeansConfigurationException; import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl; import org.apache.webbeans.portable.events.generics.GProcessSessionBean; import org.apache.webbeans.proxy.NormalScopeProxyFactory; -import org.apache.webbeans.spi.ContextsService; import org.apache.webbeans.spi.ResourceInjectionService; import org.apache.webbeans.spi.SecurityService; import org.apache.webbeans.spi.TransactionService; import org.apache.webbeans.spi.plugins.AbstractOwbPlugin; import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin; import org.apache.webbeans.spi.plugins.OpenWebBeansJavaEEPlugin; -import org.apache.webbeans.spi.plugins.OpenWebBeansWebPlugin; import org.apache.webbeans.util.GenericsUtil; import org.apache.webbeans.util.WebBeansUtil; @@ -94,12 +92,11 @@ import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; -public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin, OpenWebBeansWebPlugin { +public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin { private Map<Class<?>, BeanContext> beans; private WebBeansContext webBeansContext; - private CdiAppContextsService contexsServices; private ClassLoader classLoader; private Map<Contextual<?>, Object> cacheProxies; @@ -113,10 +110,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl } } - @Override - public String currentSessionId() { - return CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)).currentSessionId(true); - } @Override public boolean isEEComponent(final Class<?> impl) { @@ -157,9 +150,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl } } - public CdiAppContextsService getContexsServices() { - return contexsServices; - } public void stop() throws OpenEJBException { final ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); @@ -171,7 +161,7 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl webBeansContext.getBeanManagerImpl().fireEvent(new BeforeShutdownImpl()); // Destroys context - this.contexsServices.destroy(null); + webBeansContext.getContextsService().destroy(null); // Free all plugin resources webBeansContext.getPluginLoader().shutDown(); http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java index 5747c50..4a05de7 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java @@ -29,10 +29,10 @@ import org.apache.webbeans.component.BuiltInOwbBean; import org.apache.webbeans.component.SimpleProducerFactory; import org.apache.webbeans.component.WebBeansType; import org.apache.webbeans.config.BeansDeployer; -import org.apache.webbeans.config.OpenWebBeansConfiguration; import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.config.WebBeansFinder; import org.apache.webbeans.container.BeanManagerImpl; +import org.apache.webbeans.el.ELContextStore; import org.apache.webbeans.intercept.InterceptorResolutionService; import org.apache.webbeans.portable.AbstractProducer; import org.apache.webbeans.portable.InjectionTargetImpl; @@ -48,10 +48,15 @@ import org.apache.webbeans.util.WebBeansConstants; import org.apache.webbeans.util.WebBeansUtil; import javax.el.ELResolver; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.ConversationScoped; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.context.SessionScoped; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Provider; +import javax.inject.Singleton; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletRequest; @@ -71,7 +76,6 @@ import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; /** * @version $Rev:$ $Date:$ @@ -288,12 +292,22 @@ public class OpenEJBLifecycle implements ContainerLifecycle { WebappBeanManager.class.cast(beanManager).beforeStop(); } - if (CdiAppContextsService.class.isInstance(contextsService)) { - CdiAppContextsService.class.cast(contextsService).beforeStop(endObject); + webBeansContext.getContextsService().endContext(RequestScoped.class, endObject); + webBeansContext.getContextsService().endContext(ConversationScoped.class, endObject); + webBeansContext.getContextsService().endContext(SessionScoped.class, endObject); + webBeansContext.getContextsService().endContext(ApplicationScoped.class, endObject); + webBeansContext.getContextsService().endContext(Singleton.class, endObject); + + // clean up the EL caches after each request + ELContextStore elStore = ELContextStore.getInstance(false); + if (elStore != null) + { + elStore.destroyELContextStore(); } + this.beanManager.fireEvent(new BeforeShutdownImpl(), true); - // Destroys context before BeforeShutdown event + // this will now even destroy the ExtensionBeans and other internal stuff this.contextsService.destroy(endObject); //Unbind BeanManager @@ -374,8 +388,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle { } public static ScheduledExecutorService initializeServletContext(final ServletContext servletContext, final WebBeansContext context) { - final String strDelay = context.getOpenWebBeansConfiguration().getProperty(OpenWebBeansConfiguration.CONVERSATION_PERIODIC_DELAY, "150000"); - final long delay = Long.parseLong(strDelay); final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() { @Override @@ -385,7 +397,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle { return t; } }); - executorService.scheduleWithFixedDelay(new ConversationCleaner(context), delay, delay, TimeUnit.MILLISECONDS); final ELAdaptor elAdaptor = context.getService(ELAdaptor.class); final ELResolver resolver = elAdaptor.getOwbELResolver(); @@ -393,13 +404,7 @@ public class OpenEJBLifecycle implements ContainerLifecycle { if (context.getOpenWebBeansConfiguration().isJspApplication()) { logger.debug("Application is configured as JSP. Adding EL Resolver."); - final JspFactory factory = JspFactory.getDefaultFactory(); - if (factory != null) { - final JspApplicationContext applicationCtx = factory.getJspApplicationContext(servletContext); - applicationCtx.addELResolver(resolver); - } else { - logger.debug("Default JspFactory instance was not found"); - } + setJspELFactory(servletContext, resolver); } // Add BeanManager to the 'javax.enterprise.inject.spi.BeanManager' servlet context attribute @@ -409,22 +414,37 @@ public class OpenEJBLifecycle implements ContainerLifecycle { } /** - * Conversation cleaner thread, that - * clears unused conversations. + * On Tomcat we need to sometimes force a class load to get our hands on the JspFactory */ - private static final class ConversationCleaner implements Runnable { - private final WebBeansContext webBeansContext; + private static void setJspELFactory(ServletContext startupObject, ELResolver resolver) + { + JspFactory factory = JspFactory.getDefaultFactory(); + if (factory == null) + { + try + { + Class.forName("org.apache.jasper.compiler.JspRuntimeContext"); + factory = JspFactory.getDefaultFactory(); + } + catch (Exception e) + { + // ignore + } - private ConversationCleaner(final WebBeansContext webBeansContext) { - this.webBeansContext = webBeansContext; } - public void run() { - webBeansContext.getConversationManager().destroyWithRespectToTimout(); - + if (factory != null) + { + JspApplicationContext applicationCtx = factory.getJspApplicationContext(startupObject); + applicationCtx.addELResolver(resolver); + } + else + { + logger.warning("Default JSPFactroy instance has not found. Skipping OWB JSP handling"); } } + /** * Returns servlet context otherwise throws exception. * http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java index ed48b9e..fef83b3 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java @@ -121,10 +121,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService { properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped", defaultNormalScopeHandlerClass); } - if (sessionContextClass() != null && tomee) { - properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.SessionScoped", "org.apache.tomee.catalina.cdi.SessionNormalScopeBeanHandler"); - } - if (SystemInstance.get().getOptions().get(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, false)) { properties.setProperty(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, "true"); } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java deleted file mode 100644 index fe97ef1..0000000 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.openejb.cdi; - -import org.apache.openejb.OpenEJBRuntimeException; -import org.apache.webbeans.context.SessionContext; -import org.apache.webbeans.web.context.SessionContextManager; - -import java.lang.reflect.Field; -import java.util.Map; - -public class UpdatableSessionContextManager extends SessionContextManager { - private static final Field scField; - - static { - try { - scField = SessionContextManager.class.getDeclaredField("sessionContexts"); - scField.setAccessible(true); - } catch (final NoSuchFieldException e) { - throw new OpenEJBRuntimeException("sessionContexts attribute of SessionContextManager not found, you probably use a not compatible version of OWB"); - } - } - - private final Map<String, SessionContext> contextById; - - public UpdatableSessionContextManager() { - try { - contextById = (Map<String, SessionContext>) scField.get(this); - } catch (final IllegalAccessException e) { - throw new OpenEJBRuntimeException("can't get session contexts", e); - } - } - - public Map<String, SessionContext> getContextById() { - return contextById; - } - - public void updateSessionIdMapping(final String oldId, final String newId) { - if (oldId == null) { - return; - } - - final SessionContext sc = getSessionContextWithSessionId(oldId); - if (sc == null) { - return; - } - - addNewSessionContext(newId, sc); - contextById.remove(oldId); - } -} http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java index 9616622..49d4468 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java @@ -1027,9 +1027,9 @@ public class ApplicationComposers { public void stopApplication() throws NamingException { if (appContext != null) { final ContextsService contextsService = appContext.getWebBeansContext().getContextsService(); + // No need to stop the ConversationContext manually as it gets stored inside the SessionContext as Bean contextsService.endContext(SessionScoped.class, session); contextsService.endContext(RequestScoped.class, null); - contextsService.endContext(ConversationScoped.class, null); } if (appInfo != null) { http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java index 41ba092..08f6b05 100644 --- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java +++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java @@ -18,12 +18,11 @@ package org.apache.openejb.cdi; import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; public class CdiAppContextsServiceTest { @Test public void cid() { +/*X TODO refactor this over to any cId test in OWB assertNull(CdiAppContextsService.getFromQuery("cid", null)); assertNull(CdiAppContextsService.getFromQuery("cid", "")); assertNull(CdiAppContextsService.getFromQuery("cid", "superparam=cejdzl&cfdlcjlzdbc=czlbcjb&cdlzcs&cdlcjkd")); @@ -32,5 +31,6 @@ public class CdiAppContextsServiceTest { assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10")); assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln")); assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln")); +*/ } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java index c9a4476..c005681 100644 --- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java +++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java @@ -75,8 +75,8 @@ public class StatefulConversationScopedTOMEE1138Test { } @Override - public String getConversationSessionId() { - return "session-test"; + public String generateConversationId() { + return "cid_1"; } }); webBeansContext.getService(ContextsService.class).startContext(ConversationScoped.class, null); http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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 36e83aa..acd4208 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 @@ -22,18 +22,13 @@ import org.apache.openejb.cdi.ThreadSingletonServiceImpl; import org.apache.openejb.cdi.WebappWebBeansContext; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; -import org.apache.webbeans.annotation.DestroyedLiteral; import org.apache.webbeans.config.OWBLogConst; import org.apache.webbeans.config.WebBeansContext; -import org.apache.webbeans.context.ConversationContext; -import org.apache.webbeans.conversation.ConversationManager; import org.apache.webbeans.el.ELContextStore; import org.apache.webbeans.spi.ContextsService; import org.apache.webbeans.spi.FailOverService; import org.apache.webbeans.util.WebBeansUtil; -import java.util.Map; -import javax.enterprise.context.Conversation; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.servlet.ServletContextEvent; @@ -188,26 +183,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId()); } - // ensure session ThreadLocal is set - webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession()); - - if (WebappWebBeansContext.class.isInstance(webBeansContext)) { // end after child - WebappWebBeansContext.class.cast(webBeansContext).getParent().getContextsService().endContext(SessionScoped.class, event.getSession()); - } - - final CdiAppContextsService appContextsService = CdiAppContextsService.class.cast(webBeansContext.getContextsService()); - if (appContextsService.getRequestContext(false) != null) { - final String id = event.getSession().getId(); // capture it eagerly! - appContextsService.pushRequestReleasable(new Runnable() { - @Override - public void run() { - doDestroyConversations(id); - } - }); - } else { - doDestroyConversations(event.getSession().getId()); - } - webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession()); WebBeansListenerHelper.destroyFakedRequest(this); @@ -240,14 +215,4 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq WebBeansListenerHelper.destroyFakedRequest(this); } - private void doDestroyConversations(final String id) { - final ConversationManager conversationManager = webBeansContext.getConversationManager(); - final Map<Conversation, ConversationContext> cc = conversationManager.getAndRemoveConversationMapWithSessionId(id); - for (final Map.Entry<Conversation, ConversationContext> c : cc.entrySet()) { - if (c != null) { - c.getValue().destroy(); - webBeansContext.getBeanManagerImpl().fireEvent(c.getKey().getId(), DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED); - } - } - } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java index 65d15e1..de5841f 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java @@ -19,7 +19,6 @@ package org.apache.openejb.server.httpd; import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.spi.ContextsService; -import org.apache.webbeans.spi.FailOverService; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -36,8 +35,6 @@ import javax.servlet.http.HttpSessionListener; */ public class EndWebBeansListener implements ServletContextListener, ServletRequestListener, HttpSessionListener, HttpSessionActivationListener { - protected FailOverService failoverService; - /** * Manages the container lifecycle */ @@ -52,7 +49,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque public EndWebBeansListener(WebBeansContext webBeansContext) { this.webBeansContext = webBeansContext; if (webBeansContext != null) { - this.failoverService = this.webBeansContext.getService(FailOverService.class); this.contextsService = CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)); } else { this.contextsService = null; @@ -72,9 +68,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque */ @Override public void requestInitialized(ServletRequestEvent event) { - if (contextsService != null && contextsService.isAutoConversationCheck()) { - contextsService.checkConversationState(); - } } /** @@ -99,9 +92,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque return; } - if (failoverService != null && failoverService.isSupportPassivation()) { - failoverService.sessionWillPassivate(event.getSession()); - } WebBeansListenerHelper.destroyFakedRequest(this); } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java index 7cbaa0b..ae80d63 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java @@ -35,7 +35,6 @@ import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache.openejb.AppContext; import org.apache.openejb.assembler.classic.WebAppBuilder; -import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.openejb.cdi.Proxys; import org.apache.openejb.core.ParentClassLoaderFinder; import org.apache.openejb.core.WebContext; @@ -43,8 +42,7 @@ import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.AppFinder; import org.apache.openejb.web.LightweightWebAppBuilder; -import org.apache.webbeans.config.WebBeansContext; -import org.apache.webbeans.spi.ContextsService; + /** * @version $Revision$ $Date$ @@ -184,10 +182,6 @@ public class HttpListenerRegistry implements HttpListener { for (final Map.Entry<String, HttpListener> entry : listeners.entrySet()) { final String pattern = entry.getKey(); if (path.matches(pattern) || path.equals(pattern)) { - final WebBeansContext wbc = WebBeansContext.class.cast(request.getAttribute("openejb_owb_context")); - if (wbc != null) { - CdiAppContextsService.class.cast(wbc.getService(ContextsService.class)).checkConversationState(); - } if (pattern.contains("/.*\\.") && HttpRequestImpl.class.isInstance(request)) { // TODO: enhance it, basically servlet *.xxx HttpRequestImpl.class.cast(request).noPathInfo(); } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java index 3751ef0..6006178 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java @@ -104,6 +104,9 @@ public class HttpRequestImpl implements HttpRequest { return; } es.shutdownNow(); + for (RequestSession requestSession : SESSIONS.values()) { + requestSession.session.invalidate(); + } SESSIONS.clear(); } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java ---------------------------------------------------------------------- diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java index db0578c..979e676 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java @@ -22,6 +22,9 @@ import javax.enterprise.context.RequestScoped; import javax.enterprise.context.spi.Context; import javax.servlet.ServletRequestListener; +/** + * @deprecated this features is imo highly questionable. We should rather fix the root of the issue + */ public final class WebBeansListenerHelper { private static final ThreadLocal<Boolean> FAKE_REQUEST = new ThreadLocal<Boolean>(); http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java index d7bdbe6..753b021 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java @@ -35,7 +35,6 @@ import org.apache.openejb.assembler.classic.ResourceInfo; import org.apache.openejb.assembler.classic.ServletInfo; import org.apache.openejb.assembler.classic.WebAppBuilder; import org.apache.openejb.assembler.classic.WebAppInfo; -import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.config.NewLoaderLogic; import org.apache.openejb.config.ServiceUtils; @@ -60,16 +59,9 @@ import org.apache.tomee.common.NamingUtil; import org.apache.tomee.common.ResourceFactory; import org.apache.tomee.jasper.TomEEJasperInitializer; import org.apache.tomee.loader.TomcatHelper; -import org.apache.webbeans.config.WebBeansContext; import org.apache.xbean.finder.IAnnotationFinder; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; import javax.servlet.ServletContainerInitializer; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.ws.rs.core.Application; import java.io.ByteArrayInputStream; @@ -373,16 +365,6 @@ public class OpenEJBContextConfig extends ContextConfig { webXml.addFilterMapping(mapping); } - { - final FilterDef filter = new FilterDef(); - filter.setAsyncSupported("true"); - filter.setDescription("CDI Conversation Filter"); - filter.setDisplayName("CDI Conversation Filter"); - filter.setFilterName("CDI Conversation Filter"); - filter.setFilterClass(ConversationFilter.class.getName()); - webXml.addFilter(filter); - } - return webXml; } @@ -717,31 +699,4 @@ public class OpenEJBContextConfig extends ContextConfig { return false; } - public static class ConversationFilter implements Filter { - private WebBeansContext wbc; - private CdiAppContextsService contextsService; - - @Override - public void init(final FilterConfig filterConfig) throws ServletException { - try { - wbc = WebBeansContext.currentInstance(); - contextsService = CdiAppContextsService.class.cast(wbc.getContextsService()); - } catch (final Exception e) { - // no-op - } - } - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { - if (contextsService != null) { - contextsService.checkConversationState(); - } - chain.doFilter(request, response); - } - - @Override - public void destroy() { - // no-op - } - } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/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..f842923 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 @@ -18,11 +18,8 @@ package org.apache.tomee.catalina; import org.apache.catalina.ContainerEvent; import org.apache.catalina.ContainerListener; -import org.apache.catalina.Context; import org.apache.catalina.core.StandardContext; -import org.apache.openejb.cdi.CdiAppContextsService; -import org.apache.webbeans.config.WebBeansContext; -import org.apache.webbeans.spi.ContextsService; + public class TomEEContainerListener implements ContainerListener { private static final ThreadLocal<StandardContext> context = new ThreadLocal<StandardContext>(); @@ -33,14 +30,6 @@ 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())) { - final String[] ids = (String[]) event.getData(); - - final WebBeansContext wbc = WebBeansContext.currentInstance(); - final ContextsService cs = wbc.getContextsService(); - if (CdiAppContextsService.class.isInstance(cs) && ids.length > 0) { - ((CdiAppContextsService) cs).updateSessionIdMapping(ids[0], ids[1]); - } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java index 1f9c81a..24a31e0 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java @@ -78,7 +78,6 @@ import org.apache.openejb.assembler.classic.ServletInfo; import org.apache.openejb.assembler.classic.WebAppBuilder; import org.apache.openejb.assembler.classic.WebAppInfo; import org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated; -import org.apache.openejb.cdi.CdiAppContextsService; import org.apache.openejb.cdi.CdiBuilder; import org.apache.openejb.cdi.OpenEJBLifecycle; import org.apache.openejb.cdi.Proxys; @@ -128,6 +127,7 @@ import org.apache.tomee.common.NamingUtil; import org.apache.tomee.common.UserTransactionFactory; import org.apache.tomee.loader.TomcatHelper; import org.apache.webbeans.config.WebBeansContext; +import org.apache.webbeans.spi.ContextsService; import org.apache.webbeans.spi.adaptor.ELAdaptor; import org.omg.CORBA.ORB; @@ -1071,9 +1071,9 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare } for (final FilterMap map : standardContext.findFilterMaps()) { if ("CDI Conversation Filter".equals(map.getFilterName()) && webContext.getWebBeansContext() != null) { - final CdiAppContextsService cdiAppContextsService = CdiAppContextsService.class.cast(webContext.getWebBeansContext().getContextsService()); - if (cdiAppContextsService != null) { - cdiAppContextsService.setAutoConversationCheck(false); + ContextsService contextsService = webContext.getWebBeansContext().getContextsService(); + if (contextsService != null) { + contextsService.setSupportConversations(false); } break; } http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java deleted file mode 100644 index 585a011..0000000 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.tomee.catalina.cdi; - -import org.apache.catalina.session.StandardSession; -import org.apache.catalina.session.StandardSessionFacade; -import org.apache.openejb.cdi.CdiAppContextsService; -import org.apache.openejb.loader.SystemInstance; -import org.apache.openejb.util.reflection.Reflections; -import org.apache.webbeans.context.creational.BeanInstanceBag; -import org.apache.webbeans.util.WebBeansUtil; - -import javax.enterprise.context.spi.Contextual; -import javax.servlet.http.HttpSession; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -public class SessionContextBackedByHttpSession extends CdiAppContextsService.HttpSessionContextSessionAware { - private static final String WRAPPER = SystemInstance.get().getProperty("tomee.session-context.wrapper", "direct"); - - public SessionContextBackedByHttpSession(final HttpSession session) { - super(session); - setComponentSessionInstanceMap(); // override default map (set in super()) - } - - @SuppressWarnings("unchecked") - public void setComponentSessionInstanceMap() { - HttpSession session = getSession(); - if (session == null) { - super.setComponentInstanceMap(); - return; - } - - if (session instanceof StandardSessionFacade) { - try { - session = (HttpSession) Reflections.get(session, "session"); - } catch (final Exception e) { - // no-op - } - } - - if (StandardSession.class.equals(session.getClass())) { // local session, use fastest wrapper - try { - final ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes"); - if (WRAPPER.equals("direct")) { - componentInstanceMap = new DirectSessionMap(map); - } else { - componentInstanceMap = new HttpSessionMap(session); - } - } catch (final Exception e) { - componentInstanceMap = new HttpSessionMap(session); - } - } else { - componentInstanceMap = new HttpSessionMap(session); - } - } - - public static String key(final Object key) { - if (key instanceof String) { // avoid nested calls - return (String) key; - } - - final String id = WebBeansUtil.getPassivationId((Contextual<?>) key); - if (id != null) { - return id; - } - return key.toString(); // shouldn't occur - } - - private static class DirectSessionMap implements ConcurrentMap<Contextual<?>, BeanInstanceBag<?>> { - private final ConcurrentHashMap<String, Object> delegate; - - public DirectSessionMap(final ConcurrentHashMap<String, Object> map) { - delegate = map; - } - - @Override - public int size() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isEmpty() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean containsValue(final Object value) { - throw new UnsupportedOperationException(); - } - - @Override - public Set<Contextual<?>> keySet() { - throw new UnsupportedOperationException(); - } - - @Override - public Collection<BeanInstanceBag<?>> values() { - throw new UnsupportedOperationException(); - } - - @Override - public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() { - return Collections.emptySet(); - } - - @Override - public boolean containsKey(final Object key) { - return delegate.containsKey(key(key)); - } - - @Override - public BeanInstanceBag<?> get(final Object key) { - return (BeanInstanceBag<?>) delegate.get(key(key)); - } - - @Override - public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) { - return (BeanInstanceBag<?>) delegate.put(key(key), value); - } - - @Override - public BeanInstanceBag<?> remove(final Object key) { - return (BeanInstanceBag<?>) delegate.remove(key(key)); - } - - @Override - public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) { - for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) { - put(e.getKey(), e.getValue()); - } - } - - @Override - public void clear() { - final Iterator<String> it = delegate.keySet().iterator(); - while (it.hasNext()) { - if (delegate.get(it.next()) instanceof BeanInstanceBag) { - it.remove(); - } - } - } - - @Override - public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) { - return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value); - } - - @Override - public boolean remove(final Object key, final Object value) { - return delegate.remove(key(key), value); - } - - @Override - public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) { - return delegate.replace(key(key), oldValue, newValue); - } - - @Override - public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) { - return (BeanInstanceBag<?>) delegate.replace(key(key), value); - } - } - - private static class HttpSessionMap implements ConcurrentMap<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work - private final HttpSession session; - - public HttpSessionMap(final HttpSession session) { - this.session = session; - } - - @Override - public int size() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isEmpty() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean containsKey(final Object key) { - return session.getAttribute(key(key)) != null; - } - - @Override - public boolean containsValue(final Object value) { - throw new UnsupportedOperationException(); - } - - @Override - public Set<Contextual<?>> keySet() { - throw new UnsupportedOperationException(); - } - - @Override - public Collection<BeanInstanceBag<?>> values() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) { - throw new UnsupportedOperationException(); - } - - @Override - public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) { - throw new UnsupportedOperationException(); - } - - @Override - public void clear() { - // no-op - } - - @Override - public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() { - return Collections.emptySet(); - } - - @Override - public BeanInstanceBag<?> get(final Object key) { - return (BeanInstanceBag<?>) session.getAttribute(key(key)); - } - - @Override - public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) { - final BeanInstanceBag<?> bag = get(key); - session.setAttribute(key(key), value); - return bag; - } - - @Override - public BeanInstanceBag<?> remove(final Object key) { - final BeanInstanceBag<?> bag = get(key); - session.removeAttribute(key(key)); - return bag; - } - - @Override - public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) { - for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) { - put(e.getKey(), e.getValue()); - } - } - - @Override - public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) { - final String k = key(key); - final BeanInstanceBag<?> beanInstanceBag = get(k); - if (beanInstanceBag == null) { - return put(key, value); - } - return beanInstanceBag; - } - - @Override - public boolean remove(final Object key, final Object value) { - remove(key(key)); - return true; - } - - @Override - public String toString() { - return "HttpSessionMap{session=" + session + '}'; - } - } - -} http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java deleted file mode 100644 index 71b2c2a..0000000 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.tomee.catalina.cdi; - -import org.apache.openejb.cdi.CdiAppContextsService; -import org.apache.tomee.catalina.TomEERuntimeException; -import org.apache.webbeans.context.creational.BeanInstanceBag; -import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler; - -import javax.enterprise.context.SessionScoped; -import javax.enterprise.context.spi.Context; -import javax.enterprise.inject.spi.Bean; -import javax.enterprise.inject.spi.BeanManager; -import javax.servlet.http.HttpSession; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - -public class SessionNormalScopeBeanHandler extends NormalScopedBeanInterceptorHandler { - private static final Field BAG_INSTANCE; - static { - try { - BAG_INSTANCE = BeanInstanceBag.class.getDeclaredField("beanInstance"); - BAG_INSTANCE.setAccessible(true); - } catch (final NoSuchFieldException e) { - throw new TomEERuntimeException(e); - } - } - - private static final ThreadLocal<Map<Bean<?>, UpdateInfo>> OBJECTS = new ThreadLocal<Map<Bean<?>, UpdateInfo>>() { - @Override - protected Map<Bean<?>, UpdateInfo> initialValue() { - CdiAppContextsService.pushRequestReleasable(new Runnable() { // update in batch - @Override - public void run() { - final Map<Bean<?>, UpdateInfo> values = OBJECTS.get(); - for (final UpdateInfo o : values.values()) { - o.updateBean(); - } - values.clear(); - OBJECTS.remove(); - } - }); - return new HashMap<Bean<?>, UpdateInfo>(); - } - }; - - public SessionNormalScopeBeanHandler(final BeanManager beanManager, final Bean<?> bean) { - super(beanManager, bean); - } - - @Override - public Object get() { - final Object webbeansInstance = getContextualInstance(); - final Map<Bean<?>, UpdateInfo> beanUpdateInfoMap = OBJECTS.get(); - - if (!beanUpdateInfoMap.containsKey(bean)) { - beanUpdateInfoMap.put(bean, new UpdateInfo(bean, getBeanManager(), webbeansInstance)); - } - - return webbeansInstance; - } - - protected static class UpdateInfo { - private Bean<?> bean; - private BeanManager bm; - private Object value; - - protected UpdateInfo(final Bean<?> bean, final BeanManager bm, final Object value) { - this.bean = bean; - this.bm = bm; - this.value = value; - } - - @SuppressWarnings("unchecked") - protected void updateBean() { - final HttpSession session = session(); - if (session == null) { - return; - } - - // go through all listeners to be able to be replicated or do any processing which can be done - final String key = SessionContextBackedByHttpSession.key(bean); - final BeanInstanceBag<Object> bag = BeanInstanceBag.class.cast(session.getAttribute(key)); - if (bag != null) { - try { - BAG_INSTANCE.set(bag, value); - } catch (final IllegalAccessException e) { - throw new TomEERuntimeException(e); - } - session.setAttribute(key, bag); - } - } - - private HttpSession session() { - final Context context = bm.getContext(SessionScoped.class); - if (!SessionContextBackedByHttpSession.class.isInstance(context)) { - return null; - } - return SessionContextBackedByHttpSession.class.cast(context).getSession(); - } - } -}
