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/05/03 00:22:27 UTC

svn commit: r1677358 - in /openwebbeans/trunk/webbeans-web/src: main/java/org/apache/webbeans/web/context/ test/resources/META-INF/openwebbeans/

Author: struberg
Date: Sat May  2 22:22:27 2015
New Revision: 1677358

URL: http://svn.apache.org/r1677358
Log:
OWB-1050 also support conversations in servlets

Added:
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebConversationService.java
      - copied, changed from r1676851, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/DefaultConversationService.java
Modified:
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
    openwebbeans/trunk/webbeans-web/src/test/resources/META-INF/openwebbeans/openwebbeans.properties

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=1677358&r1=1677357&r2=1677358&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 May  2 22:22:27 2015
@@ -61,7 +61,7 @@ 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";
+    private static final String OWB_SESSION_CONTEXT_ATTRIBUTE_NAME = "openWebBeansSessionContext";
 
     /**Current request context*/
     protected static ThreadLocal<RequestContext> requestContexts = null;
@@ -416,20 +416,20 @@ public class WebContextsService extends
         else
         {
             // we need to get it latest here to make sure we work on the same instance
-            currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE);
+            currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE_NAME);
 
             if (currentSessionContext == null)
             {
                 // no current context, so lets create a new one
-                synchronized (OWB_SESSION_CONTEXT_ATTRIBUTE)
+                synchronized (OWB_SESSION_CONTEXT_ATTRIBUTE_NAME)
                 {
-                    currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE);
+                    currentSessionContext = (SessionContext) session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE_NAME);
                     if (currentSessionContext == null)
                     {
                         currentSessionContext = new SessionContext();
                         currentSessionContext.setActive(true);
                         webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
-                        session.setAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE, currentSessionContext);
+                        session.setAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE_NAME, currentSessionContext);
                     }
                 }
             }
@@ -437,7 +437,7 @@ public class WebContextsService extends
             {
                 // we do that in any case.
                 // This is needed to trigger delta-replication on most servers
-                session.setAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE, currentSessionContext);
+                session.setAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE_NAME, currentSessionContext);
             }
         }
 

