From 15ae10fcef8efa8ed397c9cac9be596e92a39eec Mon Sep 17 00:00:00 2001 From: Igor Foltin Date: Thu, 6 Jul 2017 13:53:17 +0200 Subject: [PATCH] Bug 8745: Add support for parsing attributes to the new XML parser New XML parser is now able to parse XML attributes in order to provide necessary information for processing edit-config messages in NETCONF. Make some members of ImmutableNormalizedNodeStreamWriter protected so they can be reused in the EditOperationNormalizedNodeStreamWriter extension in NETCONF. Add a unit test This patch is a prerequisite for the following change in NETCONF: https://git.opendaylight.org/gerrit/#/c/60014/ Change-Id: Idfd87279814e324dc914809fb09abfbb27eefa4a Signed-off-by: Igor Foltin --- .../yang/data/codec/xml/XmlParserStream.java | 37 ++++++ .../yang/data/codec/xml/Bug8745Test.java | 110 ++++++++++++++++++ .../src/test/resources/bug8745/foo.xml | 8 ++ .../src/test/resources/bug8745/foo.yang | 22 ++++ .../ImmutableNormalizedNodeStreamWriter.java | 8 +- .../data/util/AbstractNodeDataWithSchema.java | 23 ++++ .../util/ContainerNodeDataWithSchema.java | 10 +- .../util/LeafListEntryNodeDataWithSchema.java | 9 +- .../data/util/LeafNodeDataWithSchema.java | 9 +- .../util/ListEntryNodeDataWithSchema.java | 14 ++- .../YangModeledAnyXmlNodeDataWithSchema.java | 10 +- 11 files changed, 251 insertions(+), 9 deletions(-) create mode 100644 yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java create mode 100644 yang/yang-data-codec-xml/src/test/resources/bug8745/foo.xml create mode 100644 yang/yang-data-codec-xml/src/test/resources/bug8745/foo.yang diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java index 7293b70e4c..59afd1002a 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.codec.xml; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; import java.io.Closeable; import java.io.Flushable; import java.io.IOException; @@ -18,8 +19,11 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Deque; import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Set; import javax.annotation.concurrent.NotThreadSafe; +import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.Location; @@ -28,6 +32,7 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.dom.DOMSource; import org.opendaylight.yangtools.util.xml.UntrustedXML; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.util.AbstractNodeDataWithSchema; import org.opendaylight.yangtools.yang.data.util.AnyXmlNodeDataWithSchema; @@ -189,6 +194,29 @@ public final class XmlParserStream implements Closeable, Flushable { return this; } + private static Map getElementAttributes(final XMLStreamReader in) { + Preconditions.checkState(in.isStartElement(), "Attributes can be extracted only from START_ELEMENT."); + final Map attributes = new LinkedHashMap<>(); + + for (int attrIndex = 0; attrIndex < in.getAttributeCount(); attrIndex++) { + String attributeNS = in.getAttributeNamespace(attrIndex); + + if (attributeNS == null) { + attributeNS = ""; + } + + // Skip namespace definitions + if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attributeNS)) { + continue; + } + + final QName qName = new QName(URI.create(attributeNS), in.getAttributeLocalName(attrIndex)); + attributes.put(qName, in.getAttributeValue(attrIndex)); + } + + return ImmutableMap.copyOf(attributes); + } + private static String readAnyXmlValue(final XMLStreamReader in) throws XMLStreamException { final StringBuilder sb = new StringBuilder(); final String anyXmlElementName = in.getLocalName(); @@ -221,6 +249,7 @@ public final class XmlParserStream implements Closeable, Flushable { } if (parent instanceof LeafNodeDataWithSchema || parent instanceof LeafListEntryNodeDataWithSchema) { + parent.setAttributes(getElementAttributes(in)); setValue(parent, in.getElementText().trim(), in.getNamespaceContext()); if (isNextEndDocument(in)) { return; @@ -232,6 +261,10 @@ public final class XmlParserStream implements Closeable, Flushable { return; } + if (parent instanceof ListEntryNodeDataWithSchema || parent instanceof ContainerNodeDataWithSchema) { + parent.setAttributes(getElementAttributes(in)); + } + if (parent instanceof LeafListNodeDataWithSchema || parent instanceof ListNodeDataWithSchema) { String xmlElementName = in.getLocalName(); while (xmlElementName.equals(parent.getSchema().getQName().getLocalName())) { @@ -258,6 +291,10 @@ public final class XmlParserStream implements Closeable, Flushable { return; } + if (parent instanceof YangModeledAnyXmlSchemaNode) { + parent.setAttributes(getElementAttributes(in)); + } + switch (in.nextTag()) { case XMLStreamConstants.START_ELEMENT: final Set namesakes = new HashSet<>(); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java new file mode 100644 index 0000000000..dd8fc35f57 --- /dev/null +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.yangtools.yang.data.codec.xml; + +import com.google.common.base.Preconditions; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.XMLAssert; +import org.custommonkey.xmlunit.XMLUnit; +import org.junit.Test; +import org.opendaylight.yangtools.util.xml.UntrustedXML; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; +import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; + +public class Bug8745Test { + + @Test + public void testParsingAttributes() throws Exception { + final SchemaContext schemaContext = YangParserTestUtils.parseYangSource("/bug8745/foo.yang"); + final QName contWithAttributes = QName.create("foo", "1970-01-01", "cont-with-attributes"); + final ContainerSchemaNode contWithAttr = (ContainerSchemaNode) SchemaContextUtil.findDataSchemaNode( + schemaContext, SchemaPath.create(true, contWithAttributes)); + + final Document doc = loadDocument("/bug8745/foo.xml"); + + final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument()); + + final XMLOutputFactory outputfactory = XMLOutputFactory.newInstance(); + outputfactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); + + final XMLStreamWriter xmlStreamWriter = outputfactory.createXMLStreamWriter(domResult); + + final NormalizedNodeStreamWriter streamWriter = XMLStreamNormalizedNodeStreamWriter.create( + xmlStreamWriter, schemaContext); + + final InputStream resourceAsStream = Bug8745Test.class.getResourceAsStream( + "/bug8745/foo.xml"); + final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + final XMLStreamReader reader = inputFactory.createXMLStreamReader(resourceAsStream); + + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, contWithAttr); + xmlParser.parse(reader); + + XMLUnit.setIgnoreWhitespace(true); + XMLUnit.setNormalize(true); + + final String expectedXml = toString(doc.getDocumentElement()); + final String serializedXml = toString(domResult.getNode()); + final Diff diff = new Diff(expectedXml, serializedXml); + + XMLAssert.assertXMLEqual(diff, true); + } + + private static Document loadDocument(final String xmlPath) throws IOException, SAXException { + final InputStream resourceAsStream = NormalizedNodesToXmlTest.class.getResourceAsStream(xmlPath); + final Document currentConfigElement = readXmlToDocument(resourceAsStream); + Preconditions.checkNotNull(currentConfigElement); + return currentConfigElement; + } + + private static Document readXmlToDocument(final InputStream xmlContent) throws IOException, SAXException { + final Document doc = UntrustedXML.newDocumentBuilder().parse(xmlContent); + doc.getDocumentElement().normalize(); + return doc; + } + + private static String toString(final Node xml) { + try { + final Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + + final StreamResult result = new StreamResult(new StringWriter()); + final DOMSource source = new DOMSource(xml); + transformer.transform(source, result); + + return result.getWriter().toString(); + } catch (IllegalArgumentException | TransformerFactoryConfigurationError | TransformerException e) { + throw new RuntimeException("Unable to serialize xml element " + xml, e); + } + } +} diff --git a/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.xml b/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.xml new file mode 100644 index 0000000000..304b11b7db --- /dev/null +++ b/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.xml @@ -0,0 +1,8 @@ + + + lf-val + lfl-val + + key-val + + \ No newline at end of file diff --git a/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.yang b/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.yang new file mode 100644 index 0000000000..c2958d511f --- /dev/null +++ b/yang/yang-data-codec-xml/src/test/resources/bug8745/foo.yang @@ -0,0 +1,22 @@ +module foo { + namespace foo; + prefix foo; + + container cont-with-attributes { + leaf leaf-with-attributes { + type string; + } + + leaf-list leaf-list-with-attributes { + type string; + } + + list list-with-attributes { + key list-key; + + leaf list-key { + type string; + } + } + } +} \ No newline at end of file diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java index 2b6c3dc3b2..e20a481296 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java @@ -119,8 +119,12 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream return new ImmutableNormalizedNodeStreamWriter(result); } + protected Deque getBuilders() { + return builders; + } + @SuppressWarnings("rawtypes") - private NormalizedNodeContainerBuilder getCurrent() { + protected NormalizedNodeContainerBuilder getCurrent() { return builders.peek(); } @@ -303,7 +307,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @SuppressWarnings("rawtypes") - private static final class NormalizedNodeResultBuilder implements NormalizedNodeContainerBuilder { + protected static final class NormalizedNodeResultBuilder implements NormalizedNodeContainerBuilder { private final NormalizedNodeResult result; diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractNodeDataWithSchema.java index b6368c768e..db7cb77065 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractNodeDataWithSchema.java @@ -10,7 +10,9 @@ package org.opendaylight.yangtools.yang.data.util; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import java.io.IOException; +import java.util.Map; import java.util.Objects; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -22,6 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @Beta public abstract class AbstractNodeDataWithSchema { private final DataSchemaNode schema; + private Map attributes; public AbstractNodeDataWithSchema(final DataSchemaNode schema) { this.schema = Preconditions.checkNotNull(schema); @@ -36,6 +39,26 @@ public abstract class AbstractNodeDataWithSchema { return schema; } + /** + * Set the associated attributes. + * + * @param attributes parsed attributes + */ + public final void setAttributes(final Map attributes) { + Preconditions.checkState(this.attributes == null, "Node '%s' has already set its attributes to %s.", + getSchema().getQName(), this.attributes); + this.attributes = attributes; + } + + /** + * Return the associated attributes. + * + * @return associated attributes + */ + public final Map getAttributes() { + return attributes; + } + /** * Emit this node's events into the specified writer. * diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerNodeDataWithSchema.java index 3ebc481d21..623199c090 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerNodeDataWithSchema.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.util; import java.io.IOException; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -27,7 +28,14 @@ public class ContainerNodeDataWithSchema extends CompositeNodeDataWithSchema { @Override public void write(final NormalizedNodeStreamWriter writer) throws IOException { writer.nextDataSchemaNode(getSchema()); - writer.startContainerNode(provideNodeIdentifier(), childSizeHint()); + + if (writer instanceof NormalizedNodeStreamAttributeWriter && getAttributes() != null) { + ((NormalizedNodeStreamAttributeWriter) writer).startContainerNode(provideNodeIdentifier(), childSizeHint(), + getAttributes()); + } else { + writer.startContainerNode(provideNodeIdentifier(), childSizeHint()); + } + super.write(writer); writer.endNode(); } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryNodeDataWithSchema.java index ff65f3ca03..8373dc7e52 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryNodeDataWithSchema.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.util; import java.io.IOException; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -26,6 +27,12 @@ public class LeafListEntryNodeDataWithSchema extends SimpleNodeDataWithSchema { @Override public void write(final NormalizedNodeStreamWriter writer) throws IOException { writer.nextDataSchemaNode(getSchema()); - writer.leafSetEntryNode(getSchema().getQName(), getValue()); + + if (writer instanceof NormalizedNodeStreamAttributeWriter && getAttributes() != null) { + ((NormalizedNodeStreamAttributeWriter) writer).leafSetEntryNode(getSchema().getQName(), getValue(), + getAttributes()); + } else { + writer.leafSetEntryNode(getSchema().getQName(), getValue()); + } } } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafNodeDataWithSchema.java index c3e6bf81ed..380ca99c32 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafNodeDataWithSchema.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.util; import java.io.IOException; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -27,6 +28,12 @@ public class LeafNodeDataWithSchema extends SimpleNodeDataWithSchema { @Override public void write(final NormalizedNodeStreamWriter writer) throws IOException { writer.nextDataSchemaNode(getSchema()); - writer.leafNode(provideNodeIdentifier(), getValue()); + + if (writer instanceof NormalizedNodeStreamAttributeWriter && getAttributes() != null) { + ((NormalizedNodeStreamAttributeWriter) writer).leafNode(provideNodeIdentifier(), getValue(), + getAttributes()); + } else { + writer.leafNode(provideNodeIdentifier(), getValue()); + } } } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListEntryNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListEntryNodeDataWithSchema.java index 13a734d28d..8c75133910 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListEntryNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListEntryNodeDataWithSchema.java @@ -15,6 +15,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -74,9 +75,16 @@ public class ListEntryNodeDataWithSchema extends CompositeNodeDataWithSchema { } writer.nextDataSchemaNode(getSchema()); - writer.startMapEntryNode( - new NodeIdentifierWithPredicates(getSchema().getQName(), predicates), - childSizeHint()); + + if (writer instanceof NormalizedNodeStreamAttributeWriter && getAttributes() != null) { + ((NormalizedNodeStreamAttributeWriter) writer).startMapEntryNode( + new NodeIdentifierWithPredicates(getSchema().getQName(), predicates), childSizeHint(), + getAttributes()); + } else { + writer.startMapEntryNode(new NodeIdentifierWithPredicates(getSchema().getQName(), predicates), + childSizeHint()); + } + super.write(writer); writer.endNode(); } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/YangModeledAnyXmlNodeDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/YangModeledAnyXmlNodeDataWithSchema.java index 4e50c5701d..544eb9ca7c 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/YangModeledAnyXmlNodeDataWithSchema.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/YangModeledAnyXmlNodeDataWithSchema.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.util; import java.io.IOException; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; @@ -27,7 +28,14 @@ public final class YangModeledAnyXmlNodeDataWithSchema extends CompositeNodeData @Override public void write(final NormalizedNodeStreamWriter writer) throws IOException { writer.nextDataSchemaNode(getSchema()); - writer.startYangModeledAnyXmlNode(provideNodeIdentifier(), childSizeHint()); + + if (writer instanceof NormalizedNodeStreamAttributeWriter && getAttributes() != null) { + ((NormalizedNodeStreamAttributeWriter) writer).startYangModeledAnyXmlNode(provideNodeIdentifier(), + childSizeHint(), getAttributes()); + } else { + writer.startYangModeledAnyXmlNode(provideNodeIdentifier(), childSizeHint()); + } + super.write(writer); writer.endNode(); } -- 2.36.6