[webbeans-commits] Webbeans SVN: r1418 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: conversation and 2 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Thu Feb 5 02:35:00 EST 2009


Author: nickarls
Date: 2009-02-05 02:35:00 -0500 (Thu, 05 Feb 2009)
New Revision: 1418

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationConcurrentAccessTimeout.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationInactivityTimeout.java
Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java
Log:
Fixes/improvements to conversation infra

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -26,6 +26,7 @@
 import org.jboss.webbeans.bean.standard.ManagerBean;
 import org.jboss.webbeans.bootstrap.spi.EjbDiscovery;
 import org.jboss.webbeans.bootstrap.spi.WebBeanDiscovery;
+import org.jboss.webbeans.conversation.ConversationImpl;
 import org.jboss.webbeans.conversation.DefaultConversationManager;
 import org.jboss.webbeans.conversation.JavaSEConversationTerminator;
 import org.jboss.webbeans.conversation.NumericConversationIdGenerator;
@@ -101,6 +102,7 @@
       beanDeployer.addBean(ManagerBean.of(manager));
       beanDeployer.addBean(InjectionPointBean.of(manager));
       beanDeployer.addClass(Transaction.class);
+      beanDeployer.addClass(ConversationImpl.class);
       beanDeployer.addClass(DefaultConversationManager.class);
       beanDeployer.addClass(JavaSEConversationTerminator.class);
       beanDeployer.addClass(NumericConversationIdGenerator.class);

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -20,7 +20,7 @@
  * Generates conversation ID:s for the conversation manager
  * 
  * @author Nicklas Karlsson
