From 9c45d6b02514590a2d020d806732a64a0235ae60 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Fri, 13 Nov 2020 17:20:23 +0100 Subject: [PATCH 1/2] WW-5096 Fixes params overwriting --- .../xwork2/interceptor/StaticParametersInterceptor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 6ec572a17..8770d9a20 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -237,10 +237,11 @@ public class StaticParametersInterceptor extends AbstractInterceptor { } } else { if (newParams != null) { - combinedParams = combinedParams.withExtraParams(newParams); + HttpParameters newHttpParameters = HttpParameters.create(newParams).build(); + combinedParams = combinedParams.withParent(newHttpParameters); } if (previousParams != null) { - combinedParams = combinedParams.withParent(previousParams); + combinedParams = combinedParams.withExtraParams(previousParams); } } ac.setParameters(combinedParams.build()); From d591b7e3b956ad34e1204da9e60382cc2fc4b2bf Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 18 Nov 2020 08:23:04 +0100 Subject: [PATCH 2/2] WW-5096 Adds tests to cover overwrite --- .../StaticParametersInterceptor.java | 19 ++------ .../struts2/dispatcher/HttpParameters.java | 6 ++- .../StaticParametersInterceptorTest.java | 46 +++++++++++++++++++ 3 files changed, 56 insertions(+), 15 deletions(-) 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();