Author: musachy
Date: Wed Mar 18 14:36:33 2009
New Revision: 755605
URL: http://svn.apache.org/viewvc?rev=755605&view=rev
Log:
WW-3046 Make "redirect" result support params (passed from <param>), like
"redirectAction" does
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java?rev=755605&r1=755604&r2=755605&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
Wed Mar 18 14:36:33 2009
@@ -131,9 +131,6 @@
protected String actionName;
protected String namespace;
protected String method;
- protected boolean supressEmptyParameters = false;
-
- private Map<String, String> requestParameters = new LinkedHashMap<String,
String>();
public ServletActionRedirectResult() {
super();
@@ -154,9 +151,6 @@
this.method = method;
}
- protected List<String> prohibitedResultParam = Arrays.asList(new String[] {
- DEFAULT_PARAM, "namespace", "method", "encode", "parse",
"location",
- "prependServletContext", "supressEmptyParameters" });
/**
* @see
com.opensymphony.xwork2.Result#execute(com.opensymphony.xwork2.ActionInvocation)
@@ -175,27 +169,7 @@
method = conditionalParse(method, invocation);
}
- String resultCode = invocation.getResultCode();
- if (resultCode != null) {
- ResultConfig resultConfig =
invocation.getProxy().getConfig().getResults().get(
- resultCode);
- Map resultConfigParams = resultConfig.getParams();
- for (Iterator i = resultConfigParams.entrySet().iterator();
i.hasNext(); ) {
- Map.Entry e = (Map.Entry) i.next();
- if (! prohibitedResultParam.contains(e.getKey())) {
- requestParameters.put(e.getKey().toString(),
- e.getValue() == null ? "":
- conditionalParse(e.getValue().toString(),
invocation));
- String potentialValue = e.getValue() == null ? "":
conditionalParse(e.getValue().toString(), invocation);
- if (!supressEmptyParameters || ((potentialValue != null)
&& (potentialValue.length() > 0))) {
- requestParameters.put(e.getKey().toString(),
potentialValue);
- }
- }
- }
- }
-
StringBuilder tmpLocation = new
StringBuilder(actionMapper.getUriFromActionMapping(new
ActionMapping(actionName, namespace, method, null)));
- UrlHelper.buildParametersString(requestParameters, tmpLocation, "&");
setLocation(tmpLocation.toString());
@@ -229,29 +203,9 @@
this.method = method;
}
- /**
- * Sets the supressEmptyParameters option
- *
- * @param suppress The new value for this option
- */
- public void setSupressEmptyParameters(boolean supressEmptyParameters) {
- this.supressEmptyParameters = supressEmptyParameters;
- }
-
- /**
- * Adds a request parameter to be added to the redirect url
- *
- * @param key The parameter name
- * @param value The parameter value
- */
- public ServletActionRedirectResult addParameter(String key, Object value) {
- requestParameters.put(key, String.valueOf(value));
- return this;
+ protected List<String> getProhibitedResultParams() {
+ return Arrays.asList(new String[]{
+ DEFAULT_PARAM, "namespace", "method", "encode", "parse",
"location",
+ "prependServletContext", "supressEmptyParameters"});
}
-
- public void handle(ReflectionException ex) {
- // Only log as debug as they are probably parameters to be appended to
the url
- LOG.debug(ex.getMessage(), ex);
- }
-
}
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java?rev=755605&r1=755604&r2=755605&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
Wed Mar 18 14:36:33 2009
@@ -26,16 +26,25 @@
import static javax.servlet.http.HttpServletResponse.*;
import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.views.util.UrlHelper;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.util.reflection.ReflectionException;
+import com.opensymphony.xwork2.util.reflection.ReflectionExceptionHandler;
import java.io.IOException;
+import java.util.Map;
+import java.util.LinkedHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Arrays;
/**
@@ -81,7 +90,7 @@
* <!-- END SNIPPET: example --></pre>
*
*/
-public class ServletRedirectResult extends StrutsResultSupport {
+public class ServletRedirectResult extends StrutsResultSupport implements
ReflectionExceptionHandler {
private static final long serialVersionUID = 6316947346435301270L;
@@ -93,6 +102,10 @@
protected int statusCode = SC_FOUND;
+ protected boolean supressEmptyParameters = false;
+
+ protected Map<String, String> requestParameters = new
LinkedHashMap<String, String>();
+
public ServletRedirectResult() {
super();
}
@@ -153,7 +166,26 @@
finalLocation = request.getContextPath() + finalLocation;
}
- finalLocation = response.encodeRedirectURL(finalLocation);
+ ResultConfig resultConfig =
invocation.getProxy().getConfig().getResults().get(invocation.getResultCode());
+ Map resultConfigParams = resultConfig.getParams();
+ for (Iterator i = resultConfigParams.entrySet().iterator();
i.hasNext();) {
+ Map.Entry e = (Map.Entry) i.next();
+
+ if (!getProhibitedResultParams().contains(e.getKey())) {
+ requestParameters.put(e.getKey().toString(),
+ e.getValue() == null ? "" :
+ conditionalParse(e.getValue().toString(),
invocation));
+ String potentialValue = e.getValue() == null ? "" :
conditionalParse(e.getValue().toString(), invocation);
+ if (!supressEmptyParameters || ((potentialValue != null)
&& (potentialValue.length() > 0))) {
+ requestParameters.put(e.getKey().toString(),
potentialValue);
+ }
+ }
+ }
+
+ StringBuilder tmpLocation = new StringBuilder(finalLocation);
+ UrlHelper.buildParametersString(requestParameters, tmpLocation,
"&");
+
+ finalLocation = response.encodeRedirectURL(tmpLocation.toString());
}
if (LOG.isDebugEnabled()) {
@@ -163,6 +195,13 @@
sendRedirect(response, finalLocation);
}
+ protected List<String> getProhibitedResultParams() {
+ return Arrays.asList(new String[]{
+ DEFAULT_PARAM, "namespace", "method", "encode", "parse",
"location",
+ "prependServletContext", "supressEmptyParameters"});
+ }
+
+
/**
* Sends the redirection. Can be overridden to customize how the redirect
is handled (i.e. to use a different
* status code)
@@ -189,4 +228,29 @@
// either before the port, or after the protocol
return (url.indexOf(':') == -1);
}
+
+ /**
+ * Sets the supressEmptyParameters option
+ *
+ * @param suppress The new value for this option
+ */
+ public void setSupressEmptyParameters(boolean supressEmptyParameters) {
+ this.supressEmptyParameters = supressEmptyParameters;
+ }
+
+ /**
+ * Adds a request parameter to be added to the redirect url
+ *
+ * @param key The parameter name
+ * @param value The parameter value
+ */
+ public ServletRedirectResult addParameter(String key, Object value) {
+ requestParameters.put(key, String.valueOf(value));
+ return this;
+ }
+
+ public void handle(ReflectionException ex) {
+ // Only log as debug as they are probably parameters to be appended to
the url
+ LOG.debug(ex.getMessage(), ex);
+ }
}
Modified:
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java?rev=755605&r1=755604&r2=755605&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
(original)
+++
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
Wed Mar 18 14:36:33 2009
@@ -22,6 +22,7 @@
package org.apache.struts2.dispatcher;
import java.util.HashMap;
+import java.util.Map;
import java.io.StringWriter;
import java.io.PrintWriter;
@@ -34,15 +35,23 @@
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.StrutsTestCase;
+import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.config.StrutsXmlConfigurationProvider;
import org.springframework.mock.web.MockServletContext;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.mock.MockActionInvocation;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -138,6 +147,59 @@
responseMock.verify();
}
+ public void testIncludeParameterInResult() throws Exception {
+
+ ResultConfig resultConfig = new ResultConfig.Builder("", "")
+ .addParam("namespace", "someNamespace")
+ .addParam("encode", "true")
+ .addParam("parse", "true")
+ .addParam("location", "someLocation")
+ .addParam("prependServletContext", "true")
+ .addParam("method", "someMethod")
+ .addParam("param1", "value 1")
+ .addParam("param2", "value 2")
+ .addParam("param3", "value 3")
+ .build();
+
+ ActionContext context = ActionContext.getContext();
+ MockHttpServletRequest req = new MockHttpServletRequest();
+ MockHttpServletResponse res = new MockHttpServletResponse();
+ context.put(ServletActionContext.HTTP_REQUEST, req);
+ context.put(ServletActionContext.HTTP_RESPONSE, res);
+
+
+ Map<String, ResultConfig> results= new HashMap<String,
ResultConfig>();
+ results.put("myResult", resultConfig);
+
+ ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
+ .addResultConfigs(results).build();
+
+ ServletRedirectResult result = new ServletRedirectResult();
+ result.setLocation("/myNamespace/myAction.action");
+ result.setParse(false);
+ result.setEncode(false);
+ result.setPrependServletContext(false);
+
+ IMocksControl control = EasyMock.createControl();
+ ActionProxy mockActionProxy = control.createMock(ActionProxy.class);
+ ActionInvocation mockInvocation =
control.createMock(ActionInvocation.class);
+ mockInvocation.getProxy();
+ control.andReturn(mockActionProxy);
+ mockInvocation.getResultCode();
+ control.andReturn("myResult");
+ mockActionProxy.getConfig();
+ control.andReturn(actionConfig);
+ mockInvocation.getInvocationContext();
+ control.andReturn(context);
+
+ control.replay();
+ result.setActionMapper(container.getInstance(ActionMapper.class));
+ result.execute(mockInvocation);
+
assertEquals("/myNamespace/myAction.action?param1=value+1¶m2=value+2¶m3=value+3",
res.getRedirectedUrl());
+
+ control.verify();
+ }
+
protected void setUp() throws Exception {
super.setUp();
configurationManager.getConfiguration().
@@ -151,11 +213,24 @@
requestMock = new Mock(HttpServletRequest.class);
requestMock.matchAndReturn("getContextPath", "/context");
+ ResultConfig resultConfig = new ResultConfig.Builder("", "").build();
+
+ Map<String, ResultConfig> results= new HashMap<String,
ResultConfig>();
+ results.put("myResult", resultConfig);
+
+ ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
+ .addResultConfigs(results).build();
+
ActionContext ac = new ActionContext(Ognl.createDefaultContext(null));
ac.put(ServletActionContext.HTTP_REQUEST, requestMock.proxy());
ac.put(ServletActionContext.HTTP_RESPONSE, responseMock.proxy());
MockActionInvocation ai = new MockActionInvocation();
ai.setInvocationContext(ac);
+ ai.setResultCode("myResult");
+ ActionProxy mockActionProxy =
EasyMock.createNiceMock(ActionProxy.class);
+ ai.setProxy(mockActionProxy);
+
EasyMock.expect(mockActionProxy.getConfig()).andReturn(actionConfig).anyTimes();
+ EasyMock.replay(mockActionProxy);
this.ai = ai;
ai.setStack(ActionContext.getContext().getValueStack());
}