You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sk...@apache.org on 2009/05/18 17:48:05 UTC

svn commit: r775994 - /myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java

Author: skitching
Date: Mon May 18 15:48:05 2009
New Revision: 775994

URL: http://svn.apache.org/viewvc?rev=775994&view=rev
Log:
Use finally clause to ensure the thread's FrameworkAdapter is always restored after ConversationManager invalidation, even when something weird happens.

Modified:
    myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java

Modified: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java?rev=775994&r1=775993&r2=775994&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java (original)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/servlet/ConversationManagerSessionListener.java Mon May 18 15:48:05 2009
@@ -264,18 +264,34 @@
 
     private void removeAndInvalidateConversationManager(ConversationManager cm)
     {
-        FrameworkAdapter currentFrameworkAdapter = FrameworkAdapter.getCurrentInstance();
-
-        // ensure new FrameworkAdapter avoid OrchestraException "Cannot remove current context"
-        FrameworkAdapter fa = new LocalFrameworkAdapter();
-        ConversationMessager conversationMessager = new LogConversationMessager();
-        fa.setConversationMessager(conversationMessager);
-        FrameworkAdapter.setCurrentInstance(fa);
+        // Note: When a session has timed out normally, then  currentFrameworkAdapter will
+        // be null. But when a request calls session.invalidate directly, then this function
+        // is called within the thread of the request, and so will have a FrameworkAdapter
+        // in the current thread (which has been initialized with the http request object). 
 
-        cm.removeAndInvalidateAllConversationContexts();
-        conversationWiperThread.removeConversationManager(cm);
+        FrameworkAdapter currentFrameworkAdapter = FrameworkAdapter.getCurrentInstance();
+        try
+        {
+            // Always use a fresh FrameworkAdapter to avoid OrchestraException
+            // "Cannot remove current context" when a request calls session.invalidate();
+            // we want getRequestParameter and related functions to always return null.. 
+            FrameworkAdapter fa = new LocalFrameworkAdapter();
+            ConversationMessager conversationMessager = new LogConversationMessager();
+            fa.setConversationMessager(conversationMessager);
+            FrameworkAdapter.setCurrentInstance(fa);
+    
+            conversationWiperThread.removeConversationManager(cm);
+            cm.removeAndInvalidateAllConversationContexts();
+        }
+        finally
+        {
+            // Always restore original FrameworkAdapter.
+            FrameworkAdapter.setCurrentInstance(currentFrameworkAdapter);
 
-        // reset to old FrameworkAdapater
-        FrameworkAdapter.setCurrentInstance(currentFrameworkAdapter);
+            if (currentFrameworkAdapter != null)
+            {
+                log.warn("removeAndInvalidateConversationManager: currentFrameworkAdapter is not null..");
+            }
+        }
     }
 }