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&p1=a&p1=b&p2=d&p2=e&p3=f&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; + } + + } }