diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java index 8770d9a20..a10fabff3 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -227,22 +227,13 @@ public class StaticParametersInterceptor extends AbstractInterceptor { protected void addParametersToContext(ActionContext ac, Map newParams) { HttpParameters previousParams = ac.getParameters(); - HttpParameters.Builder combinedParams = HttpParameters.create(); + HttpParameters.Builder combinedParams; if (overwrite) { - if (previousParams != null) { - combinedParams = combinedParams.withParent(previousParams); - } - if (newParams != null) { - combinedParams = combinedParams.withExtraParams(newParams); - } + combinedParams = HttpParameters.create().withParent( previousParams); + combinedParams = combinedParams.withExtraParams(newParams); } else { - if (newParams != null) { - HttpParameters newHttpParameters = HttpParameters.create(newParams).build(); - combinedParams = combinedParams.withParent(newHttpParameters); - } - if (previousParams != null) { - combinedParams = combinedParams.withExtraParams(previousParams); - } + combinedParams = HttpParameters.create(newParams); + combinedParams = combinedParams.withExtraParams(previousParams); } ac.setParameters(combinedParams.build()); } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java b/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java index c01962f04..d96614205 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java @@ -192,7 +192,11 @@ public class HttpParameters implements Map, Cloneable { for (Map.Entry entry : requestParameterMap.entrySet()) { String name = entry.getKey(); Object value = entry.getValue(); - parameters.put(name, new Parameter.Request(name, value)); + if (value instanceof Parameter) { + parameters.put(name, (Parameter) value); + } else { + parameters.put(name, new Parameter.Request(name, value)); + } } return new HttpParameters(parameters); diff --git a/core/src/test/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptorTest.java b/core/src/test/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptorTest.java index 7e3d60876..4f996f617 100644 --- a/core/src/test/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptorTest.java @@ -28,6 +28,7 @@ import com.opensymphony.xwork2.mock.MockActionInvocation; import com.opensymphony.xwork2.mock.MockActionProxy; import org.apache.struts2.dispatcher.HttpParameters; +import java.util.HashMap; import java.util.Map; /** @@ -139,6 +140,51 @@ public class StaticParametersInterceptorTest extends XWorkTestCase { assertEquals(0, ActionContext.getContext().getParameters().keySet().size()); } + public void testOverwrite() throws Exception { + MockActionInvocation mai = new MockActionInvocation(); + MockActionProxy map = new MockActionProxy(); + ActionConfig ac = new ActionConfig.Builder("", "", "") + .addParam("name", "${hero}") + .build(); + map.setConfig(ac); + mai.setProxy(map); + mai.setAction(new SimpleFooAction()); + + Map existingParams = new HashMap<>(); + existingParams.put("name", "Akash"); + ActionContext.getContext().setParameters(HttpParameters.create(existingParams).build()); + int before = ActionContext.getContext().getValueStack().size(); + + interceptor.setOverwrite("true"); + interceptor.intercept(mai); + + assertEquals(before, ActionContext.getContext().getValueStack().size()); + assertEquals("${hero}", ActionContext.getContext().getParameters().get("name").toString()); + } + + public void testNoOverwrite() throws Exception { + MockActionInvocation mai = new MockActionInvocation(); + MockActionProxy map = new MockActionProxy(); + ActionConfig ac = new ActionConfig.Builder("", "", "") + .addParam("name", "${hero}") + .build(); + map.setConfig(ac); + mai.setProxy(map); + mai.setAction(new SimpleFooAction()); + mai.setInvocationContext(ActionContext.getContext()); + + Map existingParams = new HashMap<>(); + existingParams.put("name", "Akash"); + ActionContext.getContext().setParameters(HttpParameters.create(existingParams).build()); + int before = ActionContext.getContext().getValueStack().size(); + + interceptor.setOverwrite("false"); + interceptor.intercept(mai); + + assertEquals(before, ActionContext.getContext().getValueStack().size()); + assertEquals("Akash", ActionContext.getContext().getParameters().get("name").toString()); + } + public void testFewParametersParse() throws Exception { MockActionInvocation mai = new MockActionInvocation(); MockActionProxy map = new MockActionProxy();