Author: musachy
Date: Thu Jun  7 16:13:32 2007
New Revision: 545343

URL: http://svn.apache.org/viewvc?view=rev&rev=545343
Log:
WW-1971 Url tag should accept parameters that are Iterable as it does with 
String[]

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/URL.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/URL.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/URL.java?view=diff&rev=545343&r1=545342&r2=545343
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/URL.java 
(original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/URL.java 
Thu Jun  7 16:13:32 2007
@@ -50,7 +50,8 @@
  * <p>This tag is used to create a URL.</p>
  *
  * <p>You can use the "param" tag inside the body to provide
- * additional request parameters.</p>
+ * additional request parameters. If the value of a param is an Array or 
+ * an Iterable all the values will be added to the URL.</p>
  *
  * <b>NOTE:</b>
  * <p>When includeParams is 'all' or 'get', the parameter defined in param tag 
will take

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java?view=diff&rev=545343&r1=545342&r2=545343
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
 Thu Jun  7 16:13:32 2007
@@ -199,41 +199,53 @@
             // Set params
             Iterator iter = params.entrySet().iterator();
 
-            String[] valueHolder = new String[1];
 
             while (iter.hasNext()) {
                 Map.Entry entry = (Map.Entry) iter.next();
                 String name = (String) entry.getKey();
                 Object value = entry.getValue();
 
-                String[] values;
 
-                if (value instanceof String[]) {
-                    values = (String[]) value;
-                } else {
-                    valueHolder[0] = value.toString();
-                    values = valueHolder;
-                }
+                if (value instanceof Iterable) {
+                    for (Iterator iterator = ((Iterable) value).iterator(); 
iterator
+                        .hasNext();) {
+                        Object paramValue = iterator.next();
+                        link.append(buildParameterSubstring(name, paramValue
+                            .toString()));
 
-                for (int i = 0; i < values.length; i++) {
-                    if (values[i] != null) {
-                        link.append(name);
-                        link.append('=');
-                        link.append(translateAndEncode(values[i]));
+                        if (iterator.hasNext())
+                            link.append(paramSeparator);
                     }
+                } else if (value instanceof Object[]) {
+                    Object[] array = (Object[]) value;
+                    for (int i = 0; i < array.length; i++) {
+                        Object paramValue = array[i];
+                        link.append(buildParameterSubstring(name, paramValue
+                            .toString()));
 
-                    if (i < (values.length - 1)) {
-                        link.append(paramSeparator);
+                        if (i < array.length - 1)
+                            link.append(paramSeparator);
                     }
+                } else {
+                    link.append(buildParameterSubstring(name, 
value.toString()));
                 }
-
-                if (iter.hasNext()) {
+                
+                if (iter.hasNext())
                     link.append(paramSeparator);
-                }
             }
         }
     }
 
+    
+    private static String buildParameterSubstring(String name, String value) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(name);
+        builder.append('=');
+        builder.append(translateAndEncode(value));
+        
+        return builder.toString();
+    }
+    
     /**
      * Translates any script expressions using [EMAIL PROTECTED] 
com.opensymphony.xwork2.util.TextParseUtil#translateVariables} and
      * encodes the URL using [EMAIL PROTECTED] java.net.URLEncoder#encode} 
with the encoding specified in the configuration.

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java?view=diff&rev=545343&r1=545342&r2=545343
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
 Thu Jun  7 16:13:32 2007
@@ -20,7 +20,9 @@
  */
 package org.apache.struts2.views.jsp;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.jsp.JspWriter;
@@ -125,7 +127,31 @@
         assertEquals(parameters.get("param2"), "param2value");
     }
 
-
+    /**
+     * Use Iterable values as the value of the param tags
+     * @throws Exception
+     */
+    public void testIterableParameters() throws Exception {
+        tag.setValue("/TestAction.action?p0=z");
+        
+        tag.doStartTag();
+        //Iterable
+        List<ValueHolder> list = new ArrayList<ValueHolder>();
+        list.add(new ValueHolder("a"));
+        list.add(new ValueHolder("b"));
+        tag.component.addParameter("p1", list);
+        
+        //String[]
+        tag.component.addParameter("p2", new String[] { "d", "e" });
+        //ValueHolder[]
+        tag.component.addParameter("p3", new ValueHolder[] {
+                new ValueHolder("f"), new ValueHolder("g") });
+        
+        tag.doEndTag();
+        
+        
assertEquals("/TestAction.action?p0=z&amp;p1=a&amp;p1=b&amp;p2=d&amp;p2=e&amp;p3=f&amp;p3=g",
 writer.toString());
+    }
+    
     /**
      * To test priority of parameter passed in to url component though
      * various way, with includeParams="NONE"
@@ -476,5 +502,20 @@
         public String toString() {
             return "Foo is: " + title;
         }
+    }
+    
+    class ValueHolder {
+        private String value;
+
+        public ValueHolder(String value) {
+            this.value = value;
+        }
+
+        @Override
+        public String toString() {
+            return value;
+        }
+        
+        
     }
 }


Reply via email to