You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2014/08/28 07:44:19 UTC

[3/4] git commit: Allow a Set to be of Complex Objects. This was based off the setProperty of the XWorkListPropertyAccessor

Allow a Set to be of Complex Objects.  This was based off the setProperty of the XWorkListPropertyAccessor


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/ca9dbb1f
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/ca9dbb1f
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/ca9dbb1f

Branch: refs/heads/develop
Commit: ca9dbb1fb97a726e3961973f8941144461749293
Parents: ff17307
Author: Josh Mabry <jo...@apexcapitalcorp.com>
Authored: Tue Aug 26 16:41:16 2014 -0500
Committer: Josh Mabry <jo...@apexcapitalcorp.com>
Committed: Tue Aug 26 16:41:16 2014 -0500

----------------------------------------------------------------------
 .../XWorkCollectionPropertyAccessor.java        | 50 ++++++++++++++++++--
 1 file changed, 47 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/ca9dbb1f/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
index e7fe8c5..aed7949 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
@@ -20,9 +20,11 @@ import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.conversion.ObjectTypeDeterminer;
 import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.ognl.OgnlUtil;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
+
 import ognl.ObjectPropertyAccessor;
 import ognl.OgnlException;
 import ognl.OgnlRuntime;
@@ -31,6 +33,7 @@ import ognl.SetPropertyAccessor;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -51,6 +54,7 @@ public class XWorkCollectionPropertyAccessor extends SetPropertyAccessor {
     private XWorkConverter xworkConverter;
     private ObjectFactory objectFactory;
     private ObjectTypeDeterminer objectTypeDeterminer;
+    private OgnlUtil ognlUtil;
     
     @Inject
     public void setXWorkConverter(XWorkConverter conv) {
@@ -66,6 +70,11 @@ public class XWorkCollectionPropertyAccessor extends SetPropertyAccessor {
     public void setObjectTypeDeterminer(ObjectTypeDeterminer ot) {
         this.objectTypeDeterminer = ot;
     }
+    
+    @Inject
+    public void setOgnlUtil(OgnlUtil util) {
+        this.ognlUtil = util;
+    }
 
     /**
      * Gets the property of a Collection by indexing the collection
@@ -229,11 +238,46 @@ public class XWorkCollectionPropertyAccessor extends SetPropertyAccessor {
     }
 
     @Override
-    public void setProperty(Map arg0, Object arg1, Object arg2, Object arg3)
+    public void setProperty(Map context, Object target, Object name, Object value)
             throws OgnlException {
-        
-        super.setProperty(arg0, arg1, arg2, arg3);
+
+        Class lastClass = (Class) context.get(XWorkConverter.LAST_BEAN_CLASS_ACCESSED);
+        String lastProperty = (String) context.get(XWorkConverter.LAST_BEAN_PROPERTY_ACCESSED);
+        Class convertToClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, name);
+
+        if (name instanceof String && value.getClass().isArray()) {
+            // looks like the input game in the form of "someCollection.foo" and
+            // we are expected to define the index values ourselves.
+            // So let's do it:
+
+            Collection c = (Collection) target;
+            Object[] values = (Object[]) value;
+            for (Object v : values) {
+                try {
+                    Object o = objectFactory.buildBean(convertToClass, context);
+                    ognlUtil.setValue((String) name, context, o, v);
+                    c.add(o);
+                } catch (Exception e) {
+                    throw new OgnlException("Error converting given String values for Collection.", e);
+                }
+            }
+
+            // we don't want to do the normal collection property setting now, since we've already done the work
+            // just return instead
+            return;
+        }
+
+        Object realValue = getRealValue(context, value, convertToClass);
+
+        super.setProperty(context, target, name, realValue);
     }
+
+    private Object getRealValue(Map context, Object value, Class convertToClass) {
+        if (value == null || convertToClass == null) {
+            return value;
+        }
+        return xworkConverter.convertValue(context, value, convertToClass);
+    }  
 }
 
 /**