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);
+ }
}
/**