Author: musachy Date: Wed May 21 14:31:04 2008 New Revision: 658883 URL: http://svn.apache.org/viewvc?rev=658883&view=rev Log: WW-2120 Dispatcher does not put request parameters of new url on the value stack.
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java?rev=658883&r1=658882&r2=658883&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java Wed May 21 14:31:04 2008 @@ -21,12 +21,15 @@ package org.apache.struts2.dispatcher; +import java.util.Map; + import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; import org.apache.struts2.ServletActionContext; +import org.apache.struts2.views.util.UrlHelper; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.util.logging.Logger; @@ -123,6 +126,17 @@ HttpServletResponse response = ServletActionContext.getResponse(); RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation); + //add parameters passed on the location to #parameters + // see WW-2120 + if (invocation != null && finalLocation != null && finalLocation.length() > 0 + && finalLocation.indexOf("?") > 0) { + String queryString = finalLocation.substring(finalLocation.indexOf("?") + 1); + Map parameters = (Map) invocation.getInvocationContext().getContextMap().get("parameters"); + Map queryParams = UrlHelper.parseQueryString(queryString, true); + if (queryParams != null && !queryParams.isEmpty()) + parameters.putAll(queryParams); + } + // if the view doesn't exist, let's do a 404 if (dispatcher == null) { response.sendError(404, "result '" + finalLocation + "' not found"); 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?rev=658883&r1=658882&r2=658883&view=diff ============================================================================== --- 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 Wed May 21 14:31:04 2008 @@ -75,12 +75,12 @@ public static String buildUrl(String action, HttpServletRequest request, HttpServletResponse response, Map params, String scheme, boolean includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort) { return buildUrl(action, request, response, params, scheme, includeContext, encodeResult, forceAddSchemeHostAndPort, true); } - + public static String buildUrl(String action, HttpServletRequest request, HttpServletResponse response, Map params, String scheme, boolean includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort, boolean escapeAmp) { StringBuffer link = new StringBuffer(); boolean changedScheme = false; - + // FIXME: temporary hack until class is made a properly injected bean Container cont = ActionContext.getContext().getContainer(); int httpPort = Integer.parseInt(cont.getInstance(String.class, StrutsConstants.STRUTS_URL_HTTP_PORT)); @@ -173,13 +173,13 @@ buildParametersString(params, link); } else { buildParametersString(params, link, "&"); - } + } String result = link.toString(); - + while (result.indexOf("<script>") > 0){ result = result.replaceAll("<script>", "script"); - } + } try { result = encodeResult ? response.encodeURL(result) : result; } catch (Exception ex) { @@ -236,23 +236,23 @@ } else { link.append(buildParameterSubstring(name, value.toString())); } - + 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. @@ -292,11 +292,11 @@ private static String getEncodingFromConfiguration() { final String encoding; - + // FIXME: temporary hack until class is made a properly injected bean Container cont = ActionContext.getContext().getContainer(); String customEncoding = cont.getInstance(String.class, StrutsConstants.STRUTS_I18N_ENCODING); - + if (customEncoding != null) { encoding = customEncoding; } else { @@ -306,6 +306,10 @@ } public static Map parseQueryString(String queryString) { + return parseQueryString(queryString, false); + } + + public static Map parseQueryString(String queryString, boolean forceValueArray) { Map queryParams = new LinkedHashMap(); if (queryString != null) { String[] params = queryString.split("&"); @@ -323,7 +327,7 @@ if (paramName != null) { String translatedParamValue = translateAndDecode(paramValue); - if(queryParams.containsKey(paramName)) { + if(queryParams.containsKey(paramName) || forceValueArray) { // WW-1619 append new param value to existing value(s) Object currentParam = queryParams.get(paramName); if(currentParam instanceof String) { @@ -331,13 +335,17 @@ (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)); + if (currentParamValues != null) { + 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, new String[] {translatedParamValue}); + } } } else { queryParams.put(paramName, translatedParamValue);