diff --git a/core/src/main/java/org/apache/struts2/ActionContext.java b/core/src/main/java/org/apache/struts2/ActionContext.java index 56163eacc..2f023bc51 100644 --- a/core/src/main/java/org/apache/struts2/ActionContext.java +++ b/core/src/main/java/org/apache/struts2/ActionContext.java @@ -548,4 +548,9 @@ public class ActionContext implements Serializable { } return Objects.equals(getContextMap(), other.getContextMap()); } + + @Override + public final int hashCode() { + return Objects.hash(getContextMap()); + } } diff --git a/core/src/main/java/org/apache/struts2/ModelDriven.java b/core/src/main/java/org/apache/struts2/ModelDriven.java index 30335a1ca..993a6f5eb 100644 --- a/core/src/main/java/org/apache/struts2/ModelDriven.java +++ b/core/src/main/java/org/apache/struts2/ModelDriven.java @@ -30,6 +30,9 @@ public interface ModelDriven { /** * Gets the model to be pushed onto the ValueStack instead of the Action itself. + *

+ * Please be aware that all setters and getters of every depth on the object returned by this method are available + * for user parameter injection! * * @return the model */ diff --git a/core/src/main/java/org/apache/struts2/config/entities/ResultConfig.java b/core/src/main/java/org/apache/struts2/config/entities/ResultConfig.java index 5e2a1daae..40d20838e 100644 --- a/core/src/main/java/org/apache/struts2/config/entities/ResultConfig.java +++ b/core/src/main/java/org/apache/struts2/config/entities/ResultConfig.java @@ -39,7 +39,7 @@ import java.util.Objects; */ public class ResultConfig extends Located implements Serializable { - protected Map params; + protected Map params; protected String className; protected String name; @@ -64,7 +64,7 @@ public class ResultConfig extends Located implements Serializable { return name; } - public Map getParams() { + public Map getParams() { return params; } @@ -139,7 +139,7 @@ public class ResultConfig extends Located implements Serializable { return this; } - public Builder addParams(Map params) { + public Builder addParams(Map params) { target.params.putAll(params); return this; } diff --git a/core/src/main/java/org/apache/struts2/config/impl/DefaultConfiguration.java b/core/src/main/java/org/apache/struts2/config/impl/DefaultConfiguration.java index b7bc93425..3ea854b21 100644 --- a/core/src/main/java/org/apache/struts2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/org/apache/struts2/config/impl/DefaultConfiguration.java @@ -66,7 +66,6 @@ import org.apache.struts2.factory.ActionFactory; import org.apache.struts2.factory.ConverterFactory; import org.apache.struts2.factory.DefaultActionFactory; import org.apache.struts2.factory.DefaultInterceptorFactory; -import org.apache.struts2.factory.DefaultResultFactory; import org.apache.struts2.factory.DefaultUnknownHandlerFactory; import org.apache.struts2.factory.DefaultValidatorFactory; import org.apache.struts2.factory.InterceptorFactory; @@ -109,6 +108,7 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.conversion.StrutsConversionPropertiesProcessor; import org.apache.struts2.conversion.StrutsTypeConverterCreator; import org.apache.struts2.conversion.StrutsTypeConverterHolder; +import org.apache.struts2.factory.StrutsResultFactory; import org.apache.struts2.ognl.OgnlGuard; import org.apache.struts2.ognl.ProviderAllowlist; import org.apache.struts2.ognl.StrutsOgnlGuard; @@ -364,7 +364,7 @@ public class DefaultConfiguration implements Configuration { // TODO: SpringObjectFactoryTest fails when these are SINGLETON .factory(ObjectFactory.class, Scope.PROTOTYPE) .factory(ActionFactory.class, DefaultActionFactory.class, Scope.PROTOTYPE) - .factory(ResultFactory.class, DefaultResultFactory.class, Scope.PROTOTYPE) + .factory(ResultFactory.class, StrutsResultFactory.class, Scope.PROTOTYPE) .factory(InterceptorFactory.class, DefaultInterceptorFactory.class, Scope.PROTOTYPE) .factory(ValidatorFactory.class, DefaultValidatorFactory.class, Scope.PROTOTYPE) .factory(ConverterFactory.class, StrutsConverterFactory.class, Scope.PROTOTYPE) diff --git a/core/src/main/java/org/apache/struts2/factory/DefaultResultFactory.java b/core/src/main/java/org/apache/struts2/factory/DefaultResultFactory.java index 202514ccd..54efb6972 100644 --- a/core/src/main/java/org/apache/struts2/factory/DefaultResultFactory.java +++ b/core/src/main/java/org/apache/struts2/factory/DefaultResultFactory.java @@ -31,7 +31,10 @@ import java.util.Map; /** * Default implementation + * + * @deprecated since 6.7.0, use {@link StrutsResultFactory} instead. */ +@Deprecated public class DefaultResultFactory implements ResultFactory { private ObjectFactory objectFactory; diff --git a/core/src/main/java/org/apache/struts2/interceptor/parameter/ParametersInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/parameter/ParametersInterceptor.java index 2a66b2118..63d94b388 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/parameter/ParametersInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/parameter/ParametersInterceptor.java @@ -18,11 +18,22 @@ */ package org.apache.struts2.interceptor.parameter; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.ClassUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.struts2.ActionContext; import org.apache.struts2.ActionInvocation; import org.apache.struts2.ModelDriven; +import org.apache.struts2.StrutsConstants; +import org.apache.struts2.action.NoParameters; +import org.apache.struts2.action.ParameterNameAware; +import org.apache.struts2.action.ParameterValueAware; +import org.apache.struts2.dispatcher.HttpParameters; +import org.apache.struts2.dispatcher.Parameter; import org.apache.struts2.inject.Inject; import org.apache.struts2.interceptor.MethodFilterInterceptor; +import org.apache.struts2.ognl.ThreadAllowlist; import org.apache.struts2.security.AcceptedPatternsChecker; import org.apache.struts2.security.DefaultAcceptedPatternsChecker; import org.apache.struts2.security.ExcludedPatternsChecker; @@ -32,17 +43,6 @@ import org.apache.struts2.util.TextParseUtil; import org.apache.struts2.util.ValueStack; import org.apache.struts2.util.ValueStackFactory; import org.apache.struts2.util.reflection.ReflectionContextState; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.ClassUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.struts2.StrutsConstants; -import org.apache.struts2.action.NoParameters; -import org.apache.struts2.action.ParameterNameAware; -import org.apache.struts2.action.ParameterValueAware; -import org.apache.struts2.dispatcher.HttpParameters; -import org.apache.struts2.dispatcher.Parameter; -import org.apache.struts2.ognl.ThreadAllowlist; import java.beans.BeanInfo; import java.beans.IntrospectionException; @@ -63,15 +63,15 @@ import java.util.Set; import java.util.TreeMap; import java.util.regex.Pattern; -import static org.apache.struts2.security.DefaultAcceptedPatternsChecker.NESTING_CHARS; -import static org.apache.struts2.security.DefaultAcceptedPatternsChecker.NESTING_CHARS_STR; -import static org.apache.struts2.util.DebugUtils.logWarningForFirstOccurrence; -import static org.apache.struts2.util.DebugUtils.notifyDeveloperOfError; import static java.lang.String.format; import static java.util.Collections.unmodifiableSet; import static java.util.stream.Collectors.joining; import static org.apache.commons.lang3.StringUtils.indexOfAny; import static org.apache.commons.lang3.StringUtils.normalizeSpace; +import static org.apache.struts2.security.DefaultAcceptedPatternsChecker.NESTING_CHARS; +import static org.apache.struts2.security.DefaultAcceptedPatternsChecker.NESTING_CHARS_STR; +import static org.apache.struts2.util.DebugUtils.logWarningForFirstOccurrence; +import static org.apache.struts2.util.DebugUtils.notifyDeveloperOfError; /** * This interceptor sets all parameters on the value stack. diff --git a/core/src/test/java/org/apache/struts2/interceptor/ChainingInterceptorWithConfigTest.java b/core/src/test/java/org/apache/struts2/interceptor/ChainingInterceptorWithConfigTest.java index 5d2e21dbc..211e7329b 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/ChainingInterceptorWithConfigTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/ChainingInterceptorWithConfigTest.java @@ -42,6 +42,7 @@ import org.apache.struts2.config.StrutsXmlConfigurationProvider; import java.util.Collections; import java.util.HashMap; +import java.util.Map; /** @@ -101,11 +102,11 @@ public class ChainingInterceptorWithConfigTest extends XWorkTestCase { HashMap interceptorParams = new HashMap<>(); interceptorParams.put("excludes", "blah,bar"); - HashMap successParams1 = new HashMap(); + Map successParams1 = new HashMap<>(); successParams1.put("propertyName", "baz"); - successParams1.put("expectedValue", 1); + successParams1.put("expectedValue", "1"); - HashMap successParams2 = new HashMap(); + Map successParams2 = new HashMap<>(); successParams2.put("propertyName", "blah"); successParams2.put("expectedValue", null); diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java index fb80fae66..6aff13694 100644 --- a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java @@ -35,7 +35,6 @@ import org.apache.struts2.config.entities.ResultConfig; import org.apache.struts2.config.entities.ResultTypeConfig; import org.apache.struts2.config.impl.DefaultConfiguration; import org.apache.struts2.factory.DefaultInterceptorFactory; -import org.apache.struts2.factory.DefaultResultFactory; import org.apache.struts2.inject.Container; import org.apache.struts2.inject.Scope.Strategy; import org.apache.struts2.ognl.OgnlReflectionProvider; @@ -97,6 +96,7 @@ import org.apache.struts2.convention.actions.transactions.TransNameAction; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import org.apache.struts2.convention.dontfind.DontFindMeAction; +import org.apache.struts2.factory.StrutsResultFactory; import org.apache.struts2.ognl.ProviderAllowlist; import org.apache.struts2.result.ServletDispatcherResult; import org.easymock.EasyMock; @@ -918,7 +918,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { dif.setObjectFactory((ObjectFactory) obj); dif.setReflectionProvider(rp); - DefaultResultFactory drf = new DefaultResultFactory(); + StrutsResultFactory drf = new StrutsResultFactory(); drf.setObjectFactory((ObjectFactory) obj); drf.setReflectionProvider(rp); diff --git a/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java b/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java index bc65ec75c..f45932c5e 100644 --- a/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java +++ b/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java @@ -240,11 +240,9 @@ public class RestActionInvocationTest extends TestCase { ((MockActionProxy)restActionInvocation.getProxy()).setMethod("index"); // Define result 'success' - ResultConfig resultConfig = new ResultConfig.Builder("success", - "org.apache.struts2.result.HttpHeaderResult") + ResultConfig resultConfig = new ResultConfig.Builder("success", "org.apache.struts2.result.HttpHeaderResult") .addParam("status", "123").build(); - ActionConfig actionConfig = new ActionConfig.Builder("org.apache.rest", - "RestAction", "org.apache.rest.RestAction") + ActionConfig actionConfig = new ActionConfig.Builder("org.apache.rest", "RestAction", "org.apache.rest.RestAction") .addResultConfig(resultConfig) .build(); ((MockActionProxy)restActionInvocation.getProxy()).setConfig(actionConfig); @@ -264,16 +262,16 @@ public class RestActionInvocationTest extends TestCase { class RestActionInvocationTester extends RestActionInvocation { RestActionInvocationTester() { - super(new HashMap(), true); - List interceptorMappings = new ArrayList(); + super(new HashMap<>(), true); + List interceptorMappings = new ArrayList<>(); MockInterceptor mockInterceptor = new MockInterceptor(); mockInterceptor.setFoo("interceptor"); mockInterceptor.setExpectedFoo("interceptor"); interceptorMappings.add(new InterceptorMapping("interceptor", mockInterceptor)); interceptors = interceptorMappings.iterator(); MockActionProxy actionProxy = new MockActionProxy(); - ActionConfig actionConfig = new ActionConfig.Builder("org.apache.rest", - "RestAction", "org.apache.rest.RestAction").build(); + ActionConfig actionConfig = new ActionConfig.Builder( + "org.apache.rest", "RestAction", "org.apache.rest.RestAction").build(); actionProxy.setConfig(actionConfig); proxy = actionProxy; action = new RestAction();