Author: husted
Date: Mon Mar 12 13:05:02 2007
New Revision: 517363
URL: http://svn.apache.org/viewvc?view=rev&rev=517363
Log:
WW-1619 URL component and URLHelper class do not handle multiple request
parameters with the same name correctly when includeParams="get". Apply patch
submitted by Tom Schneider.
Added:
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/components/URLTest.java
Modified:
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
Modified:
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
URL:
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java?view=diff&rev=517363&r1=517362&r2=517363
==============================================================================
---
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
(original)
+++
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
Mon Mar 12 13:05:02 2007
@@ -24,9 +24,11 @@
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
-import java.util.Collections;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -37,7 +39,6 @@
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsConstants;
-import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.TextParseUtil;
import com.opensymphony.xwork2.util.ValueStack;
@@ -61,21 +62,21 @@
private static final int DEFAULT_HTTPS_PORT = 443;
private static final String AMP = "&";
-
+
private static int httpPort = DEFAULT_HTTP_PORT;
private static int httpsPort = DEFAULT_HTTPS_PORT;
private static String customEncoding;
-
+
@Inject(StrutsConstants.STRUTS_URL_HTTP_PORT)
public static void setHttpPort(String val) {
httpPort = Integer.parseInt(val);
}
-
+
@Inject(StrutsConstants.STRUTS_URL_HTTPS_PORT)
public static void setHttpsPort(String val) {
httpsPort = Integer.parseInt(val);
}
-
+
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setCustomEncoding(String val) {
customEncoding = val;
@@ -297,7 +298,26 @@
}
if (paramName != null) {
String translatedParamValue =
translateAndDecode(paramValue);
- queryParams.put(paramName, translatedParamValue);
+
+ if(queryParams.containsKey(paramName)) {
+ // WW-1619 append new param value to existing
value(s)
+ Object currentParam = queryParams.get(paramName);
+ if(currentParam instanceof String) {
+ queryParams.put(paramName, new String[] {
+ (String) currentParam,
translatedParamValue});
+ } else {
+ String currentParamValues[] = (String[])
currentParam;
+ List paramList = new ArrayList(Arrays
+ .asList(currentParamValues));
+ paramList.add(translatedParamValue);
+ String newParamValues[] = new String[paramList
+ .size()];
+ queryParams.put(paramName, paramList
+ .toArray(newParamValues));
+ }
+ } else {
+ queryParams.put(paramName, translatedParamValue);
+ }
}
}
}
Added:
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/components/URLTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/components/URLTest.java?view=auto&rev=517363
==============================================================================
---
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/components/URLTest.java
(added)
+++
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/components/URLTest.java
Mon Mar 12 13:05:02 2007
@@ -0,0 +1,57 @@
+package org.apache.struts2.components;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.struts2.views.jsp.AbstractTagTest;
+
+/**
+ * Verifies correct operation of parameter merging.
+ *
+ * Contributed by: Daniel Uribe
+ */
+public class URLTest extends AbstractTagTest {
+ public void testIncludeGetDuplicateRequestParams() throws Exception {
+ String body = "";
+
+ Map parameterMap = new HashMap();
+ parameterMap.put("param", new String[] { "1", "2", "3" });
+
+ request.setQueryString("param=1¶m=2¶m=3");
+ request.setScheme("http");
+ request.setParameterMap(parameterMap);
+ URL url = new URL(stack, request, response);
+ url.setIncludeParams(URL.GET);
+ url.setIncludeContext(false);
+ url.setValue("myAction.action");
+ url.setNamespace("");
+
+ url.start(writer);
+ url.end(writer, body);
+
+ assertEquals("myAction.action?param=1&param=2&param=3",
+ writer.toString());
+ }
+
+ public void testIncludeAllDuplicateRequestParams() throws Exception {
+ String body = "";
+
+ Map parameterMap = new HashMap();
+ parameterMap.put("param", new String[] { "1", "2", "3" });
+
+ request.setQueryString("param=1¶m=2¶m=3");
+ request.setScheme("http");
+ request.setParameterMap(parameterMap);
+ URL url = new URL(stack, request, response);
+ url.setIncludeParams(URL.ALL);
+ url.setIncludeContext(false);
+ url.setValue("myAction.action");
+ url.setNamespace("");
+
+ url.start(writer);
+ url.end(writer, body);
+
+ assertEquals("myAction.action?param=1&param=2&param=3",
+ writer.toString());
+ }
+}
Modified:
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java?view=diff&rev=517363&r1=517362&r2=517363
==============================================================================
---
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
(original)
+++
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
Mon Mar 12 13:05:02 2007
@@ -20,6 +20,7 @@
*/
package org.apache.struts2.views.util;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -28,7 +29,6 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsTestCase;
import com.mockobjects.dynamic.Mock;
@@ -110,8 +110,6 @@
expectedUrl, url.toString());
}
-
-
public void testBuildWithRootContext() {
String expectedUrl = "/MyAction.action";
@@ -320,6 +318,31 @@
assertEquals(result.size(), 0);
}
+ public void testParseMultiQuery() throws Exception {
+ Map result = UrlHelper.parseQueryString("param=1¶m=1¶m=1");
+
+ assertNotNull(result);
+ assertEquals(result.size(), 1);
+ String values[] = (String[]) result.get("param");
+ Arrays.sort(values);
+ assertEquals(values.length, 3);
+ assertEquals(values[0], "1");
+ assertEquals(values[1], "1");
+ assertEquals(values[2], "1");
+ }
+
+ public void testParseDuplicateQuery() throws Exception {
+ Map result = UrlHelper.parseQueryString("param=1¶m=2¶m=3");
+
+ assertNotNull(result);
+ assertEquals(result.size(), 1);
+ String values[] = (String[]) result.get("param");
+ Arrays.sort(values);
+ assertEquals(values.length, 3);
+ assertEquals(values[0], "1");
+ assertEquals(values[1], "2");
+ assertEquals(values[2], "3");
+ }
public void testTranslateAndEncode() throws Exception {
UrlHelper.setCustomEncoding("UTF-8");