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;