You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by cj...@apache.org on 2009/07/16 17:11:24 UTC
svn commit: r794712 - in
/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: application/
config/element/ config/impl/digester/ config/impl/digester/elements/
Author: cjhoward
Date: Thu Jul 16 15:11:23 2009
New Revision: 794712
URL: http://svn.apache.org/viewvc?rev=794712&view=rev
Log:
MYFACES-2258 - add support for conditional navigation via <if>.
Modified:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/element/NavigationCase.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/DigesterFacesConfigUnmarshallerImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/elements/NavigationCase.java
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java?rev=794712&r1=794711&r2=794712&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java Thu Jul 16 15:11:23 2009
@@ -27,6 +27,8 @@
import java.util.List;
import java.util.Map;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewHandler;
@@ -138,7 +140,7 @@
if (casesList != null)
{
// Exact match?
- navigationCase = calcMatchingNavigationCase(casesList, fromAction, outcome);
+ navigationCase = calcMatchingNavigationCase(facesContext, casesList, fromAction, outcome);
}
if (navigationCase == null)
@@ -154,7 +156,7 @@
casesList = casesMap.get(fromViewId);
if (casesList != null)
{
- navigationCase = calcMatchingNavigationCase(casesList, fromAction, outcome);
+ navigationCase = calcMatchingNavigationCase(facesContext, casesList, fromAction, outcome);
if (navigationCase != null) break;
}
}
@@ -164,7 +166,7 @@
casesList = casesMap.get(fromViewId);
if (casesList != null)
{
- navigationCase = calcMatchingNavigationCase(casesList, fromAction, outcome);
+ navigationCase = calcMatchingNavigationCase(facesContext, casesList, fromAction, outcome);
if (navigationCase != null) break;
}
}
@@ -194,16 +196,93 @@
return null;
}
- private NavigationCase calcMatchingNavigationCase(List<? extends NavigationCase> casesList, String actionRef,
+ private NavigationCase calcMatchingNavigationCase(FacesContext context, List<? extends NavigationCase> casesList, String actionRef,
String outcome)
{
for (NavigationCase caze : casesList)
{
String cazeOutcome = caze.getFromOutcome();
String cazeActionRef = caze.getFromAction();
- if ((cazeOutcome == null || cazeOutcome.equals(outcome)) &&
- (cazeActionRef == null || cazeActionRef.equals(actionRef)))
- {
+ String cazeIf = caze.getIf();
+ ExpressionFactory expFactory = context.getApplication().getExpressionFactory();
+ boolean ifMatches = false;
+
+ // JSF 2.0: support conditional navigation via <if>.
+
+ // Use for later cases.
+
+ if (cazeIf != null) {
+ ValueExpression ifExpr = expFactory.createValueExpression (context.getELContext(), caze.getIf(), Boolean.class);
+ Boolean value = (Boolean) ifExpr.getValue (context.getELContext());
+
+ ifMatches = value.booleanValue();
+ }
+
+ if (cazeActionRef != null) {
+ if (cazeOutcome != null) {
+ if ((actionRef != null) && (outcome != null) && cazeActionRef.equals (actionRef) &&
+ cazeOutcome.equals (outcome)) {
+ // First case: match if <from-action> matches action and <from-outcome> matches outcome.
+ // Caveat: evaluate <if> if available.
+
+ if (cazeIf != null) {
+ return (ifMatches ? caze : null);
+ }
+
+ else {
+ return caze;
+ }
+ }
+ }
+
+ else {
+ if ((actionRef != null) && cazeActionRef.equals (actionRef)) {
+ // Third case: if only <from-action> specified, match against action.
+ // Caveat: if <if> is available, evaluate. If not, only match if outcome is not null.
+
+ if (cazeIf != null) {
+ return (ifMatches ? caze : null);
+ }
+
+ else {
+ return ((outcome != null) ? caze : null);
+ }
+ }
+ }
+ }
+
+ else {
+ if (cazeOutcome != null) {
+ if ((outcome != null) && cazeOutcome.equals (outcome)) {
+ // Second case: if only <from-outcome> specified, match against outcome.
+ // Caveat: if <if> is available, evaluate.
+
+ if (cazeIf != null) {
+ return (ifMatches ? caze : null);
+ }
+
+ else {
+ return caze;
+ }
+ }
+ }
+ }
+
+ // Fourth case: anything else matches if outcome is not null or <if> is specified.
+
+ if (outcome != null) {
+ // Again, if <if> present, evaluate.
+
+ if (cazeIf != null) {
+ return (ifMatches ? caze : null);
+ }
+
+ else {
+ return caze;
+ }
+ }
+
+ if ((cazeIf != null) && ifMatches) {
return caze;
}
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/element/NavigationCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/element/NavigationCase.java?rev=794712&r1=794711&r2=794712&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/element/NavigationCase.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/element/NavigationCase.java Thu Jul 16 15:11:23 2009
@@ -32,6 +32,7 @@
public String getFromAction();
public String getFromOutcome();
+ public String getIf();
public boolean isRedirect();
public String getToViewId();
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/DigesterFacesConfigUnmarshallerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/DigesterFacesConfigUnmarshallerImpl.java?rev=794712&r1=794711&r2=794712&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/DigesterFacesConfigUnmarshallerImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/DigesterFacesConfigUnmarshallerImpl.java Thu Jul 16 15:11:23 2009
@@ -216,6 +216,7 @@
digester.addSetNext("faces-config/navigation-rule/navigation-case", "addNavigationCase");
digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-action", "setFromAction", 0);
digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-outcome", "setFromOutcome", 0);
+ digester.addCallMethod("faces-config/navigation-rule/navigation-case/if", "setIf", 0);
digester.addCallMethod("faces-config/navigation-rule/navigation-case/to-view-id", "setToViewId", 0);
digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect", "setRedirect");
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/elements/NavigationCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/elements/NavigationCase.java?rev=794712&r1=794711&r2=794712&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/elements/NavigationCase.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/impl/digester/elements/NavigationCase.java Thu Jul 16 15:11:23 2009
@@ -29,6 +29,7 @@
private String fromAction;
private String fromOutcome;
+ private String ifValue;
private String toViewId;
private boolean redirect;
@@ -55,8 +56,17 @@
{
this.fromOutcome = fromOutcome;
}
-
-
+
+ public String getIf ()
+ {
+ return ifValue;
+ }
+
+ public void setIf (String ifValue)
+ {
+ this.ifValue = ifValue;
+ }
+
public String getToViewId()
{
return toViewId;