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);

Reply via email to