You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2015/04/25 07:45:14 UTC

svn commit: r1675996 - in /openwebbeans/trunk: ./ webbeans-clustering/ webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/ webbeans-web/src/main/java/org/apache/webbeans/servlet/ webbeans-web/src/main/java/org/apache/webbeans/web/context/

Author: struberg
Date: Sat Apr 25 05:45:14 2015
New Revision: 1675996

URL: http://svn.apache.org/r1675996
Log:
OWB-1048 OWB-1049 store @SessionScoped beans in real Http Session. 

And also remove the clustering module as we don't need it anymore.
The clustering is now fully a concern of the web container and not of OWB anymore.

Removed:
    openwebbeans/trunk/webbeans-clustering/
Modified:
    openwebbeans/trunk/pom.xml
    openwebbeans/trunk/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatContainerListener.java
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java

Modified: openwebbeans/trunk/pom.xml
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/pom.xml?rev=1675996&r1=1675995&r2=1675996&view=diff
==============================================================================
--- openwebbeans/trunk/pom.xml (original)
+++ openwebbeans/trunk/pom.xml Sat Apr 25 05:45:14 2015
@@ -490,7 +490,6 @@
         <module>webbeans-jms</module>       
         <module>webbeans-jsf</module>
         <module>webbeans-jsf12</module>
-        <module>webbeans-clustering</module>
         <module>webbeans-el10</module>
         <module>webbeans-el22</module>		
         <module>webbeans-resource</module>

Modified: openwebbeans/trunk/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatContainerListener.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatContainerListener.java?rev=1675996&r1=1675995&r2=1675996&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatContainerListener.java (original)
+++ openwebbeans/trunk/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatContainerListener.java Sat Apr 25 05:45:14 2015
@@ -20,19 +20,13 @@ package org.apache.webbeans.web.tomcat7;
 
 import org.apache.catalina.ContainerEvent;
 import org.apache.catalina.ContainerListener;
-import org.apache.catalina.Context;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.web.context.SessionContextManager;
-import org.apache.webbeans.web.context.WebContextsService;
 
 /**
  * Container listener that propagates the change of a session id (e. g. during an authentication through the container)
  * to the session context manager. Otherwise a new session context for the same session is created, because the session
  * id is used to identify the session context. <br/> Adapted from OpenEJB tomee/tomee-catalina and updated.
  *
- * @version $Rev$ $Date$
+ * @deprecated we do not use the sessionId anymore since owb-1.5.1, so we do not need any sessionId change listener
  */
 public class TomcatContainerListener implements ContainerListener
 {
@@ -40,29 +34,7 @@ public class TomcatContainerListener imp
     @Override
     public void containerEvent(ContainerEvent containerEvent)
     {
-        if (Context.CHANGE_SESSION_ID_EVENT.equals(containerEvent.getType())
-                && (containerEvent.getData() instanceof String[]))
-        {
-            String[] ids = (String[]) containerEvent.getData();
-
-            if (ids.length >= 2)
-            {
-                WebBeansContext webBeansContext = WebBeansContext.currentInstance();
-                ContextsService contextsService = webBeansContext.getContextsService();
-
-                if (contextsService instanceof WebContextsService)
-                {
-                    WebContextsService webContextsService = (WebContextsService) contextsService;
-                    SessionContextManager sessionContextManager = webContextsService.getSessionContextManager();
-
-                    SessionContext sessionContext = sessionContextManager.getSessionContextWithSessionId(ids[0]);
-                    if (sessionContext != null)
-                    {
-                        sessionContextManager.removeSessionContextWithSessionId(ids[0]);
-                        sessionContextManager.addNewSessionContext(ids[1], sessionContext);
-                    }
-                }
-            }
-        }
+        // nothing to do anymore.
+        // we do not use the sessionId anymore since owb-1.5.1
     }
 }

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java?rev=1675996&r1=1675995&r2=1675996&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java Sat Apr 25 05:45:14 2015
@@ -23,7 +23,6 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.ContainerLifecycle;
-import org.apache.webbeans.spi.FailOverService;
 import org.apache.webbeans.util.WebBeansUtil;
 import org.apache.webbeans.web.context.WebContextsService;
 import org.apache.webbeans.web.util.ServletCompatibilityUtil;
