[Practicalxml-commits] SF.net SVN: practicalxml:[152] branches/dev-1.1/src
Brought to you by:
kdgregory
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-23 18:59:02
|
Revision: 152 http://practicalxml.svn.sourceforge.net/practicalxml/?rev=152&view=rev Author: kdgregory Date: 2009-09-23 18:58:50 +0000 (Wed, 23 Sep 2009) Log Message: ----------- Sequence conversion: indexes are optional, child elements may be named after parent Tests: minor renames Modified Paths: -------------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.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 branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBeanConverter.java Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java 2009-09-23 15:19:55 UTC (rev 151) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java 2009-09-23 18:58:50 UTC (rev 152) @@ -156,19 +156,26 @@ public static class IndexedAppender extends BasicAppender { - int _index = 0; + private int _index = 0; + private String _elementName = ConversionStrings.EL_COLLECTION_ITEM; public IndexedAppender(Element parent, EnumSet<Bean2XmlOptions> options) { super(parent, options); + if (options.contains(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT)) + { + _elementName = DomUtil.getLocalName(parent); + if (_elementName.endsWith("s") || _elementName.endsWith("S")) + _elementName = _elementName.substring(0, _elementName.length() - 1); + } } @Override public Element appendValue(String name, String type, String value) { - Element child = super.appendValue(name, type, value); - if (child != null) + Element child = super.appendValue(_elementName, type, value); + if ((child != null) && isOptionSet(Bean2XmlOptions.SEQUENCE_INDEXES)) child.setAttribute(ConversionStrings.AT_ARRAY_INDEX, String.valueOf(_index++)); return child; } 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 15:19:55 UTC (rev 151) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlOptions.java 2009-09-23 18:58:50 UTC (rev 152) @@ -40,6 +40,23 @@ INTROSPECT_MAPS, /** + * 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 + * not terribly useful, so is no longer default behavior. + */ + SEQUENCE_INDEXES, + + /** + * Sequences (arrays, lists, sets) will name their elements according to + * the parent element, with any trailing "s" removed. For example, if the + * parent is named "products", each child will be named "product", rather + * than the default "data". If the parent is named "foo", each child will + * also be named "foo" (since there's no "s" to remove). + */ + SEQUENCE_NAMED_BY_PARENT, + + /** * Add null values into the tree, as an element without content, with the * attribute <code>xsi:nil</code> set to "true". If not present, null * values are ignored, and not added to DOM tree. 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 15:19:55 UTC (rev 151) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBean2XmlConverter.java 2009-09-23 18:58:50 UTC (rev 152) @@ -15,7 +15,6 @@ package net.sf.practicalxml.converter.bean; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -171,17 +170,37 @@ assertNameTypeValue("child 2", children.get(1), "data", "", "2"); assertNameTypeValue("child 3", children.get(2), "data", "", "3"); + assertEquals("", children.get(0).getAttribute("index")); + assertEquals("", children.get(1).getAttribute("index")); + assertEquals("", children.get(2).getAttribute("index")); + } + + + public void testConvertArrayWithSequenceNumbers() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_INDEXES); + + int[] data = new int[] { 1, 2, 3 }; + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + assertNameTypeValue("child 1", children.get(0), "data", "", "1"); + assertNameTypeValue("child 2", children.get(1), "data", "", "2"); + assertNameTypeValue("child 3", children.get(2), "data", "", "3"); + assertEquals("0", children.get(0).getAttribute("index")); assertEquals("1", children.get(1).getAttribute("index")); assertEquals("2", children.get(2).getAttribute("index")); } - public void testConvertPrimitiveArrayWithXsiType() throws Exception + public void testConvertArrayWithXsiType() throws Exception { Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.ADD_XSI_TYPE); - int[] data = new int[] { 1, 2, 3 }; + Object[] data = new Object[] { Integer.valueOf(1), new BigDecimal("2"), "3" }; Element root = driver.convert(data, "test"); // System.out.println(OutputUtil.compactString(root.getOwnerDocument())); @@ -191,21 +210,97 @@ assertEquals("child count", 3, children.size()); assertNameTypeValue("child 1", children.get(0), "data", "xsd:int", "1"); + assertNameTypeValue("child 2", children.get(1), "data", "xsd:decimal", "2"); + assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "3"); + } + + + public void testConvertArrayWithSimpleParentName() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); + + String[] data = new String[] {"foo", "bar", "baz"}; + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "test", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "test", "", "baz"); + } + + + public void testConvertArrayWithDepluralizedParentName() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); + + String[] data = new String[] {"foo", "bar", "baz"}; + + Element root = driver.convert(data, "tests"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "test", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "test", "", "baz"); + } + + + public void testConvertListDefault() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(); + + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "data", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "data", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "data", "", "baz"); + + assertEquals("", children.get(0).getAttribute("index")); + assertEquals("", children.get(1).getAttribute("index")); + assertEquals("", children.get(2).getAttribute("index")); + } + + + public void testConvertListWithSequenceNumbers() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_INDEXES); + + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "data", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "data", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "data", "", "baz"); + assertEquals("0", children.get(0).getAttribute("index")); - - assertNameTypeValue("child 2", children.get(1), "data", "xsd:int", "2"); assertEquals("1", children.get(1).getAttribute("index")); - - assertNameTypeValue("child 3", children.get(2), "data", "xsd:int", "3"); assertEquals("2", children.get(2).getAttribute("index")); } - public void testConvertStringArrayWithXsiType() throws Exception + public void testConvertListWithXsiType() throws Exception { Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.ADD_XSI_TYPE); - String[] data = new String[] { "foo", "bar", "baz" }; + List<String> data = Arrays.asList("foo", "bar", "baz"); + Element root = driver.convert(data, "test"); // System.out.println(OutputUtil.compactString(root.getOwnerDocument())); @@ -215,21 +310,57 @@ assertEquals("child count", 3, children.size()); assertNameTypeValue("child 1", children.get(0), "data", "xsd:string", "foo"); - assertEquals("0", children.get(0).getAttribute("index")); - assertNameTypeValue("child 2", children.get(1), "data", "xsd:string", "bar"); - assertEquals("1", children.get(1).getAttribute("index")); + assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "baz"); - assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "baz"); - assertEquals("2", children.get(2).getAttribute("index")); + assertEquals("", children.get(0).getAttribute("index")); + assertEquals("", children.get(1).getAttribute("index")); + assertEquals("", children.get(2).getAttribute("index")); } - public void testConvertStringListWithXsiType() throws Exception + public void testConvertListWithSimpleParentName() throws Exception { - Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.ADD_XSI_TYPE); + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); - List<String> data = new ArrayList<String>(); + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "test", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "test", "", "baz"); + } + + + public void testConvertListWithDepluralizedParentName() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); + + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Element root = driver.convert(data, "tests"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "foo"); + assertNameTypeValue("child 2", children.get(1), "test", "", "bar"); + assertNameTypeValue("child 3", children.get(2), "test", "", "baz"); + } + + + public void testConvertSetDefault() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(); + + // TreeSet will order output + Set<String> data = new TreeSet<String>(); data.add("foo"); data.add("bar"); data.add("baz"); @@ -237,27 +368,50 @@ Element root = driver.convert(data, "test"); // System.out.println(OutputUtil.compactString(root.getOwnerDocument())); - assertJavaXsiType("root", root, data); + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + assertNameTypeValue("child 1", children.get(0), "data", "", "bar"); + assertNameTypeValue("child 2", children.get(1), "data", "", "baz"); + assertNameTypeValue("child 3", children.get(2), "data", "", "foo"); + + assertEquals("", children.get(0).getAttribute("index")); + assertEquals("", children.get(1).getAttribute("index")); + assertEquals("", children.get(2).getAttribute("index")); + } + + + public void testConvertSetWithSequenceNumbers() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_INDEXES); + + // TreeSet will order output + Set<String> data = new TreeSet<String>(); + data.add("foo"); + data.add("bar"); + data.add("baz"); + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + List<Element> children = DomUtil.getChildren(root); assertEquals("child count", 3, children.size()); - assertNameTypeValue("child 1", children.get(0), "data", "xsd:string", "foo"); + assertNameTypeValue("child 1", children.get(0), "data", "", "bar"); + assertNameTypeValue("child 2", children.get(1), "data", "", "baz"); + assertNameTypeValue("child 3", children.get(2), "data", "", "foo"); + assertEquals("0", children.get(0).getAttribute("index")); - - assertNameTypeValue("child 2", children.get(1), "data", "xsd:string", "bar"); assertEquals("1", children.get(1).getAttribute("index")); - - assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "baz"); assertEquals("2", children.get(2).getAttribute("index")); } - public void testConvertStringSetWithXsiType() throws Exception + public void testConvertSetWithXsiType() throws Exception { Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.ADD_XSI_TYPE); - // TreeSet means that the data will be re-ordered + // TreeSet will order output Set<String> data = new TreeSet<String>(); data.add("foo"); data.add("bar"); @@ -272,16 +426,59 @@ assertEquals("child count", 3, children.size()); assertNameTypeValue("child 1", children.get(0), "data", "xsd:string", "bar"); - assertEquals("0", children.get(0).getAttribute("index")); - assertNameTypeValue("child 2", children.get(1), "data", "xsd:string", "baz"); - assertEquals("1", children.get(1).getAttribute("index")); + assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "foo"); - assertNameTypeValue("child 3", children.get(2), "data", "xsd:string", "foo"); - assertEquals("2", children.get(2).getAttribute("index")); + assertEquals("", children.get(0).getAttribute("index")); + assertEquals("", children.get(1).getAttribute("index")); + assertEquals("", children.get(2).getAttribute("index")); } + public void testConvertSetWithSimpleParentName() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); + + // TreeSet will order output + Set<String> data = new TreeSet<String>(); + data.add("foo"); + data.add("bar"); + data.add("baz"); + + Element root = driver.convert(data, "test"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "bar"); + assertNameTypeValue("child 2", children.get(1), "test", "", "baz"); + assertNameTypeValue("child 3", children.get(2), "test", "", "foo"); + } + + + public void testConvertSetWithDepluralizedParentName() throws Exception + { + Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); + + // TreeSet will order output + Set<String> data = new TreeSet<String>(); + data.add("foo"); + data.add("bar"); + data.add("baz"); + + Element root = driver.convert(data, "tests"); +// System.out.println(OutputUtil.compactString(root.getOwnerDocument())); + + List<Element> children = DomUtil.getChildren(root); + assertEquals("child count", 3, children.size()); + + assertNameTypeValue("child 1", children.get(0), "test", "", "bar"); + assertNameTypeValue("child 2", children.get(1), "test", "", "baz"); + assertNameTypeValue("child 3", children.get(2), "test", "", "foo"); + } + + public void testConvertMapDefaultWithXsiType() throws Exception { Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.ADD_XSI_TYPE); @@ -332,7 +529,7 @@ } - public void testConvertMapIntrospectWithInvalidKey() throws Exception + public void testFailMapIntrospectWithInvalidKey() throws Exception { Bean2XmlConverter driver = new Bean2XmlConverter(Bean2XmlOptions.INTROSPECT_MAPS); @@ -452,7 +649,7 @@ } - public void testDispatchCompoundBeanDefault() throws Exception + 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 @@ -474,10 +671,6 @@ DomAsserts.assertEquals("2", root, "/test/primArray/data[2]"); DomAsserts.assertEquals("3", root, "/test/primArray/data[3]"); - DomAsserts.assertEquals("0", root, "/test/primArray/data[1]/@index"); - DomAsserts.assertEquals("1", root, "/test/primArray/data[2]/@index"); - DomAsserts.assertEquals("2", root, "/test/primArray/data[3]/@index"); - DomAsserts.assertEquals("foo", root, "/test/stringList/data[1]"); DomAsserts.assertEquals("baz", root, "/test/stringList/data[2]"); } Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBeanConverter.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBeanConverter.java 2009-09-23 15:19:55 UTC (rev 151) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/bean/TestBeanConverter.java 2009-09-23 18:58:50 UTC (rev 152) @@ -144,7 +144,7 @@ } - public void testConvertNullFailureRequireXsiNil() throws Exception + public void testFailNullRequireXsiNil() throws Exception { Document dom = BeanConverter.convertToXml(null, "test"); // System.out.println(OutputUtil.compactString(dom)); @@ -181,7 +181,7 @@ // demonstrates that the list will be read as List<String> even though // it was written as List<Integer> - public void testIntegerListDefault() throws Exception + public void testListDefault() throws Exception { List<Integer> data = Arrays.asList(1, 2, 3); assert(data.get(0) instanceof Integer); @@ -195,11 +195,12 @@ } - // demonstrates that you don't need to require xsi:type to use it - public void testIntegerListWithXsiType() throws Exception + // demonstrates that xsi:type will be used when available, even if + // not required -- otherwise we'd translate back as String + public void testListWithXsiType() throws Exception { List<Integer> data = Arrays.asList(1, 2, 3); - assert(data.get(0) instanceof Integer); + assertTrue(data.get(0) instanceof Integer); Document dom = BeanConverter.convertToXml(data, "test", Bean2XmlOptions.ADD_XSI_TYPE); // System.out.println(OutputUtil.compactString(dom)); @@ -209,8 +210,32 @@ } + public void testListWithSequenceNumbers() throws Exception + { + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Document dom = BeanConverter.convertToXml(data, "test", Bean2XmlOptions.SEQUENCE_INDEXES); +// System.out.println(OutputUtil.compactString(dom)); + + List<?> result = BeanConverter.convertToJava(dom, List.class); + assertEquals(data, result); + } + + + public void testListWithElementsNamedByParent() throws Exception + { + List<String> data = Arrays.asList("foo", "bar", "baz"); + + Document dom = BeanConverter.convertToXml(data, "test", Bean2XmlOptions.SEQUENCE_NAMED_BY_PARENT); +// System.out.println(OutputUtil.compactString(dom)); + + List<?> result = BeanConverter.convertToJava(dom, List.class); + assertEquals(data, result); + } + + // demonstrates that the caller drives the inbound conversion - public void testConvertListToSortedSet() throws Exception + public void testListToSortedSet() throws Exception { List<String> data = Arrays.asList("foo", "bar", "baz", "bar"); @@ -277,7 +302,7 @@ } - public void testSimpleBeanRequireXsiType() throws Exception + public void testFailSimpleBeanRequireXsiType() throws Exception { SimpleBean data = new SimpleBean("abc", 123, new BigDecimal("456.789"), true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |