[Practicalxml-commits] SF.net SVN: practicalxml:[155] branches/dev-1.1/src
Brought to you by:
kdgregory
|
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-23 23:43:13
|
Revision: 155
http://practicalxml.svn.sourceforge.net/practicalxml/?rev=155&view=rev
Author: kdgregory
Date: 2009-09-23 23:42:59 +0000 (Wed, 23 Sep 2009)
Log Message:
-----------
bean->xml conversion now supports writing arrays/lists/sets as repeated siblings
Modified Paths:
--------------
branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlConverter.java
branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlOptions.java
branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBean2XmlConverter.java
Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlConverter.java
===================================================================
--- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlConverter.java 2009-09-23 21:46:18 UTC (rev 154)
+++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlConverter.java 2009-09-23 23:42:59 UTC (rev 155)
@@ -167,11 +167,15 @@
if (!array.getClass().isArray())
return false;
- Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(array));
- Appender childAppender = new IndexedAppender(parent, _options);
String childName = determineChildNameForSequence(name);
+ Appender childAppender = appender;
+ if (!_options.contains(Bean2XmlOptions.SEQUENCE_AS_REPEATED_ELEMENTS))
+ {
+ Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(array));
+ childAppender = new IndexedAppender(parent, _options);
+ }
+
int length = Array.getLength(array);
-
for (int idx = 0 ; idx < length ; idx++)
{
Object value = Array.get(array, idx);
@@ -201,10 +205,14 @@
if (!(obj instanceof Collection))
return false;
- Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(obj));
- Appender childAppender = new IndexedAppender(parent, _options);
String childName = determineChildNameForSequence(name);
-
+ Appender childAppender = appender;
+ if (!_options.contains(Bean2XmlOptions.SEQUENCE_AS_REPEATED_ELEMENTS))
+ {
+ Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(obj));
+ childAppender = new IndexedAppender(parent, _options);
+ }
+
for (Object value : (Collection<?>)obj)
{
convert(value, childName, childAppender);
@@ -255,18 +263,22 @@
else
convert(value, name, appender);
}
-
+
private String determineChildNameForSequence(String parentName)
{
if (StringUtils.isEmpty(parentName))
return ConversionStrings.EL_COLLECTION_ITEM;
-
+
+ if (_options.contains(Bean2XmlOptions.SEQUENCE_AS_REPEATED_ELEMENTS))
+ return parentName;
+
if (!_options.contains(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT))
- return ConversionStrings.EL_COLLECTION_ITEM;
-
+ return ConversionStrings.EL_COLLECTION_ITEM;
+
if (parentName.endsWith("s") || parentName.endsWith("S"))
return parentName.substring(0, parentName.length() - 1);
+
return parentName;
}
}
Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlOptions.java
===================================================================
--- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlOptions.java 2009-09-23 21:46:18 UTC (rev 154)
+++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlOptions.java 2009-09-23 23:42:59 UTC (rev 155)
@@ -28,7 +28,17 @@
*/
INTROSPECT_MAPS,
+
/**
+ * Will create sequences (arrays, lists, and sets) as repeated elements
+ * rather than a parent-children construct. This option is invalid when
+ * converting an array as the top-level object, as it would cause the
+ * creation of multiple root elements. It also produces output that can
+ * not, at this time, be processed correctly by {@link Xml2BeanConverter}.
+ */
+ SEQUENCE_AS_REPEATED_ELEMENTS,
+
+ /**
* Will add an <code>index</code> attribute to the child elements of
* sequences (arrays, lists, sets); the value of this attribute is the
* element's position in the sequence (numbered from 0). This index is
Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBean2XmlConverter.java
===================================================================
--- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBean2XmlConverter.java 2009-09-23 21:46:18 UTC (rev 154)
+++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBean2XmlConverter.java 2009-09-23 23:42:59 UTC (rev 155)
@@ -651,16 +651,15 @@
public void testConvertCompoundBeanDefault() throws Exception
{
- // at this point, I'm convinced the type output works, so we'll do default
- // output and then use XPath for all assertions ... but note nulls in data
- Bean2XmlConverter driver = new Bean2XmlConverter();
-
- CompoundBean bean = new CompoundBean(
+ CompoundBean data = new CompoundBean(
new SimpleBean("zippy", 123, null, true),
new int[] { 1, 2, 3 },
Arrays.asList("foo", null, "baz"));
- Element root = driver.convert(bean, "test");
+ // at this point, I'm convinced the type output works, so we'll do default
+ // output and then use XPath for all assertions ... but note nulls in data
+ Element root = new Bean2XmlConverter()
+ .convert(data, "test");
// System.out.println(OutputUtil.compactString(root.getOwnerDocument()));
DomAsserts.assertEquals("zippy", root, "/test/simple/sval");
@@ -676,6 +675,48 @@
}
+ public void testConvertSequenceAsRepeatedElements() throws Exception
+ {
+ // since we can't just pass an array into this conversion (because it
+ // would try to make multiple root elements), we'll use a compound bean
+ // and validate its components (and we'll leave a null in to verify
+ // that we ignore it)
+
+ CompoundBean data = new CompoundBean(
+ null,
+ new int[] { 1, 2, 3 },
+ Arrays.asList("foo", null, "baz"));
+
+ Element root = new Bean2XmlConverter(
+ Bean2XmlOptions.SEQUENCE_AS_REPEATED_ELEMENTS)
+ .convert(data, "test");
+// System.out.println(OutputUtil.compactString(root.getOwnerDocument()));
+
+ DomAsserts.assertEquals("1", root, "/test/primArray[1]");
+ DomAsserts.assertEquals("2", root, "/test/primArray[2]");
+ DomAsserts.assertEquals("3", root, "/test/primArray[3]");
+
+ DomAsserts.assertEquals("foo", root, "/test/stringList[1]");
+ DomAsserts.assertEquals("baz", root, "/test/stringList[2]");
+ }
+
+
+ public void testFailSequenceAsRepeatedElementsAtRoot() throws Exception
+ {
+ int[] data = new int[] { 1, 2, 3 };
+
+ try
+ {
+ new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_AS_REPEATED_ELEMENTS)
+ .convert(data, "test");
+ }
+ catch (ConversionException ee)
+ {
+ // success
+ }
+ }
+
+
public void testNamespacedConversion() throws Exception
{
Bean2XmlConverter driver = new Bean2XmlConverter();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|