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

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Wed Feb 4 02:47:37 EST 2009


Author: nickarls
Date: 2009-02-04 02:47:37 -0500 (Wed, 04 Feb 2009)
New Revision: 1406

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.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/ConversationEntry.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/ConversationTerminator.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/JavaSEConversationTerminator.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:
New theory on conversation handling for Pete to review (missing e.g. thread safety stuff )

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -36,6 +36,7 @@
 import org.jboss.webbeans.log.Logging;
 import org.jboss.webbeans.resources.spi.NamingContext;
 import org.jboss.webbeans.resources.spi.ResourceLoader;
+import org.jboss.webbeans.servlet.SessionManager;
 import org.jboss.webbeans.transaction.Transaction;
 
 /**
@@ -103,6 +104,7 @@
       beanDeployer.addClass(DefaultConversationManager.class);
       beanDeployer.addClass(JavaSEConversationTerminator.class);
       beanDeployer.addClass(NumericConversationIdGenerator.class);
+      beanDeployer.addClass(SessionManager.class);
       beanDeployer.deploy();
    }
 

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -1,6 +1,23 @@
+/*
+ * 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;
 
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 
 import javax.servlet.http.HttpSession;
@@ -8,42 +25,99 @@
 import org.jboss.webbeans.context.ConversationContext;
 import org.jboss.webbeans.servlet.ConversationBeanMap;
 
+/**
+ * Represents a long-running conversation entry
+ * 
+ * @author Nicklas Karlsson
+ */
 public class ConversationEntry
 {
+   // The conversation ID
    private String cid;
+   // The handle to the asynchronous timeout task
    private Future<?> terminationHandle;
+   // The lock for concurrent access prevention
    private ReentrantLock concurrencyLock;
 
+   /**
+    * Creates a new conversation entry
+    * 
+    * @param cid The conversation ID
+    * @param terminationHandle The timeout termination handle
+    */
    protected ConversationEntry(String cid, Future<?> terminationHandle)
    {
       this.cid = cid;
       this.terminationHandle = terminationHandle;
-      this.concurrencyLock = new ReentrantLock(true);
+      this.concurrencyLock = new ReentrantLock();
    }
 
+   /**
+    * Factory method
+    * 
+    * @param cid The conversation ID
+    * @param terminationHandle The timeout termination handle
+    * @return A new conversation entry
+    */
    public static ConversationEntry of(String cid, Future<?> terminationHandle)
    {
       return new ConversationEntry(cid, terminationHandle);
    }
 
+   /**
+    * Cancels the timeout termination
+    * 
+    * @return True if successful, false otherwise
+    */
    public boolean cancelTermination()
    {
       return terminationHandle.cancel(false);
    }
 
+   /**
+    * Destroys the conversation and it's associated conversational context 
+    * 
+    * @param session The HTTP session for the backing context beanmap
+    */
    public void destroy(HttpSession session)
    {
+      if (!terminationHandle.isCancelled())
+      {
+         cancelTermination();
+      }
       ConversationContext terminationContext = new ConversationContext();
       terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
       terminationContext.destroy();
    }
-   
-   public void lock() {
-      concurrencyLock.lock();
+
+   /**
+    * Attempts to lock the conversation for exclusive usage 
+    * 
+    * @param timeoutInMilliseconds The time in milliseconds to wait on the lock
+    * @return True if lock was successful, false otherwise
+    * @throws InterruptedException If the lock operation was unsuccessful
+    */
+   public boolean lock(long timeoutInMilliseconds) throws InterruptedException
+   {
+      return concurrencyLock.tryLock(timeoutInMilliseconds, TimeUnit.MILLISECONDS);
    }
-   
-   public void unlock() {
+
+   /**
+    * Attempts to unlock the conversation
+    */
+   public void unlock()
+   {
       concurrencyLock.unlock();
    }
 
+   /**
+    * Re-schedules timeout termination 
+    * 
+    * @param terminationHandle The fresh timeout termination handle
+    */
+   public void reScheduleTermination(Future<?> terminationHandle)
+   {
+      this.terminationHandle = terminationHandle;
+   }
+
 }

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -16,7 +16,17 @@
  */
 package org.jboss.webbeans.conversation;
 
+/**
+ * Generates conversation ID:s for the conversation manager
+ * 
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationManager#beginConversation(String)
+ */
 public interface ConversationIdGenerator
 {
+   /**
+    * Gets the next ID for a new conversation
+    * @return The ID
+    */
    public abstract String nextId();
 }

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -17,25 +17,46 @@
 
 package org.jboss.webbeans.conversation;
 
+import javax.annotation.Named;
 import javax.context.Conversation;
 import javax.context.RequestScoped;
 
+/**
+ * The current conversation implementation
+ * 
+ * @author Nicklas Karlsson
+ * @see javax.context.Conversation 
+ */
 @RequestScoped
+ at Named("conversation")
 public class ConversationImpl implements Conversation
 {
+   // The conversation ID
    private String cid;
+   // Is the conversation long-running?
    private boolean longRunning;
+   // The inactivity timeout in milliseconds
    private long timeoutInMilliseconds;
 
-   public ConversationImpl() {
-   }
-   
+   /**
+    * Creates a new conversation 
+    * 
+    * @param cid The conversation ID
+    * @param timeoutInMilliseconds The inactivity timeout in milliseconds
+    */
    protected ConversationImpl(String cid, long timeoutInMilliseconds)
    {
       this.timeoutInMilliseconds = timeoutInMilliseconds;
       this.cid = cid;
    }
 
+   /**
+    * Factory method
+    * 
+    * @param cid The conversation ID
+    * @param timeoutInMilliseconds The inactivity timeout in milliseconds
+    * @return A new conversation
+    */
    public static ConversationImpl of(String cid, long timeoutInMilliseconds)
    {
       return new ConversationImpl(cid, timeoutInMilliseconds);
@@ -77,11 +98,18 @@
       this.timeoutInMilliseconds = timeout;
    }
 
-   public void become(String cid, boolean longRunning, long timeout)
+   /**
+    * Assumes the identity of another conversation
+    * 
+    * @param cid The new conversation ID
+    * @param longRunning The new long-running status
+    * @param timeout The new inactivity timeout in milliseconds 
+    */
+   public void become(String cid, boolean longRunning, long timeoutInMilliseconds)
    {
       this.cid = cid;
       this.longRunning = longRunning;
-      this.timeoutInMilliseconds = timeout;
+      this.timeoutInMilliseconds = timeoutInMilliseconds;
    }
 
    @Override

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -16,9 +16,43 @@
  */
 package org.jboss.webbeans.conversation;
 
+/**
+ * A conversation manager responsible for starting, resuming and ending conversations
+ * 
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationManager
+ */
 public interface ConversationManager
 {
+   /**
+    * Begins a conversation
+    * 
+    * @param cid The incoming conversation ID. Can be null in cases of transient conversations
+    */
    public abstract void beginConversation(String cid);
+   
+   /**
+    * Ends the current conversation
+    */
    public abstract void endConversation();
+   
+   /**
+    * 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/ConversationTerminator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java	2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -18,8 +18,21 @@
 
 import java.util.concurrent.Future;
 
+/**
+ * A conversation terminator for scheduling inactivity timeout destructions
+ * 
+ * @author Nicklas Karlsson
+ *
+ */
 public interface ConversationTerminator
 {
-   public abstract Future<?> scheduleForTermination(Runnable task);
-   public abstract long getTimeout();
+   /**
+    * Schedules a termination
+    * 
+    * @param terminationTask The termination task to run
+    * @param timeoutInMilliseconds The timeout in milliseconds
+    * 
+    * @return A handle for manipulating the task later on
+    */
+   public abstract Future<?> scheduleForTermination(Runnable terminationTask, long timeoutInMilliseconds);
 }

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -22,6 +22,7 @@
 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;
@@ -31,96 +32,180 @@
 import org.jboss.webbeans.context.ConversationContext;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
-import org.jboss.webbeans.servlet.ConversationBeanMap;
 
+/**
+ * The default conversation manager
+ * 
+ * @author Nicklas Karlsson
+ * 
+ */
 @SessionScoped
 public class DefaultConversationManager implements ConversationManager, Serializable
 {
    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 Map<String, ConversationEntry> longRunningConversations;
+   // The current HTTP session
+   @Current
    private HttpSession session;
 
-   protected DefaultConversationManager()
+   // A map of current active long-running conversation entries
+   private Map<String, ConversationEntry> longRunningConversations;
+
+   /**
+    * Creates a new conversation manager
+    */
+   public DefaultConversationManager()
    {
       log.trace("Created " + getClass());
       longRunningConversations = new ConcurrentHashMap<String, ConversationEntry>();
-      session = null;
    }
 
+   /**
+    * Producer method for transient conversations
+    * 
+    * @return A new transient conversation
+    */
    @Produces
+   @RequestScoped
    public Conversation produceNewTransientConversation()
    {
-      Conversation conversation = ConversationImpl.of(conversationIdGenerator.nextId(), conversationTerminator.getTimeout());
+      Conversation conversation = ConversationImpl.of(conversationIdGenerator.nextId(), getInactivityTimeoutInMilliseconds());
       log.trace("Produced a new conversation: " + conversation);
       return conversation;
    }
 
-   public void setSession(HttpSession session)
-   {
-      log.trace("Conversation manager got session " + session.getId());
-      this.session = session;
-   }
-
    public void beginConversation(String cid)
    {
       if (cid == null)
       {
+         // No incoming conversation ID, nothing to do here, Conversation
+         // factory will produce new transient conversation
          return;
       }
       if (!longRunningConversations.containsKey(cid))
       {
+         // We got an incoming conversation ID but it was not in the map of
+         // known ones, nothing to do, factory to the rescue
          log.info("Could not restore long-running conversation " + cid);
          return;
       }
-      if (!longRunningConversations.remove(cid).cancelTermination())
+      // Try to get a lock to the requested conversation, return and fall back
+      // to new transient conversation from factory
+      // if we fail
+      try
       {
+         if (!longRunningConversations.get(cid).lock(getConcurrentAccessTimeoutInMilliseconds()))
+         {
+            log.info("Could not acquire conversation lock in " + getConcurrentAccessTimeoutInMilliseconds() + "ms, giving up");
+            return;
+         }
+      }
+      catch (InterruptedException e)
+      {
+         log.info("Interrupted while trying to acquire lock");
+         return;
+      }
+      // If we can't cancel the termination, release the lock, return and fall
+      // back to new transient conversation from factory
+      if (!longRunningConversations.get(cid).cancelTermination())
+      {
+         longRunningConversations.get(cid).unlock();
          log.info("Failed to cancel termination of conversation " + cid);
       }
       else
       {
-         ((ConversationImpl) currentConversation).become(cid, true, conversationTerminator.getTimeout());
+         // If all goes well, set the identity of the current conversation to
+         // match the fetched long-running one
+         ((ConversationImpl) currentConversation).become(cid, true, getInactivityTimeoutInMilliseconds());
       }
    }
 
    public void endConversation()
    {
+      String cid = currentConversation.getId();
       if (currentConversation.isLongRunning())
       {
-         Runnable terminationTask = new TerminationTask(currentConversation.getId());
-         Future<?> terminationHandle = conversationTerminator.scheduleForTermination(terminationTask);
-         String cid = currentConversation.getId();
-         ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
-         longRunningConversations.put(cid, conversationEntry);
+         Future<?> terminationHandle = scheduleForTermination(cid);
+         // When the conversation ends, a long-running conversation needs to
+         // start its self-destruct. We can have the case where the conversation
+         // is a previously known conversation (that had it's termination canceled in the
+         // beginConversation) or the case where we have a completely new long-running conversation.
+         if (longRunningConversations.containsKey(currentConversation.getId()))
+         {
+            longRunningConversations.get(currentConversation.getId()).unlock();
+            longRunningConversations.get(currentConversation.getId()).reScheduleTermination(terminationHandle);
+         }
+         else
+         {
+            ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
+            longRunningConversations.put(cid, conversationEntry);
+         }
          log.trace("Scheduling " + currentConversation + " for termination");
       }
       else
       {
+         // If the conversation is not long-running it can be a transient
+         // conversation that has been so from the start or it can be a
+         // long-running conversation that has been demoted during the request
          log.trace("Destroying transient conversation " + currentConversation);
+         if (longRunningConversations.containsKey(cid))
+         {
+            if (!longRunningConversations.get(cid).cancelTermination())
+            {
+               log.info("Failed to cancel termination of conversation " + cid);
+            }
+            longRunningConversations.get(cid).unlock();
+         }
          ConversationContext.INSTANCE.destroy();
       }
    }
 
+   private Future<?> scheduleForTermination(String cid)
+   {
+      Runnable terminationTask = new TerminationTask(cid);
+      return conversationTerminator.scheduleForTermination(terminationTask, getInactivityTimeoutInMilliseconds());
+   }
+
+   /**
+    * A termination task that destroys the conversation entry
+    * 
+    * @author Nicklas Karlsson
+    * 
+    */
    private class TerminationTask implements Runnable
    {
+      // The conversation ID to terminate
       private String cid;
 
+      /**
+       * Creates a new termination task
+       * 
+       * @param cid The conversation ID
+       */
       public TerminationTask(String cid)
       {
          this.cid = cid;
       }
 
+      /**
+       * Executes the termination
+       */
       public void run()
       {
          log.trace("Conversation " + cid + " timed out and was terminated");
-         longRunningConversations.get(cid).destroy(session);
+         longRunningConversations.remove(cid).destroy(session);
       }
    }
 
@@ -128,10 +213,19 @@
    {
       for (ConversationEntry conversationEntry : longRunningConversations.values())
       {
-         conversationEntry.cancelTermination();
          conversationEntry.destroy(session);
       }
       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/JavaSEConversationTerminator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java	2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -24,19 +24,20 @@
 
 import javax.context.SessionScoped;
 
+/**
+ * A ConversationTerminator implementation using Java SE scheduling
+ *   
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationTerminator
+ */
 @SessionScoped
 public class JavaSEConversationTerminator implements ConversationTerminator, Serializable
 {
    private ScheduledExecutorService terminator = Executors.newScheduledThreadPool(1);
 
-   public Future<?> scheduleForTermination(Runnable terminationTask)
+   public Future<?> scheduleForTermination(Runnable terminationTask, long timeoutInMilliseconds)
    {
-      return terminator.schedule(terminationTask, getTimeout(), TimeUnit.MILLISECONDS);
+      return terminator.schedule(terminationTask, timeoutInMilliseconds, TimeUnit.MILLISECONDS);
    }
 
-   public long getTimeout()
-   {
-      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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -21,11 +21,21 @@
 
 import javax.context.ApplicationScoped;
 
+/**
+ * A ConversationIdGenerator implementation using running numerical values
+ *  
+ * @author Nicklas Karlsson
+ *
+ */
 @ApplicationScoped
 public class NumericConversationIdGenerator implements ConversationIdGenerator, Serializable
 {
+   // The next conversation ID
    private AtomicInteger id;
 
+   /**
+    * Creates a new conversation ID generator
+    */
    public NumericConversationIdGenerator()
    {
       id = new AtomicInteger(1);

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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -29,7 +29,6 @@
 import org.jboss.webbeans.context.RequestContext;
 import org.jboss.webbeans.context.SessionContext;
 import org.jboss.webbeans.conversation.ConversationManager;
-import org.jboss.webbeans.conversation.DefaultConversationManager;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
 
@@ -96,6 +95,7 @@
     */
    public static void beginRequest(HttpServletRequest request)
    {
+      CurrentManager.rootManager().getInstanceByType(SessionManager.class).setSession(request.getSession());
       SessionContext.INSTANCE.setBeanMap(new SessionBeanMap(request.getSession()));
       beginConversation(request);
       DependentContext.INSTANCE.setActive(true);
@@ -104,10 +104,6 @@
    private static void beginConversation(HttpServletRequest request)
    {
       ConversationManager conversationManager = CurrentManager.rootManager().getInstanceByType(ConversationManager.class);
-      if (conversationManager instanceof DefaultConversationManager)
-      {
-         ((DefaultConversationManager) conversationManager).setSession(request.getSession());
-      }
       conversationManager.beginConversation(request.getParameter("cid"));
       Conversation conversation = CurrentManager.rootManager().getInstanceByType(Conversation.class);
       ConversationContext.INSTANCE.setBeanMap(new ConversationBeanMap(request.getSession(), conversation.getId()));
@@ -125,6 +121,7 @@
       SessionContext.INSTANCE.setBeanMap(null);
       endConversation();
       ConversationContext.INSTANCE.setBeanMap(null);
+      CurrentManager.rootManager().getInstanceByType(SessionManager.class).setSession(null);      
    }
 
    private static void endConversation()

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java	2009-02-04 07:47:37 UTC (rev 1406)
@@ -0,0 +1,24 @@
+package org.jboss.webbeans.servlet;
+
+import javax.context.RequestScoped;
+import javax.inject.Produces;
+import javax.servlet.http.HttpSession;
+
+ at RequestScoped
+public class SessionManager
+{
+   private HttpSession session;
+
+   public void setSession(HttpSession session)
+   {
+      this.session = session;
+   }
+
+   @Produces
+   @RequestScoped
+   HttpSession produceSession()
+   {
+      return session;
+   }
+
+}




More information about the weld-commits mailing list