[webbeans-commits] Webbeans SVN: r1545 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: servlet and 1 other directory.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Mon Feb 16 14:02:24 EST 2009


Author: nickarls
Date: 2009-02-16 14:02:24 -0500 (Mon, 16 Feb 2009)
New Revision: 1545

Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.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/ServletConversationManager.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java
Log:
Better session for conversation destruction
Re-scheduling old conversation for destruction after beginning new

Modified: 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	2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java	2009-02-16 19:02:24 UTC (rev 1545)
@@ -95,7 +95,7 @@
     */
    public void destroy(HttpSession session)
    {
-      log.trace("Destroying conversation " + cid);
+      log.debug("Destroying conversation " + cid);
       if (!terminationHandle.isCancelled())
       {
          cancelTermination();

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-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java	2009-02-16 19:02:24 UTC (rev 1545)
@@ -31,18 +31,20 @@
  * The current conversation implementation
  * 
  * @author Nicklas Karlsson
- * @see javax.context.Conversation 
+ * @see javax.context.Conversation
  */
 @RequestScoped
 @Named("conversation")
 @WebBean
 public class ConversationImpl implements Conversation
 {
-   
+
    private static LogProvider log = Logging.getLogProvider(ConversationImpl.class);
 
    // The conversation ID
    private String cid;
+   // The original conversation ID (if any)
+   private String originalCid;
    // Is the conversation long-running?
    private boolean longRunning;
    // The inactivity timeout in milliseconds
@@ -54,9 +56,9 @@
    public ConversationImpl()
    {
    }
-   
+
    /**
-    * Initializes a new conversation 
+    * Initializes a new conversation
     * 
     * @param conversationIdGenerator The conversation ID generator
     * @param timeoutInMilliseconds The inactivity timeout in milliseconds
@@ -77,6 +79,10 @@
 
    public void begin(String id)
    {
+      if (originalCid == null)
+      {
+         originalCid = cid;
+      }
       cid = id;
       begin();
    }
@@ -113,7 +119,7 @@
     * 
     * @param cid The new conversation ID
     * @param longRunning The new long-running status
-    * @param timeout The new inactivity timeout in milliseconds 
+    * @param timeout The new inactivity timeout in milliseconds
     */
    public void switchTo(String cid, boolean longRunning, long timeoutInMilliseconds)
    {
@@ -135,4 +141,9 @@
       log.debug("Set conversation " + cid + " to long-running: " + longRunning);
       this.longRunning = longRunning;
    }
+
+   public String getOriginalCid()
+   {
+      return originalCid;
+   }
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java	2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java	2009-02-16 19:02:24 UTC (rev 1545)
@@ -22,11 +22,11 @@
 import java.util.concurrent.Future;
 
 import javax.context.SessionScoped;
-import javax.faces.context.FacesContext;
 import javax.inject.Current;
 import javax.inject.Produces;
 import javax.servlet.http.HttpSession;
 
+import org.jboss.webbeans.CurrentManager;
 import org.jboss.webbeans.WebBean;
 import org.jboss.webbeans.context.ConversationContext;
 import org.jboss.webbeans.conversation.bindings.ConversationConcurrentAccessTimeout;
@@ -34,6 +34,7 @@
 import org.jboss.webbeans.conversation.bindings.ConversationInactivityTimeout;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
+import org.jboss.webbeans.servlet.HttpSessionManager;
 
 /**
  * The default conversation manager
@@ -59,10 +60,6 @@
    @Current
    private ConversationImpl currentConversation;
 
-   // The current HTTP session
-   @Current
-   private HttpSession session;
-
    // The conversation timeout in milliseconds waiting for access to a blocked
    // conversation
    @ConversationConcurrentAccessTimeout
@@ -160,7 +157,8 @@
       }
    }
 
-   // TODO: check that stuff gets terminated when you flip between several long-running conversations
+   // TODO: check that stuff gets terminated when you flip between several
+   // long-running conversations
    public void cleanupConversation()
    {
       String cid = currentConversation.getId();
@@ -199,6 +197,15 @@
          }
          ConversationContext.INSTANCE.destroy();
       }
+      // If Conversation.begin(String) is called, it might be that the
+      // conversation will be switched. We need to unlock this original 
+      // conversation and re-schedule it for termination
+      String originalCid = currentConversation.getOriginalCid();
+      if (originalCid != null && longRunningConversations.containsKey(originalCid))
+      {
+         longRunningConversations.get(originalCid).unlock();
+         longRunningConversations.get(originalCid).reScheduleTermination(scheduleForTermination(originalCid));
+      }
    }
 
    /**
@@ -209,7 +216,8 @@
     */
    private Future<?> scheduleForTermination(String cid)
    {
-      Runnable terminationTask = new TerminationTask(cid, (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true));
+      HttpSession session = CurrentManager.rootManager().getInstanceByType(HttpSessionManager.class).getSession();
+      Runnable terminationTask = new TerminationTask(cid, session);
       return conversationTerminator.scheduleForTermination(terminationTask, inactivityTimeout);
    }
 
@@ -249,6 +257,7 @@
 
    public void destroyAllConversations()
    {
+      HttpSession session = CurrentManager.rootManager().getInstanceByType(HttpSessionManager.class).getSession();
       log.debug("Destroying " + longRunningConversations.size() + " long-running conversations in session " + session.getId());
       for (ConversationEntry conversationEntry : longRunningConversations.values())
       {

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java	2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java	2009-02-16 19:02:24 UTC (rev 1545)
@@ -20,7 +20,7 @@
    @Produces
    @RequestScoped
    @WebBean
-   HttpSession produceSession()
+   public HttpSession getSession()
    {
       return session;
    }




More information about the weld-commits mailing list