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