[webbeans-commits] Webbeans SVN: r1393 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Tue Feb 3 03:20:03 EST 2009


Author: nickarls
Date: 2009-02-03 03:20:03 -0500 (Tue, 03 Feb 2009)
New Revision: 1393

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
Log:
Refactoring in preparation for concurrency control

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java	2009-02-03 08:20:03 UTC (rev 1393)
@@ -0,0 +1,49 @@
+package org.jboss.webbeans.conversation;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.servlet.http.HttpSession;
+
+import org.jboss.webbeans.context.ConversationContext;
+import org.jboss.webbeans.servlet.ConversationBeanMap;
+
+public class ConversationEntry
+{
+   private String cid;
+   private Future<?> terminationHandle;
+   private ReentrantLock concurrencyLock;
+
+   protected ConversationEntry(String cid, Future<?> terminationHandle)
+   {
+      this.cid = cid;
+      this.terminationHandle = terminationHandle;
+      this.concurrencyLock = new ReentrantLock(true);
+   }
+
+   public static ConversationEntry of(String cid, Future<?> terminationHandle)
+   {
+      return new ConversationEntry(cid, terminationHandle);
+   }
+
+   public boolean cancelTermination()
+   {
+      return terminationHandle.cancel(false);
+   }
+
+   public void destroy(HttpSession session)
+   {
+      ConversationContext terminationContext = new ConversationContext();
+      terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
+      terminationContext.destroy();
+   }
+   
+   public void lock() {
+      concurrencyLock.lock();
+   }
+   
+   public void unlock() {
+      concurrencyLock.unlock();
+   }
+
+}

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-03 03:49:06 UTC (rev 1392)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java	2009-02-03 08:20:03 UTC (rev 1393)
@@ -45,13 +45,13 @@
    @Current
    private Conversation currentConversation;
 
-   private Map<String, Future<?>> longRunningConversations;
+   private Map<String, ConversationEntry> longRunningConversations;
    private HttpSession session;
 
    protected DefaultConversationManager()
    {
       log.trace("Created " + getClass());
-      longRunningConversations = new ConcurrentHashMap<String, Future<?>>();
+      longRunningConversations = new ConcurrentHashMap<String, ConversationEntry>();
       session = null;
    }
 
@@ -80,7 +80,7 @@
          log.info("Could not restore long-running conversation " + cid);
          return;
       }
-      if (!longRunningConversations.remove(cid).cancel(false))
+      if (!longRunningConversations.remove(cid).cancelTermination())
       {
          log.info("Failed to cancel termination of conversation " + cid);
       }
@@ -96,7 +96,9 @@
       {
          Runnable terminationTask = new TerminationTask(currentConversation.getId());
          Future<?> terminationHandle = conversationTerminator.scheduleForTermination(terminationTask);
-         longRunningConversations.put(currentConversation.getId(), terminationHandle);
+         String cid = currentConversation.getId();
+         ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
+         longRunningConversations.put(cid, conversationEntry);
          log.trace("Scheduling " + currentConversation + " for termination");
       }
       else
@@ -118,24 +120,18 @@
       public void run()
       {
          log.trace("Conversation " + cid + " timed out and was terminated");
-         destroyConversation(cid, session);
+         longRunningConversations.get(cid).destroy(session);
       }
    }
-   
+
    public void destroyAllConversations()
    {
-      for (Map.Entry<String, Future<?>> entry : longRunningConversations.entrySet()) {
-         entry.getValue().cancel(false);
-         destroyConversation(entry.getKey(), session);
+      for (ConversationEntry conversationEntry : longRunningConversations.values())
+      {
+         conversationEntry.cancelTermination();
+         conversationEntry.destroy(session);
       }
+      longRunningConversations.clear();
    }
 
-   private void destroyConversation(String cid, HttpSession session)
-   {
-      ConversationContext terminationContext = new ConversationContext();
-      terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
-      terminationContext.destroy();
-      longRunningConversations.remove(cid);
-   }
-
 }




More information about the weld-commits mailing list