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

svn commit: r945341 - /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java

Author: jakobk
Date: Mon May 17 20:18:39 2010
New Revision: 945341

URL: http://svn.apache.org/viewvc?rev=945341&view=rev
Log:
MYFACES-2719 faces-redirect=true lost the url parameters

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.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=945341&r1=945340&r2=945341&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 Mon May 17 20:18:39 2010
@@ -43,6 +43,7 @@ import javax.faces.context.PartialViewCo
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.config.element.NavigationRule;
 import org.apache.myfaces.shared_impl.util.HashMapUtils;
+import org.apache.myfaces.shared_impl.util.StringUtils;
 
 /**
  * @author Thomas Spiegl (latest modification by $Author$)
@@ -212,7 +213,6 @@ public class NavigationHandlerImpl
      * 
      * TODO: cache results?
      */
-    
     private NavigationCase getOutcomeNavigationCase (FacesContext facesContext, String fromAction, String outcome)
     {
         String implicitViewId = null;
@@ -234,14 +234,12 @@ public class NavigationHandlerImpl
             viewIdToTest = viewIdToTest.substring (0, index);
             
             // If queryString contains "faces-redirect=true", set isRedirect to true.
-            
             if (queryString.indexOf ("faces-redirect=true") != -1)
             {
                 isRedirect = true;
             }
             
             // If queryString contains "includeViewParams=true", set includeViewParams to true.
-            
             if (queryString.indexOf ("includeViewParams=true") != -1)
             {
                 includeViewParams = true;
@@ -300,22 +298,45 @@ public class NavigationHandlerImpl
         
         if (implicitViewId != null)
         {
+            // Append all params from the queryString
+            // (excluding faces-redirect and includeViewParams)
             Map<String, List<String>> params = new HashMap<String, List<String>>();
-            
-            // Append queryString to implicitViewId if it exists.
-            
-//            if (queryString != null)
-//            {
-//                implicitViewId += "?" + queryString;
-//            }
+            if (queryString != null && !"".equals(queryString))
+            {
+                String[] splitQueryParams = queryString.split("&(amp;)?"); // "&" or "&amp;"
+                for (String queryParam : splitQueryParams)
+                {
+                    String[] splitParam = StringUtils.splitShortString(queryParam, '=');
+                    if (splitParam.length == 2)
+                    {
+                        // valid parameter - add it to params
+                        if ("includeViewParams".equals(splitParam[0])
+                                || "faces-redirect".equals(splitParam[0]))
+                        {
+                            // ignore includeViewParams and faces-redirect
+                            continue;
+                        }
+                        List<String> paramValues = params.get(splitParam[0]);
+                        if (paramValues == null)
+                        {
+                            // no value for the given parameter yet
+                            paramValues = new ArrayList<String>();
+                            params.put(splitParam[0], paramValues);
+                        }
+                        paramValues.add(splitParam[1]);
+                    }
+                    else
+                    {
+                        // invalid parameter
+                        throw new FacesException("Invalid parameter \"" + 
+                                queryParam + "\" in outcome " + outcome);
+                    }
+                }
+            }
             
             // Finally, create the NavigationCase.
-            
-            // FIXME: the spec doesn't really say how the redirect parameters are supposed to be
-            // populated.  Assuming for now that they should stay empty...
-            
-            result = new NavigationCase (viewId, fromAction, outcome, null, implicitViewId, params,
-                isRedirect, includeViewParams);
+            result = new NavigationCase (viewId, fromAction, outcome, null, 
+                    implicitViewId, params, isRedirect, includeViewParams);
         }
         
         return result;