X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fcodec%2Fxml%2FXMLStreamNormalizedNodeStreamWriter.java;h=17343e7f30fbef489dfca0106574ccce9d766fee;hb=553cb231f6853f73e816cab0d85e2c6acb8cbb97;hp=f628ab9c3cbe12730b90d3b8c0e9b4cd73a68f95;hpb=46abb79e36f97347496b5247c340d6543b709e8a;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index f628ab9c3c..17343e7f30 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -7,11 +7,12 @@ */ package org.opendaylight.yangtools.yang.data.impl.codec.xml; -import static javax.xml.XMLConstants.DEFAULT_NS_PREFIX; - import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import java.io.IOException; import java.io.StringWriter; +import java.util.Map; +import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -28,6 +29,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.Augmentat import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; +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.data.impl.codec.SchemaTracker; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; @@ -45,18 +47,20 @@ import org.w3c.dom.Element; * A {@link NormalizedNodeStreamWriter} which translates the events into an * {@link XMLStreamWriter}, resulting in a RFC 6020 XML encoding. */ -public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter { +public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNodeStreamAttributeWriter { private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance(); private final XMLStreamWriter writer; private final SchemaTracker tracker; private final XmlStreamUtils streamUtils; + private final RandomPrefix randomPrefix; private XMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context, final SchemaPath path) { this.writer = Preconditions.checkNotNull(writer); this.tracker = SchemaTracker.create(context, path); this.streamUtils = XmlStreamUtils.create(XmlUtils.DEFAULT_XML_CODEC_PROVIDER, context); + randomPrefix = new RandomPrefix(); } /** @@ -75,6 +79,7 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode * * @param writer Output {@link XMLStreamWriter} * @param context Associated {@link SchemaContext}. + * @param path path * * @return A new {@link NormalizedNodeStreamWriter} */ @@ -82,11 +87,11 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode return new XMLStreamNormalizedNodeStreamWriter(writer, context, path); } - private void writeStartElement( QName qname) throws XMLStreamException { + private void writeStartElement(final QName qname) throws XMLStreamException { String ns = qname.getNamespace().toString(); - writer.writeStartElement(DEFAULT_NS_PREFIX, qname.getLocalName(), ns); + writer.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, qname.getLocalName(), ns); if(writer.getNamespaceContext() != null) { - String parentNs = writer.getNamespaceContext().getNamespaceURI(DEFAULT_NS_PREFIX); + String parentNs = writer.getNamespaceContext().getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX); if (!ns.equals(parentNs)) { writer.writeDefaultNamespace(ns); } @@ -97,7 +102,7 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode try { writeStartElement(qname); if (value != null) { - streamUtils.writeValue(writer, type, value); + streamUtils.writeValue(writer, type, value, qname.getModule()); } writer.writeEndElement(); } catch (XMLStreamException e) { @@ -109,7 +114,21 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode try { writeStartElement(qname); if (value != null) { - streamUtils.writeValue(writer, schemaNode, value); + streamUtils.writeValue(writer, schemaNode, value, qname.getModule()); + } + writer.writeEndElement(); + } catch (XMLStreamException e) { + throw new IOException("Failed to emit element", e); + } + } + + private void writeElement(final QName qname, final SchemaNode schemaNode, final Object value, final Map attributes) throws IOException { + try { + writeStartElement(qname); + + writeAttributes(attributes); + if (value != null) { + streamUtils.writeValue(writer, schemaNode, value, qname.getModule()); } writer.writeEndElement(); } catch (XMLStreamException e) { @@ -140,6 +159,59 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode writeElement(schema.getQName(), schema, value); } + @Override + public void leafNode(final NodeIdentifier name, final Object value, final Map attributes) throws IOException { + final LeafSchemaNode schema = tracker.leafNode(name); + writeElement(schema.getQName(), schema, value, attributes); + } + + @Override + public void leafSetEntryNode(final Object value, final Map attributes) throws IOException { + final LeafListSchemaNode schema = tracker.leafSetEntryNode(); + writeElement(schema.getQName(), schema, value, attributes); + } + + @Override + public void startContainerNode(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { + startContainerNode(name, childSizeHint); + writeAttributes(attributes); + } + + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { + startYangModeledAnyXmlNode(name, childSizeHint); + writeAttributes(attributes); + } + + @Override + public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { + startUnkeyedListItem(name, childSizeHint); + writeAttributes(attributes); + } + + @Override + public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint, final Map attributes) throws IOException { + startMapEntryNode(identifier, childSizeHint); + writeAttributes(attributes); + } + + private void writeAttributes(final Map attributes) throws IOException { + for (final Map.Entry qNameStringEntry : attributes.entrySet()) { + try { + final String namespace = qNameStringEntry.getKey().getNamespace().toString(); + + if(Strings.isNullOrEmpty(namespace)) { + writer.writeAttribute(qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue()); + } else { + final String prefix = randomPrefix.encodePrefix(qNameStringEntry.getKey().getNamespace()); + writer.writeAttribute(prefix, namespace, qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue()); + } + } catch (final XMLStreamException e) { + throw new IOException("Unable to emit attribute " + qNameStringEntry, e); + } + } + } + @Override public void startLeafSet(final NodeIdentifier name, final int childSizeHint) { tracker.startLeafSet(name); @@ -214,6 +286,12 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode } } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException { + final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name); + startElement(schema.getQName()); + } + public static String toString(final Element xml) { try { final Transformer transformer = TransformerFactory.newInstance().newTransformer(); @@ -439,7 +517,7 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode } @Override - public Object getProperty(final String name) throws IllegalArgumentException { + public Object getProperty(final String name) { return writer.getProperty(name); } }