- * @see org.jboss.webbeans.conversation.ConversationManager#beginConversation(String)
+ * @see org.jboss.webbeans.conversation.ConversationManager#beginOrRestoreConversation(String)
  */
 public interface ConversationIdGenerator
 {

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -20,7 +20,10 @@
 import javax.annotation.Named;
 import javax.context.Conversation;
 import javax.context.RequestScoped;
+import javax.inject.Initializer;
 
+import org.jboss.webbeans.conversation.bindings.ConversationInactivityTimeout;
+
 /**
  * The current conversation implementation
  * 
@@ -39,27 +42,23 @@
    private long timeoutInMilliseconds;
 
    /**
-    * Creates a new conversation 
-    * 
-    * @param cid The conversation ID
-    * @param timeoutInMilliseconds The inactivity timeout in milliseconds
+    * Creates a new conversation
     */
-   protected ConversationImpl(String cid, long timeoutInMilliseconds)
+   public ConversationImpl()
    {
-      this.timeoutInMilliseconds = timeoutInMilliseconds;
-      this.cid = cid;
    }
-
+   
    /**
-    * Factory method
+    * Initializes a new conversation 
     * 
-    * @param cid The conversation ID
+    * @param conversationIdGenerator The conversation ID generator
     * @param timeoutInMilliseconds The inactivity timeout in milliseconds
-    * @return A new conversation
     */
-   public static ConversationImpl of(String cid, long timeoutInMilliseconds)
+   @Initializer
+   public void init(ConversationIdGenerator conversationIdGenerator, @ConversationInactivityTimeout long timeoutInMilliseconds)
    {
-      return new ConversationImpl(cid, timeoutInMilliseconds);
+      this.cid = conversationIdGenerator.nextId();
+      this.timeoutInMilliseconds = timeoutInMilliseconds;
    }
 
    public void begin()
@@ -105,7 +104,7 @@
     * @param longRunning The new long-running status
     * @param timeout The new inactivity timeout in milliseconds 
     */
-   public void become(String cid, boolean longRunning, long timeoutInMilliseconds)
+   public void switchTo(String cid, boolean longRunning, long timeoutInMilliseconds)
    {
       this.cid = cid;
       this.longRunning = longRunning;

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -25,34 +25,21 @@
 public interface ConversationManager
 {
    /**
-    * Begins a conversation
+    * Begins or restores a conversation
     * 
     * @param cid The incoming conversation ID. Can be null in cases of transient conversations
     */
-   public abstract void beginConversation(String cid);
+   public abstract void beginOrRestoreConversation(String cid);
    
    /**
-    * Ends the current conversation
+    * Cleans up the current conversation, destroying transient conversation and handling 
+    * long-running conversations
     */
-   public abstract void endConversation();
+   public abstract void cleanupConversation();
    
    /**
     * Destroys all long-running conversations
     */
    public abstract void destroyAllConversations();
    
-   /**
-    * Gets The inactivity timeout
-    * 
-    * @return The timeout in milliseconds
-    */
-   public abstract long getInactivityTimeoutInMilliseconds();
-   
-   /**
-    * Gets The concurrent access timeout
-    * 
-    * @return The timeout in milliseconds
-    */
-   public abstract long getConcurrentAccessTimeoutInMilliseconds();
-   
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -21,8 +21,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Future;
 
-import javax.context.Conversation;
-import javax.context.RequestScoped;
 import javax.context.SessionScoped;
 import javax.inject.Current;
 import javax.inject.Produces;
@@ -30,6 +28,8 @@
 
 import org.jboss.webbeans.bootstrap.WebBeansBootstrap;
 import org.jboss.webbeans.context.ConversationContext;
+import org.jboss.webbeans.conversation.bindings.ConversationConcurrentAccessTimeout;
+import org.jboss.webbeans.conversation.bindings.ConversationInactivityTimeout;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
 
@@ -44,21 +44,25 @@
 {
    private static LogProvider log = Logging.getLogProvider(WebBeansBootstrap.class);
 
-   // The conversation id generator
-   @Current
-   private ConversationIdGenerator conversationIdGenerator;
-
    // The conversation terminator
    @Current
    private ConversationTerminator conversationTerminator;
 
    // The current conversation
    @Current
-   private Conversation currentConversation;
+   private ConversationImpl currentConversation;
 
    // The current HTTP session
    @Current
    private HttpSession session;
+   
+   // The conversation timeout in milliseconds waiting for access to a blocked conversation 
+   @ConversationConcurrentAccessTimeout
+   private long concurrentAccessTimeout;
+   
+   // The conversation inactivity timeout in milliseconds
+   @ConversationInactivityTimeout
+   private long inactivityTimeout;
 
    // A map of current active long-running conversation entries
    private Map<String, ConversationEntry> longRunningConversations;
@@ -71,23 +75,23 @@
       log.trace("Created " + getClass());
       longRunningConversations = new ConcurrentHashMap<String, ConversationEntry>();
    }
-
-   /**
-    * Producer method for transient conversations
-    * 
-    * @return A new transient conversation
-    */
+   
    @Produces
-   @RequestScoped
-   public Conversation produceNewTransientConversation()
+   @ConversationInactivityTimeout
+   public long getConversationTimeoutInMilliseconds()
    {
-      Conversation conversation = ConversationImpl.of(conversationIdGenerator.nextId(), getInactivityTimeoutInMilliseconds());
-      log.trace("Produced a new conversation: " + conversation);
-      return conversation;
+      return 10 * 60 * 1000;
    }
 
-   public void beginConversation(String cid)
+   @Produces
+   @ConversationConcurrentAccessTimeout
+   public long getConversationConcurrentAccessTimeout()
    {
+      return 1 * 1000;
+   }
+   
+   public void beginOrRestoreConversation(String cid)
+   {
       if (cid == null)
       {
          // No incoming conversation ID, nothing to do here, Conversation
@@ -106,9 +110,9 @@
       // if we fail
       try
       {
-         if (!longRunningConversations.get(cid).lock(getConcurrentAccessTimeoutInMilliseconds()))
+         if (!longRunningConversations.get(cid).lock(concurrentAccessTimeout))
          {
-            log.info("Could not acquire conversation lock in " + getConcurrentAccessTimeoutInMilliseconds() + "ms, giving up");
+            log.info("Could not acquire conversation lock in " + concurrentAccessTimeout + "ms, giving up");
             return;
          }
       }
@@ -128,11 +132,11 @@
       {
          // If all goes well, set the identity of the current conversation to
          // match the fetched long-running one
-         ((ConversationImpl) currentConversation).become(cid, true, getInactivityTimeoutInMilliseconds());
+         currentConversation.switchTo(cid, true, inactivityTimeout);
       }
    }
 
-   public void endConversation()
+   public void cleanupConversation()
    {
       String cid = currentConversation.getId();
       if (currentConversation.isLongRunning())
@@ -175,7 +179,7 @@
    private Future<?> scheduleForTermination(String cid)
    {
       Runnable terminationTask = new TerminationTask(cid);
-      return conversationTerminator.scheduleForTermination(terminationTask, getInactivityTimeoutInMilliseconds());
+      return conversationTerminator.scheduleForTermination(terminationTask, inactivityTimeout);
    }
 
    /**
@@ -218,14 +222,4 @@
       longRunningConversations.clear();
    }
 
-   public long getConcurrentAccessTimeoutInMilliseconds()
-   {
-      return 1000;
-   }
-
-   public long getInactivityTimeoutInMilliseconds()
-   {
-      return 10 * 60 * 1000;
-   }
-
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -19,7 +19,7 @@
 import java.io.Serializable;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import javax.context.ApplicationScoped;
+import javax.context.SessionScoped;
 
 /**
  * A ConversationIdGenerator implementation using running numerical values
@@ -27,7 +27,7 @@
  * @author Nicklas Karlsson
  *
  */
- at ApplicationScoped
+ at SessionScoped
 public class NumericConversationIdGenerator implements ConversationIdGenerator, Serializable
 {
    // The next conversation ID

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationConcurrentAccessTimeout.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationConcurrentAccessTimeout.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationConcurrentAccessTimeout.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.webbeans.conversation.bindings;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.BindingType;
+
+/**
+ * The conversation context concurrent access wait timeout on a lock
+ *  
+ * @author Nicklas Karlsson
+ */
+ at Target( { TYPE, METHOD, PARAMETER, FIELD })
+ at Retention(RUNTIME)
+ at Documented
+ at BindingType
+public @interface ConversationConcurrentAccessTimeout
+{
+}

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationInactivityTimeout.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationInactivityTimeout.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/bindings/ConversationInactivityTimeout.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.webbeans.conversation.bindings;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.BindingType;
+
+/**
+ * The conversation context inactivity timeout
+ *  
+ * @author Nicklas Karlsson
+ */
+ at Target( { TYPE, METHOD, PARAMETER, FIELD })
+ at Retention(RUNTIME)
+ at Documented
+ at BindingType
+public @interface ConversationInactivityTimeout
+{
+}

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java	2009-02-05 01:27:09 UTC (rev 1417)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java	2009-02-05 07:35:00 UTC (rev 1418)
@@ -104,7 +104,7 @@
    private static void beginConversation(HttpServletRequest request)
    {
       ConversationManager conversationManager = CurrentManager.rootManager().getInstanceByType(ConversationManager.class);
-      conversationManager.beginConversation(request.getParameter("cid"));
+      conversationManager.beginOrRestoreConversation(request.getParameter("cid"));
       Conversation conversation = CurrentManager.rootManager().getInstanceByType(Conversation.class);
       ConversationContext.INSTANCE.setBeanMap(new ConversationBeanMap(request.getSession(), conversation.getId()));
    }
@@ -119,15 +119,9 @@
       DependentContext.INSTANCE.setActive(false);
       RequestContext.INSTANCE.destroy();
       SessionContext.INSTANCE.setBeanMap(null);
-      endConversation();
+      CurrentManager.rootManager().getInstanceByType(ConversationManager.class).cleanupConversation();
       ConversationContext.INSTANCE.setBeanMap(null);
       CurrentManager.rootManager().getInstanceByType(SessionManager.class).setSession(null);      
    }
 
-   private static void endConversation()
-   {
-      ConversationManager conversationManager = CurrentManager.rootManager().getInstanceByType(ConversationManager.class);
-      conversationManager.endConversation();
-   }
-
 }




More information about the weld-commits mailing list