End anydata element 48/82448/5
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 7 Jun 2019 13:41:54 +0000 (15:41 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 7 Jun 2019 14:07:10 +0000 (16:07 +0200)
Since startAnydata() is opening an element we must make sure
we close it again. This flushes out a thinko around tracking
endElement depth, which must be decremented before check.

JIRA: YANGTOOLS-1002
Change-Id: I8f0b31eb9f165d384c1e680e5fc19763e9f67fbb
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractAnydataTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java

index ef6b5dd0edd0d389c538550e8ce083dc0e83b8ea..609c4d541ba1a2bcf6a6963c4048830fc1fac2c5 100644 (file)
@@ -87,7 +87,8 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
             if (parent == schema) {
                 endElement();
             }
-        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode) {
+        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode
+                || schema instanceof AnyDataSchemaNode) {
             endElement();
         }
     }
index c1fc8b5e7e0b5b556e60c747fc517868a3e178b5..19c05c251c1395f9a4c1a72ed71a08e4953e06a4 100644 (file)
@@ -182,10 +182,10 @@ final class StreamWriterFacade extends ValueWriter {
                     ++depth;
                     break;
                 case XMLStreamConstants.END_ELEMENT:
+                    --depth;
                     if (depth != 0) {
                         writer.writeEndElement();
                     }
-                    --depth;
                     break;
                 case XMLStreamConstants.CHARACTERS:
                     writer.writeCharacters(reader.getText());
@@ -237,10 +237,10 @@ final class StreamWriterFacade extends ValueWriter {
                     ++depth;
                     break;
                 case XMLStreamConstants.END_ELEMENT:
+                    --depth;
                     if (depth != 0) {
                         writer.writeEndElement();
                     }
-                    --depth;
                     break;
                 case XMLStreamConstants.PROCESSING_INSTRUCTION:
                     forwardProcessingInstruction(reader);
index 792d08f686c840ade6b83a132b58f534701b4ec6..2e9340a1e46fbb04b475edaad5709c7d59b1acd1 100644 (file)
@@ -26,6 +26,8 @@ import org.junit.BeforeClass;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.w3c.dom.Document;
@@ -43,6 +45,9 @@ public abstract class AbstractAnydataTest {
     static final NodeIdentifier CONT_ANY_NODEID = NodeIdentifier.create(CONT_ANY_QNAME);
     static final NodeIdentifier CONT_LEAF_NODEID = NodeIdentifier.create(CONT_LEAF_QNAME);
 
+    static final LeafNode<?> CONT_LEAF = ImmutableLeafNodeBuilder.create().withNodeIdentifier(CONT_LEAF_NODEID)
+            .withValue("abc").build();
+
     static SchemaContext SCHEMA_CONTEXT;
 
     @BeforeClass
@@ -55,10 +60,14 @@ public abstract class AbstractAnydataTest {
         SCHEMA_CONTEXT = null;
     }
 
-    static DOMSourceAnydata toDOMSource(final String str) throws IOException, SAXException {
-        return new DOMSourceAnydata(new DOMSource(
-            // DOMSource must have a single document element, which we are ignoring
-            readXmlToDocument(toInputStream("<IGNORED>" + str + "</IGNORED>")).getDocumentElement()));
+    static DOMSourceAnydata toDOMSource(final String str) {
+        try {
+            return new DOMSourceAnydata(new DOMSource(
+                // DOMSource must have a single document element, which we are ignoring
+                readXmlToDocument(toInputStream("<IGNORED>" + str + "</IGNORED>")).getDocumentElement()));
+        } catch (IOException | SAXException e) {
+            throw new IllegalStateException(e);
+        }
     }
 
     static InputStream toInputStream(final String str) {
index cd20873fa4d87e8fd130d516188ade6a939c9ad9..2d8c9b54806210ed408844282dc21ad97b9877ea 100644 (file)
@@ -33,6 +33,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
@@ -40,7 +41,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeS
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAnydataNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata;
 import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
@@ -63,7 +64,7 @@ public class AnydataSerializeTest extends AbstractAnydataTest {
     }
 
     @Test
-    public void testDOMAnydata() throws XMLStreamException, IOException, SAXException {
+    public void testDOMAnydata() throws XMLStreamException, IOException {
         final StringWriter writer = new StringWriter();
         final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(writer);
 
@@ -200,7 +201,7 @@ public class AnydataSerializeTest extends AbstractAnydataTest {
     }
 
     @Test
-    public void testSiblingSerialize() throws IOException, SAXException, XMLStreamException {
+    public void testSiblingSerialize() throws IOException, XMLStreamException {
         final StringWriter writer = new StringWriter();
         final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(writer);
 
@@ -211,7 +212,7 @@ public class AnydataSerializeTest extends AbstractAnydataTest {
         normalizedNodeWriter.write(ImmutableContainerNodeBuilder.create().withNodeIdentifier(CONT_NODEID)
             .withChild(ImmutableAnydataNodeBuilder.create(DOMSourceAnydata.class).withNodeIdentifier(CONT_ANY_NODEID)
                 .withValue(toDOMSource("<bar xmlns=\"test-anydata\"/>")).build())
-            .withChild(ImmutableLeafNodeBuilder.create().withNodeIdentifier(CONT_LEAF_NODEID).withValue("abc").build())
+            .withChild(CONT_LEAF)
             .build());
         normalizedNodeWriter.flush();
 
@@ -219,4 +220,25 @@ public class AnydataSerializeTest extends AbstractAnydataTest {
         assertEquals("<cont xmlns=\"test-anydata\"><cont-any><bar xmlns=\"test-anydata\"></bar></cont-any>"
                 + "<cont-leaf>abc</cont-leaf></cont>", serializedXml);
     }
+
+    @Test
+    public void testNormalizedSerialize() throws IOException, XMLStreamException {
+        final StringWriter writer = new StringWriter();
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(writer);
+
+        final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(
+            xmlStreamWriter, SCHEMA_CONTEXT);
+        final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
+            xmlNormalizedNodeStreamWriter);
+        normalizedNodeWriter.write(ImmutableContainerNodeBuilder.create().withNodeIdentifier(CONT_NODEID)
+            .withChild(ImmutableAnydataNodeBuilder.create(NormalizedAnydata.class).withNodeIdentifier(CONT_ANY_NODEID)
+                .withValue(new ImmutableNormalizedAnydata(SCHEMA_CONTEXT,
+                    SCHEMA_CONTEXT.findDataChildByName(CONT_QNAME).get(), ImmutableContainerNodeBuilder.create()
+                    .withNodeIdentifier(CONT_NODEID).build())).build())
+            .build());
+        normalizedNodeWriter.flush();
+
+        final String serializedXml = writer.toString();
+        assertEquals("<cont xmlns=\"test-anydata\"><cont-any><cont/></cont-any></cont>", serializedXml);
+    }
 }