Repository: struts Updated Branches: refs/heads/master 8fe2bb831 -> b5240560a
WW-4702 WW-4707 Fixes issue with with list based parameters Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/b5240560 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/b5240560 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/b5240560 Branch: refs/heads/master Commit: b5240560ab5e63e66d5108d15fc78a6622019547 Parents: b287a95 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Mon Nov 7 11:36:20 2016 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Mon Nov 7 20:13:51 2016 +0100 ---------------------------------------------------------------------- .../providers/XWorkConfigurationProvider.java | 9 ++++++ .../interceptor/ParametersInterceptor.java | 8 +---- .../HttpParametersPropertyAccessor.java | 25 +++++++++++++++ .../accessor/ParameterPropertyAccessor.java | 33 ++++++++++++++++++++ core/src/main/resources/struts-default.xml | 2 ++ .../com/opensymphony/xwork2/SimpleAction.java | 10 ++++++ .../interceptor/ParametersInterceptorTest.java | 16 ++++++++++ 7 files changed, 96 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index 5ef5c4e..fc335d8 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@ -4,6 +4,8 @@ import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.DefaultActionProxyFactory; import com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; +import com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor; +import com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor; import com.opensymphony.xwork2.security.AcceptedPatternsChecker; import com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker; import com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker; @@ -88,6 +90,8 @@ import com.opensymphony.xwork2.validator.ValidatorFileParser; import ognl.MethodAccessor; import ognl.PropertyAccessor; import org.apache.struts2.StrutsConstants; +import org.apache.struts2.dispatcher.HttpParameters; +import org.apache.struts2.dispatcher.Parameter; import java.util.ArrayList; import java.util.Collection; @@ -145,10 +149,12 @@ public class XWorkConfigurationProvider implements ConfigurationProvider { .factory(PatternMatcher.class, WildcardHelper.class, Scope.SINGLETON) .factory(ReflectionProvider.class, OgnlReflectionProvider.class, Scope.SINGLETON) .factory(ReflectionContextFactory.class, OgnlReflectionContextFactory.class, Scope.SINGLETON) + .factory(PropertyAccessor.class, CompoundRoot.class.getName(), CompoundRootAccessor.class, Scope.SINGLETON) .factory(PropertyAccessor.class, Object.class.getName(), ObjectAccessor.class, Scope.SINGLETON) .factory(PropertyAccessor.class, Iterator.class.getName(), XWorkIteratorPropertyAccessor.class, Scope.SINGLETON) .factory(PropertyAccessor.class, Enumeration.class.getName(), XWorkEnumerationAccessor.class, Scope.SINGLETON) + .factory(UnknownHandlerManager.class, DefaultUnknownHandlerManager.class, Scope.SINGLETON) // silly workarounds for ognl since there is no way to flush its caches @@ -160,6 +166,9 @@ public class XWorkConfigurationProvider implements ConfigurationProvider { .factory(PropertyAccessor.class, Map.class.getName(), XWorkMapPropertyAccessor.class, Scope.SINGLETON) .factory(PropertyAccessor.class, Collection.class.getName(), XWorkCollectionPropertyAccessor.class, Scope.SINGLETON) .factory(PropertyAccessor.class, ObjectProxy.class.getName(), ObjectProxyPropertyAccessor.class, Scope.SINGLETON) + .factory(PropertyAccessor.class, HttpParameters.class.getName(), HttpParametersPropertyAccessor.class, Scope.SINGLETON) + .factory(PropertyAccessor.class, Parameter.class.getName(), ParameterPropertyAccessor.class, Scope.SINGLETON) + .factory(MethodAccessor.class, Object.class.getName(), XWorkMethodAccessor.class, Scope.SINGLETON) .factory(MethodAccessor.class, CompoundRoot.class.getName(), CompoundRootAccessor.class, Scope.SINGLETON) http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java index c1439c5..5770642 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java @@ -203,13 +203,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor { String name = entry.getKey(); Parameter value = entry.getValue(); try { - if (value instanceof Parameter.File) { - newStack.setParameter(name, value.getObject()); - } else if (value.isMultiple()) { - newStack.setParameter(name, value.getMultipleValues()); - } else { - newStack.setParameter(name, value.getValue()); - } + newStack.setParameter(name, value.getObject()); } catch (RuntimeException e) { if (devMode) { notifyDeveloperParameterException(action, name, e.getMessage()); http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/HttpParametersPropertyAccessor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/HttpParametersPropertyAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/HttpParametersPropertyAccessor.java new file mode 100644 index 0000000..589d914 --- /dev/null +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/HttpParametersPropertyAccessor.java @@ -0,0 +1,25 @@ +/** + * + */ +package com.opensymphony.xwork2.ognl.accessor; + +import ognl.ObjectPropertyAccessor; +import ognl.OgnlException; +import org.apache.struts2.dispatcher.HttpParameters; +import org.apache.struts2.dispatcher.Parameter; + +import java.util.Map; + +public class HttpParametersPropertyAccessor extends ObjectPropertyAccessor { + + @Override + public Object getProperty(Map context, Object target, Object oname) throws OgnlException { + HttpParameters parameters = (HttpParameters) target; + return parameters.get(String.valueOf(oname)).getObject(); + } + + @Override + public void setProperty(Map context, Object target, Object oname, Object value) throws OgnlException { + throw new OgnlException("Access to " + target.getClass().getName() + " is read-only!"); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/ParameterPropertyAccessor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/ParameterPropertyAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/ParameterPropertyAccessor.java new file mode 100644 index 0000000..48027df --- /dev/null +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/ParameterPropertyAccessor.java @@ -0,0 +1,33 @@ +/** + * + */ +package com.opensymphony.xwork2.ognl.accessor; + +import ognl.ObjectPropertyAccessor; +import ognl.OgnlException; +import org.apache.struts2.dispatcher.Parameter; + +import java.util.Map; + +public class ParameterPropertyAccessor extends ObjectPropertyAccessor { + + @Override + public Object getProperty(Map context, Object target, Object oname) throws OgnlException { + if (target instanceof Parameter) { + if ("value".equalsIgnoreCase(String.valueOf(oname))) { + throw new OgnlException("Access to " + oname + " is not allowed! Call parameter name directly!"); + } + return ((Parameter) target).getObject(); + } + return super.getProperty(context, target, oname); + } + + @Override + public void setProperty(Map context, Object target, Object oname, Object value) throws OgnlException { + if (target instanceof Parameter) { + throw new OgnlException("Access to " + target.getClass().getName() + " is read-only!"); + } else { + super.setProperty(context, target, oname, value); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/main/resources/struts-default.xml ---------------------------------------------------------------------- diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index fd9a085..bf384e3 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -152,6 +152,8 @@ <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters" class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter" class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" /> <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" /> <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/test/java/com/opensymphony/xwork2/SimpleAction.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/com/opensymphony/xwork2/SimpleAction.java b/core/src/test/java/com/opensymphony/xwork2/SimpleAction.java index 7f9bb7a..a88459e 100644 --- a/core/src/test/java/com/opensymphony/xwork2/SimpleAction.java +++ b/core/src/test/java/com/opensymphony/xwork2/SimpleAction.java @@ -51,6 +51,8 @@ public class SimpleAction extends ActionSupport { private String aliasDest; private Map<String, String> protectedMap = new HashMap<>(); private Map<String, String> existingMap = new HashMap<>(); + + private List<TestBean> beanList; public static boolean resultCalled; @@ -261,4 +263,12 @@ public class SimpleAction extends ActionSupport { public void setShortFoo(short shortFoo) { this.shortFoo = shortFoo; } + + public List<TestBean> getBeanList() { + return beanList; + } + + public void setBeanList(List<TestBean> beanList) { + this.beanList = beanList; + } } http://git-wip-us.apache.org/repos/asf/struts/blob/b5240560/core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java b/core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java index cdd8003..e95bdc4 100644 --- a/core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java @@ -712,6 +712,22 @@ public class ParametersInterceptorTest extends XWorkTestCase { assertEquals(expected, actual); } + public void testBeanListSingleValue() throws Exception { + Map<String, Object> params = new HashMap<>(); + params.put("beanList.name", new String[] { "Superman" }); + + HashMap<String, Object> extraContext = new HashMap<>(); + extraContext.put(ActionContext.PARAMETERS, HttpParameters.create(params).build()); + + ActionProxy proxy = actionProxyFactory.createActionProxy("", + MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext); + proxy.execute(); + SimpleAction action = (SimpleAction) proxy.getAction(); + assertNotNull(action); + assertNotNull(action.getBeanList()); + assertFalse(action.getBeanList().isEmpty()); + } + private ValueStack injectValueStack(Map<String, Object> actual) { ValueStack stack = createStubValueStack(actual); container.inject(stack);