[Practicalxml-commits] SF.net SVN: practicalxml:[145] branches/dev-1.1/src
Brought to you by:
kdgregory
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-22 19:07:02
|
Revision: 145 http://practicalxml.svn.sourceforge.net/practicalxml/?rev=145&view=rev Author: kdgregory Date: 2009-09-22 19:06:46 +0000 (Tue, 22 Sep 2009) Log Message: ----------- implement Json2XmlOptions.ARRAYS_AS_REPEATED_ELEMENTS Modified Paths: -------------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java 2009-09-22 17:32:02 UTC (rev 144) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java 2009-09-22 19:06:46 UTC (rev 145) @@ -17,6 +17,7 @@ import java.util.EnumSet; import org.w3c.dom.Element; +import org.w3c.dom.Node; import net.sf.practicalxml.DomUtil; import net.sf.practicalxml.converter.ConversionException; @@ -72,15 +73,22 @@ /** * Top-level parser entry: expects the string to be a single object - * definition, without anything before or after the outer brace pair. + * or array definition, without anything before or after the outer + * brace/bracket pair. */ private void parse(Element parent) { - expect("{"); - parseObject(parent); + String first = nextToken(); + if (first.equals("{")) + parseObject(parent); + else if (first.equals("[")) + parseArray(parent); + else + throw new ConversionException(commonExceptionText( + "unexpected content start of line")); if (nextToken().length() > 0) throw new ConversionException(commonExceptionText( - "unexpected content after closing brace")); + "unexpected content at end of line")); } @@ -125,13 +133,29 @@ private void parseArray(Element parent) { + String childName = "data"; + if (_options.contains(Json2XmlOptions.ARRAYS_AS_REPEATED_ELEMENTS)) + { + // we come in here with the assumption that array elements will + // be created as children of "parent" ... but now we learn that + // they're actually siblings, and the passed parent will disappear + // ... so here's an ugly little hack to make that happen + Node realParent = parent.getParentNode(); + if (!(realParent instanceof Element)) + throw new ConversionException(commonExceptionText( + "cannot convert top-level array as repeated elements")); + childName = DomUtil.getLocalName(parent); + realParent.removeChild(parent); + parent = (Element)realParent; + } + String next = nextToken(); if (atEndOfSequence(next, "]", false)) return; while (true) { - Element child = DomUtil.appendChild(parent, "data"); + Element child = DomUtil.appendChild(parent, childName); next = valueDispatch(next, child); if (atEndOfSequence(next, "]", true)) return; Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java 2009-09-22 17:32:02 UTC (rev 144) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java 2009-09-22 19:06:46 UTC (rev 145) @@ -402,6 +402,58 @@ } + public void testConvertTopLevelArray() throws Exception + { + String src = "[123, 456]"; + + Element root = new Json2XmlConverter(src).convert(); + assertEquals("data", root.getNodeName()); + assertEquals(2, root.getChildNodes().getLength()); + + Element child1 = (Element)root.getFirstChild(); + assertEquals("data", child1.getNodeName()); + assertEquals("123", DomUtil.getText(child1)); + assertEquals(0, DomUtil.getChildren(child1).size()); + + Element child2 = (Element)child1.getNextSibling(); + assertEquals("data", child2.getNodeName()); + assertEquals("456", DomUtil.getText(child2)); + assertEquals(0, DomUtil.getChildren(child2).size()); + } + + + public void testConvertArrayAsRepeatedElements() throws Exception + { + // leading and trailing elements to ensure sibling order + String src = "{foo: \"abc\", bar: [123, 456], baz: \"def\"}"; + + Element root = new Json2XmlConverter(src, Json2XmlOptions.ARRAYS_AS_REPEATED_ELEMENTS) + .convert(); + assertEquals("data", root.getNodeName()); + assertEquals(4, root.getChildNodes().getLength()); + + Element child1 = (Element)root.getFirstChild(); + assertEquals("foo", child1.getNodeName()); + assertEquals("abc", DomUtil.getText(child1)); + assertEquals(0, DomUtil.getChildren(child1).size()); + + Element child2 = (Element)child1.getNextSibling(); + assertEquals("bar", child2.getNodeName()); + assertEquals("123", DomUtil.getText(child2)); + assertEquals(0, DomUtil.getChildren(child2).size()); + + Element child3 = (Element)child2.getNextSibling(); + assertEquals("bar", child3.getNodeName()); + assertEquals("456", DomUtil.getText(child3)); + assertEquals(0, DomUtil.getChildren(child3).size()); + + Element child4 = (Element)child3.getNextSibling(); + assertEquals("baz", child4.getNodeName()); + assertEquals("def", DomUtil.getText(child4)); + assertEquals(0, DomUtil.getChildren(child4).size()); + } + + public void testFailConvertUnterminatedArray() throws Exception { String src = "{foo: [123, 456"; @@ -432,4 +484,22 @@ // success } } + + + public void testFailConvertArrayAsRootUsingRepeatedElements() throws Exception + { + String src = "[123, 456]"; + + try + { + new Json2XmlConverter(src, Json2XmlOptions.ARRAYS_AS_REPEATED_ELEMENTS) + .convert(); + fail("able to create XML with multiple root elements"); + } + catch (ConversionException ee) + { + // success + } + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |