From ff17307afc1c3264d5abbb9beaf0690f0a471e68 Mon Sep 17 00:00:00 2001 From: Josh Mabry Date: Tue, 26 Aug 2014 16:39:54 -0500 Subject: [PATCH 1/2] If you are wanting a Set, we should give you a Set --- .../xwork2/conversion/impl/InstantiatingNullHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/InstantiatingNullHandler.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/InstantiatingNullHandler.java index 6e91047d1e..188e92d03f 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/InstantiatingNullHandler.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/InstantiatingNullHandler.java @@ -149,7 +149,9 @@ public Object nullPropertyValue(Map context, Object target, Obje } private Object createObject(Class clazz, Object target, String property, Map context) throws Exception { - if (Collection.class.isAssignableFrom(clazz)) { + if (Set.class.isAssignableFrom(clazz)) { + return new HashSet(); + } else if (Collection.class.isAssignableFrom(clazz)) { return new ArrayList(); } else if (clazz == Map.class) { return new HashMap(); From ca9dbb1fb97a726e3961973f8941144461749293 Mon Sep 17 00:00:00 2001 From: Josh Mabry Date: Tue, 26 Aug 2014 16:41:16 -0500 Subject: [PATCH 2/2] Allow a Set to be of Complex Objects. This was based off the setProperty of the XWorkListPropertyAccessor --- .../XWorkCollectionPropertyAccessor.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) 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 e7fe8c502a..aed7949d62 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.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 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 void setObjectFactory(ObjectFactory fac) { 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 Object getPropertyThroughIteration(Map context, Collection collection, St } @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); + } } /**