From 774490420b0dbc5f39f77c8667a9df4ab99afd9c 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 9f0f11790..7c120310a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -238,10 +238,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 47b7c58ef67891d2bfb03fc6cc8beab55b834add 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 7c120310a..f4079b834 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -228,22 +228,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 7746f2d66..695d641d2 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java @@ -190,7 +190,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();