@@ -61,7 +60,6 @@ public class WebBeansConfigurationListen
     /**Manages the container lifecycle*/
     protected ContainerLifecycle lifeCycle = null;
 
-    protected FailOverService failoverService = null;
     private WebBeansContext webBeansContext;
 
     /**
@@ -70,7 +68,6 @@ public class WebBeansConfigurationListen
     public WebBeansConfigurationListener()
     {
         webBeansContext = WebBeansContext.getInstance();
-        failoverService = webBeansContext.getService(FailOverService.class);
     }
 
     /**

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java?rev=1675996&r1=1675995&r2=1675996&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java Sat Apr 25 05:45:14 2015
@@ -31,6 +31,7 @@ import org.apache.webbeans.util.Asserts;
  * </p>
  * @version $Rev$ $Date$
  *
+ * @deprecated This is NOT being used anymore by OWB! We just keep it for binary backward compat with TomEE! We can remove it once TomEE switches to real sessions.
  */
 public class SessionContextManager
 {

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java?rev=1675996&r1=1675995&r2=1675996&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java Sat Apr 25 05:45:14 2015
@@ -33,8 +33,6 @@ import org.apache.webbeans.conversation.
 import org.apache.webbeans.conversation.ConversationManager;
 import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
-import org.apache.webbeans.spi.FailOverService;
-import org.apache.webbeans.util.WebBeansUtil;
 import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -51,10 +49,8 @@ import javax.servlet.ServletRequestEvent
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.lang.annotation.Annotation;
-import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -67,6 +63,8 @@ public class WebContextsService extends
     /**Logger instance*/
     private static final Logger logger = WebBeansLoggerFacade.getLogger(WebContextsService.class);
 
+    private static final String OWB_SESSION_CONTEXT_ATTRIBUTE = "OPENWEBBEANS_SESSION_CONTEXT";
+
     /**Current request context*/
     private static ThreadLocal<RequestContext> requestContexts = null;
 
@@ -74,7 +72,7 @@ public class WebContextsService extends
     private static ThreadLocal<SessionContext> sessionContexts = null;
 
     /**
-     * This applicationContext will be used for all non servlet-request threads
+     * A single applicationContext
      */
     private ApplicationContext sharedApplicationContext ;
 
@@ -86,24 +84,11 @@ public class WebContextsService extends
     /**Current dependent context*/
     private static DependentContext dependentContext;
 
-    /**Current application contexts*/
-    private static Map<ServletContext, ApplicationContext> currentApplicationContexts = new ConcurrentHashMap<ServletContext, ApplicationContext>();
-    
-    /**Current singleton contexts*/
-    private static Map<ServletContext, SingletonContext> currentSingletonContexts = new ConcurrentHashMap<ServletContext, SingletonContext>();
-
-    private static Map<ClassLoader, ServletContext> classLoaderToServletContextMapping = new ConcurrentHashMap<ClassLoader, ServletContext>();
-
-    /**Session context manager*/
-    private final SessionContextManager sessionCtxManager = new SessionContextManager();
-
     /**Conversation context manager*/
     private final ConversationManager conversationManager;
 
     private boolean supportsConversation = false;
     
-    protected FailOverService failoverService = null;
-
     private WebBeansContext webBeansContext;
 
     /**Initialize thread locals*/
@@ -136,18 +121,12 @@ public class WebContextsService extends
     {
         this.webBeansContext = webBeansContext;
         supportsConversation =  webBeansContext.getOpenWebBeansConfiguration().supportsConversation();
-        failoverService = webBeansContext.getService(FailOverService.class);
         conversationManager = webBeansContext.getConversationManager();
 
         sharedApplicationContext = new ApplicationContext();
         sharedApplicationContext.setActive(true);
     }
 
-    public SessionContextManager getSessionContextManager()
-    {
-        return sessionCtxManager;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -180,11 +159,6 @@ public class WebContextsService extends
             sharedSingletonContext.destroy();
         }
 
-        //Clear saved contexts related with 
-        //this servlet context
-        currentApplicationContexts.clear();
-        currentSingletonContexts.clear();
-        
         //Thread local values to null
         requestContexts.set(null);
         sessionContexts.set(null);
@@ -252,13 +226,7 @@ public class WebContextsService extends
         }
         else if(scopeType.equals(ApplicationScoped.class))
         {
-            ServletContext servletContext = classLoaderToServletContextMapping.get(WebBeansUtil.getCurrentClassLoader());
-
-            if (servletContext == null)
-            {
-                return null;
-            }
-            return currentApplicationContexts.get(servletContext);
+            return sharedApplicationContext;
         }
         else if(supportsConversation && scopeType.equals(ConversationScoped.class))
         {
@@ -270,13 +238,7 @@ public class WebContextsService extends
         }
         else if (scopeType.equals(Singleton.class))
         {
-            ServletContext servletContext = classLoaderToServletContextMapping.get(WebBeansUtil.getCurrentClassLoader());
-
-            if (servletContext == null)
-            {
-                return null;
-            }
-            return currentSingletonContexts.get(servletContext);
+            return sharedSingletonContext;
         }
 
         return null;
