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=ddef032d9290c90851cd63ea6f6881f42dfe7e50;hb=c430d8edcc4ed5f631775cca231f02fbe8d5a82f;hp=f628ab9c3cbe12730b90d3b8c0e9b4cd73a68f95;hpb=c3c24461dbbf8bab18fc291c89fb99fbf92fe1ba;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..ddef032d92 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(); } /** @@ -82,11 +86,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); } @@ -117,6 +121,19 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode } } + 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); + } + writer.writeEndElement(); + } catch (XMLStreamException e) { + throw new IOException("Failed to emit element", e); + } + } + private void startElement(final QName qname) throws IOException { try { writeStartElement(qname); @@ -140,6 +157,52 @@ 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 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); @@ -439,7 +502,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); } }