[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. |