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..");
+ }
+ }
}
}