Copied: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebConversationService.java (from r1676851, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/DefaultConversationService.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebConversationService.java?p2=openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebConversationService.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/DefaultConversationService.java&r1=1676851&r2=1677358&rev=1677358&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/DefaultConversationService.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebConversationService.java Sat May  2 22:22:27 2015
@@ -16,32 +16,123 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.webbeans.conversation;
+package org.apache.webbeans.web.context;
 
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.RequestContext;
+import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.ConversationService;
 
 /**
- * We do not support Conversation propagation in JavaSE yet.
+ * Conversation propagation in pure Servlets happens via cid servlet parameter.
  */
-public class DefaultConversationService implements ConversationService
+public class WebConversationService implements ConversationService
 {
+    public static final String REQUEST_PARAM_CONVERSATION_ID = "cid";
+    public static final String REQUEST_PARAM_SUPPRESS_CONVERSATION_PROPAGATION = "conversationPropagation";
+    public static final String SESSION_CONVERSATION_ID_PARAM_NAME = "openWebBeansConversationIdCounter";
+
+    private final WebBeansContext webBeansContext;
+
     /**
-     * For SE we only need one single counter as there is no
-     * serialisation anyway.
+     * For non-servlet requests we simply generate the numbers internally
      */
-    private AtomicInteger conversationIdCounter = new AtomicInteger(0);
+    private AtomicInteger nonServletRequestConversationIdCounter = new AtomicInteger(0);
 
+
+    public WebConversationService(WebBeansContext webBeansContext)
+    {
+        this.webBeansContext = webBeansContext;
+    }
+
+    /**
+     * Try to get the current conversationId from the servlet.
+     */
     @Override
     public String getConversationId()
     {
+        ServletRequest servletRequest = getCurrentServletRequest();
+        if (servletRequest != null)
+        {
+            // get the cid parameter from the servlet request
+            String cidParamValue = servletRequest.getParameter(REQUEST_PARAM_CONVERSATION_ID);
+            if (cidParamValue != null && cidParamValue.length() > 0)
+            {
+                // also check the suppress conversation propagation parameter
+                String suppressConversationPropagation = servletRequest.getParameter(REQUEST_PARAM_SUPPRESS_CONVERSATION_PROPAGATION);
+                if (!"none".equals(suppressConversationPropagation))
+                {
+                    // wohu, we found our cid parameter
+                    return cidParamValue;
+                }
+            }
+        }
+
+        // seems we cannot find any cid parameter
         return null;
     }
 
     @Override
     public String generateConversationId()
     {
-        return Long.toString(conversationIdCounter.incrementAndGet());
+        return Long.toString(getConversationIdCounter().incrementAndGet());
+    }
+
+    protected AtomicInteger getConversationIdCounter()
+    {
+        AtomicInteger counter = getSessionConversationIdCounter();
+        return counter != null ? counter : nonServletRequestConversationIdCounter;
+    }
+
+    /**
+     * @return conversationId counter AtomicInteger if this is a real http request, {@code null} otherwise
+     */
+    protected AtomicInteger getSessionConversationIdCounter()
+    {
+        ServletRequest servletRequest = getCurrentServletRequest();
+        if (servletRequest instanceof HttpServletRequest)
+        {
+            HttpSession session = ((HttpServletRequest) servletRequest).getSession(true);
+            AtomicInteger sessionCounter = (AtomicInteger) session.getAttribute(SESSION_CONVERSATION_ID_PARAM_NAME);
+            if (sessionCounter == null)
+            {
+                synchronized (session)
+                {
+                    sessionCounter = (AtomicInteger) session.getAttribute(SESSION_CONVERSATION_ID_PARAM_NAME);
+                    if (sessionCounter == null)
+                    {
+                        sessionCounter = new AtomicInteger(0);
+                        session.setAttribute(SESSION_CONVERSATION_ID_PARAM_NAME, sessionCounter);
+                    }
+                }
+            }
+            return sessionCounter;
+        }
+
+
+        return null;
+    }
+
+    /**
+     * @return the current ServletRequest or {@code null} if this thread is not attached to a servlet request
+     */
+    protected ServletRequest getCurrentServletRequest()
+    {
+        ContextsService contextsService = webBeansContext.getContextsService();
+        if (contextsService instanceof WebContextsService)
+        {
+            RequestContext requestContext = ((WebContextsService) contextsService).getRequestContext(false);
+            if (requestContext instanceof ServletRequestContext)
+            {
+                return ((ServletRequestContext) requestContext).getServletRequest();
+            }
+        }
+
+        return null;
     }
 }

Modified: openwebbeans/trunk/webbeans-web/src/test/resources/META-INF/openwebbeans/openwebbeans.properties
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/test/resources/META-INF/openwebbeans/openwebbeans.properties?rev=1677358&r1=1677357&r2=1677358&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/test/resources/META-INF/openwebbeans/openwebbeans.properties (original)
+++ openwebbeans/trunk/webbeans-web/src/test/resources/META-INF/openwebbeans/openwebbeans.properties Sat May  2 22:22:27 2015
@@ -24,6 +24,14 @@
 
 configuration.ordinal=15
 
+################################### Default Conversation Service ###############################
+# Servlet backed implementation of org.apache.webbeans.corespi.ConversationService.
+# This looks in the servlet request if there is a cid parameter.
+# As per spec the conversation propagation can be suppressed with a conversationPropagation=none parameter
+org.apache.webbeans.spi.ConversationService=org.apache.webbeans.web.context.WebConversationService
+################################################################################################
+
+
 ########################### Proxy Implmenentation Mapping ######################################
 # This allows mapping a Scope Annotation class to a specific InterceptorProxy which are
 # typically sub classes of NormalScopedBeanInterceptorHandler