From: Robert Varga Date: Fri, 7 Jun 2019 13:41:54 +0000 (+0200) Subject: End anydata element X-Git-Tag: v3.0.2~7 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F48%2F82448%2F5;p=yangtools.git End anydata element 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 --- diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java index ef6b5dd0ed..609c4d541b 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java @@ -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(); } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java index c1fc8b5e7e..19c05c251c 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java @@ -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); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractAnydataTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractAnydataTest.java index 792d08f686..2e9340a1e4 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractAnydataTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractAnydataTest.java @@ -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("" + str + "")).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("" + str + "")).getDocumentElement())); + } catch (IOException | SAXException e) { + throw new IllegalStateException(e); + } } static InputStream toInputStream(final String str) { diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java index cd20873fa4..2d8c9b5480 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java @@ -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("")).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("" + "abc", 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("", serializedXml); + } }