@@ -359,12 +321,6 @@ public class WebContextsService extends
                 {
                     initSessionContext(session);    
                 }
-                            
-                //Init thread local application context
-                initApplicationContext(event.getServletContext());
-                
-                //Init thread local singleton context
-                initSingletonContext(event.getServletContext());
 
                 initConversationContext(request);
 
@@ -373,11 +329,6 @@ public class WebContextsService extends
         }
         else
         {
-            //Init thread local application context
-            initApplicationContext(null);
-
-            //Init thread local singleton context
-            initSingletonContext(null);
             webBeansContext.getBeanManagerImpl().fireEvent(new Object(), InitializedLiteral.INSTANCE_REQUEST_SCOPED);
         }
     }
@@ -411,15 +362,18 @@ public class WebContextsService extends
             elStore.destroyELContextStore();
         }
 
+        Object payload = requestEvent != null && requestEvent.getServletRequest() != null ? requestEvent.getServletRequest() : new Object();
+        webBeansContext.getBeanManagerImpl().fireEvent(payload, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
+
         //Clear thread locals
+        conversationContexts.set(null);
+        conversationContexts.remove();
+        sessionContexts.set(null);
+        sessionContexts.remove();
         requestContexts.set(null);
         requestContexts.remove();
 
         RequestScopedBeanInterceptorHandler.removeThreadLocals();
-
-        Object payload = requestEvent != null && requestEvent.getServletRequest() != null ? requestEvent.getServletRequest() : new Object();
-
-        webBeansContext.getBeanManagerImpl().fireEvent(payload, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
     }
 
     private void cleanupConversations()
@@ -458,7 +412,8 @@ public class WebContextsService extends
     }
 
     /**
-     * Creates the session context at the session start. 
+     * Creates the session context at the session start.
+     * Or assign a
      * @param session http session object
      */
     private void initSessionContext(HttpSession session)
@@ -475,22 +430,30 @@ public class WebContextsService extends
         }
         else
         {
-            String sessionId = session.getId();
+            // we need to get it latest here to make sure we work on the same instance
+            currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE);
 
-            //Current context
-            currentSessionContext = sessionCtxManager.getSessionContextWithSessionId(sessionId);
-
-            //No current context
             if (currentSessionContext == null)
             {
-                currentSessionContext = new SessionContext();
-                sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext);
-                webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
+                // no current context, so lets create a new one
+                synchronized (OWB_SESSION_CONTEXT_ATTRIBUTE)
+                {
+                    currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE);
+                    if (currentSessionContext == null)
+                    {
+                        currentSessionContext = new SessionContext();
+                        //Activate
+                        currentSessionContext.setActive(true);
+                        webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
+                    }
+                }
             }
