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 2007/10/04 13:20:06 UTC
svn commit: r581852 -
/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java
Author: skitching
Date: Thu Oct 4 04:20:05 2007
New Revision: 581852
URL: http://svn.apache.org/viewvc?rev=581852&view=rev
Log:
INCOMPATIBLE CHANGE:
Change behavior of ox:endConversation tag when null is returned by an action method; the conversation is now never
terminated in this case. Previously, it was terminated if onOutcomes was null, and not terminated otherwise.
Modified:
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java
Modified: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java?rev=581852&r1=581851&r2=581852&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java (original)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/lib/EndConversationMethodBindingFacade.java Thu Oct 4 04:20:05 2007
@@ -19,9 +19,7 @@
package org.apache.myfaces.orchestra.conversation.jsf.lib;
-import org.apache.myfaces.orchestra.conversation.ConversationManager;
-import org.apache.myfaces.orchestra.conversation.ConversationUtils;
-import org.apache.myfaces.orchestra.conversation._ConversationUtils;
+import java.util.Collection;
import javax.faces.FacesException;
import javax.faces.component.StateHolder;
@@ -30,7 +28,9 @@
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.el.MethodNotFoundException;
-import java.util.Collection;
+
+import org.apache.myfaces.orchestra.conversation.ConversationManager;
+import org.apache.myfaces.orchestra.conversation.ConversationUtils;
/**
* A facade for the original method binding to deal with end conversation conditions.
@@ -64,19 +64,20 @@
* @param conversation is the name of the conversation to conditionally be closed.
*
* @param onOutcomes is a collection of navigation strings that may be returned from the
- * invoked method. If the returned value <i>is</i> in this list then the named conversation
- * is ended (and possibly restarted), ie all beans currently in the conversation are discarded.
- * If the returned value is not in this list then the conversation is not affected. If this
- * property is null then the conversation is always ended (except in the case where an
- * exception is thrown by the action method and no errorOutcome is specified). Note that if
- * onOutcomes is not null, then there is no way to specify that the conversation should
- * terminate if the action method returns null.
+ * invoked method. The following rules are then followed to determine whether the conversation
+ * is ended or not:
+ * <ul>
+ * <li>If the action returned null, then the conversation is never ended.
+ * <li>If the onOutcomes list is null or empty then the conversation is always ended.
+ * <li>Otherwise, the conversation ends only if the returned value is in the onOutcomes list.
+ * </ul>
*
* @param original is the EL expression to be invoked.
*
* @param errorOutcome is a JSF navigation string to be returned if the action method
* throws an exception of any kind. This navigation value is checked against the onOutcomes
- * values just as if the action method had actually returned this value.
+ * values just as if the action method had actually returned this value. When not specified,
+ * then on exception the current conversation is not terminated.
*/
public EndConversationMethodBindingFacade(
String conversation,
@@ -115,7 +116,6 @@
public Object invoke(FacesContext context, Object[] values) throws EvaluationException, MethodNotFoundException
{
- boolean ok = true;
Object returnValue = null;
//noinspection CatchGenericClass
try
@@ -131,35 +131,46 @@
if (errorOutcome != null)
{
- conversationManager.getMessager().setConversationException(t);
+ // Suppress the exception, and act as if errorOutcome had been returned.
+ conversationManager.getMessager().setConversationException(t);
returnValue = errorOutcome;
}
else
{
- // In this case, suppress the onOutcomes checking so the conversation
- // doesn't get ended.
+ // When no errorOutcomes are specified, then there is nothing to check against
+ // the onOutcomes list.
//
- // TODO: perhaps the conversation should ALWAYS be ended on exception,
- // instead of NEVER?
- ok = false;
+ // Note that in this case the conversation is NEVER ended. It is debatable what
+ // the correct behaviour should be here. If this action wrapper was not present
+ // then the conversation would not be terminated, so an instance with no
+ // errorOutcomes specified is consistent with that. In any case, the user can
+ // easily get the alternate behaviour by simply specifying an errorOutcome and
+ // adding that to the onOutcomes list.
+
+ returnValue = null; // do not end conversation
throw new FacesException(t);
}
}
finally
{
- boolean end = true;
- if (ok)
+ boolean endConversation;
+ if (returnValue == null)
+ {
+ endConversation = false;
+ }
+ else if (onOutcomes == null || onOutcomes.isEmpty())
+ {
+ endConversation = true;
+ }
+ else
+ {
+ endConversation = onOutcomes.contains(returnValue);
+ }
+
+ if (endConversation)
{
- if (onOutcomes != null && onOutcomes.size() > 0)
- {
- end = onOutcomes.contains(returnValue);
- }
-
- if (end)
- {
- ConversationUtils.invalidateIfExists(conversationName);
- }
+ ConversationUtils.invalidateIfExists(conversationName);
}
}
return returnValue;