+
+            // we do that in any case.
+            // This is needed to trigger delta-replication on most servers
+            session.setAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE, currentSessionContext);
         }
 
-        //Activate
-        currentSessionContext.setActive(true);
 
         //Set thread local
         sessionContexts.set(currentSessionContext);
@@ -513,9 +476,6 @@ public class WebContextsService extends
                 initSessionContext(session);
                 context = sessionContexts.get();
             }
-
-            //Remove session from manager
-            sessionCtxManager.removeSessionContextWithSessionId(session.getId());
         }
 
         //Destroy context
@@ -537,12 +497,7 @@ public class WebContextsService extends
      */
     private void initApplicationContext(ServletContext servletContext)
     {
-        if (servletContext != null && currentApplicationContexts.containsKey(servletContext))
-        {
-            return;
-        }
-
-        if (sharedApplicationContext != null && servletContext == null)
+        if (sharedApplicationContext != null)
         {
             return;
         }
@@ -550,23 +505,11 @@ public class WebContextsService extends
         ApplicationContext newApplicationContext = new ApplicationContext();
         newApplicationContext.setActive(true);
 
-        if (servletContext != null)
-        {
-            currentApplicationContexts.put(servletContext, newApplicationContext);
-
-            ClassLoader currentClassLoader = WebBeansUtil.getCurrentClassLoader();
-            if (!classLoaderToServletContextMapping.containsKey(currentClassLoader))
-            {
-                classLoaderToServletContextMapping.put(currentClassLoader, servletContext);
-            }
-        }
-
         if (sharedApplicationContext == null)
         {
             sharedApplicationContext = newApplicationContext;
+            webBeansContext.getBeanManagerImpl().fireEvent(servletContext != null ? servletContext : new Object(), InitializedLiteral.INSTANCE_APPLICATION_SCOPED);
         }
-
-        webBeansContext.getBeanManagerImpl().fireEvent(servletContext != null ? servletContext : new Object(), InitializedLiteral.INSTANCE_APPLICATION_SCOPED);
     }
 
     /**
@@ -578,74 +521,18 @@ public class WebContextsService extends
     {
         //look for thread local
         //this can be set by initRequestContext
-        ApplicationContext context = null;
-        
-        //Looking the context from saved context
-        //This is used in real web applications
-        if(servletContext != null)
-        {
-            context = currentApplicationContexts.get(servletContext);   
-        }
-        
-        //using in tests
-        if(context == null)
-        {
-            context = this.sharedApplicationContext;
-        }
-        
+        ApplicationContext context = sharedApplicationContext;
+        sharedSingletonContext = null;
+
         //Destroy context
         if(context != null)
         {
             context.destroy();
         }
-        
-        //Remove from saved contexts
-        if(servletContext != null)
-        {
-            currentApplicationContexts.remove(servletContext);   
-        }
-        
-        //destroyDependents all sessions
-        Collection<SessionContext> allSessionContexts = sessionCtxManager.getAllSessionContexts().values();
-        if (allSessionContexts != null && allSessionContexts.size() > 0)
-        {
-            for (SessionContext sessionContext : allSessionContexts)
-            {
-                sessionContexts.set(sessionContext);
-                
-                sessionContext.destroy();
-
-                sessionContexts.set(null);
-                sessionContexts.remove();
-            }
-
-            //Clear map
-            allSessionContexts.clear();
-        }
-        
-        //destroyDependents all conversations
-        Collection<ConversationContext> allConversationContexts = conversationManager.getAllConversationContexts().values();
-        if (allConversationContexts != null && allConversationContexts.size() > 0)
-        {
-            for (ConversationContext conversationContext : allConversationContexts) 
-            {
-                conversationContexts.set(conversationContext);
-                
-                conversationContext.destroy();
-
-                conversationContexts.set(null);
-                conversationContexts.remove();
-            }
-
-            //Clear conversations
-            allConversationContexts.clear();
-        }
 
         // this is needed to get rid of ApplicationScoped beans which are cached inside the proxies...
         webBeansContext.getBeanManagerImpl().clearCacheProxies();
 
-        classLoaderToServletContextMapping.remove(WebBeansUtil.getCurrentClassLoader());
-
         webBeansContext.getBeanManagerImpl().fireEvent(servletContext != null ? servletContext : new Object(), DestroyedLiteral.INSTANCE_APPLICATION_SCOPED);
     }
     
@@ -655,12 +542,7 @@ public class WebContextsService extends
      */
     private void initSingletonContext(ServletContext servletContext)
     {
-        if (servletContext != null && currentSingletonContexts.containsKey(servletContext))
-        {
-            return;
-        }
-
-        if (currentSingletonContexts != null && servletContext == null)
+        if (sharedSingletonContext != null)
         {
             return;
         }
@@ -668,17 +550,6 @@ public class WebContextsService extends
         SingletonContext newSingletonContext = new SingletonContext();
         newSingletonContext.setActive(true);
 
-        if (servletContext != null)
-        {
-            currentSingletonContexts.put(servletContext, newSingletonContext);
-
-            ClassLoader currentClassLoader = WebBeansUtil.getCurrentClassLoader();
-            if (!classLoaderToServletContextMapping.containsKey(currentClassLoader))
-            {
-                classLoaderToServletContextMapping.put(currentClassLoader, servletContext);
-            }
-        }
-
         if (sharedSingletonContext == null)
         {
             sharedSingletonContext = newSingletonContext;
@@ -693,35 +564,13 @@ public class WebContextsService extends
      */
     private void destroySingletonContext(ServletContext servletContext)
     {
-        SingletonContext context = null;
+        SingletonContext context = sharedSingletonContext;
 
-        //look for saved context
-        if(servletContext != null)
-        {
-            context = currentSingletonContexts.get(servletContext);
-        }
-        
-        //using in tests
-        if(context == null)
-        {
-            context = this.sharedSingletonContext;
-        }        
-        
-        //context is not null
-        //destroyDependents it
-        if(context != null)
+        if (context != null)
         {
             context.destroy();
         }
 
-        //remove it from saved contexts
-        if(servletContext != null)
-        {
-            currentSingletonContexts.remove(servletContext);   
-        }
-
-        classLoaderToServletContextMapping.remove(WebBeansUtil.getCurrentClassLoader());
-
         webBeansContext.getBeanManagerImpl().fireEvent(servletContext != null ? servletContext : new Object(), DestroyedLiteral.INSTANCE_SINGLETON_SCOPED);
     }
 
@@ -828,7 +677,10 @@ public class WebContextsService extends
         return conversationContexts.get();
     }
 
-    private Context lazyStartSessionContext()
+    /**
+     * Try to lazily start the sessionContext
+     */
+    private void lazyStartSessionContext()
     {
 
         if (logger.isLoggable(Level.FINE))
@@ -836,7 +688,6 @@ public class WebContextsService extends
             logger.log(Level.FINE, ">lazyStartSessionContext");
         }
 
-        Context webContext = null;
         Context context = getCurrentContext(RequestScoped.class);
         if (context instanceof ServletRequestContext)
         {
@@ -846,12 +697,8 @@ public class WebContextsService extends
             { // this could be null if there is no active request context
                 try
                 {
-                    HttpSession currentSession = servletRequest.getSession();
+                    HttpSession currentSession = servletRequest.getSession(true);
                     initSessionContext(currentSession);
-                    if (failoverService != null && failoverService.isSupportFailOver())
-                    {
-                        failoverService.sessionIsInUse(currentSession);
-                    }
 
                     if (logger.isLoggable(Level.FINE))
                     {
@@ -873,12 +720,6 @@ public class WebContextsService extends
         {
             logger.log(Level.WARNING, "Could NOT lazily initialize session context because of "+context+" RequestContext");
         }
-
-        if (logger.isLoggable(Level.FINE))
-        {
-            logger.log(Level.FINE, "<lazyStartSessionContext "+ webContext);
-        }
-        return webContext;
     }