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=028374965f32a82bd3c4c29a95e6024cd494e6f9;hb=73ecace3825eb4a9724d2987dbb78d177065d0cc;hp=f628ab9c3cbe12730b90d3b8c0e9b4cd73a68f95;hpb=c5bde84eced27e2d073554420c3f47eca85af32c;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..028374965f 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; @@ -38,25 +40,26 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; 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 +78,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,22 +86,22 @@ 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); } } } - private void writeElement(final QName qname, final TypeDefinition type, final Object value) throws IOException { + private void writeElement(final QName qname, final SchemaNode schemaNode, final Object value) throws IOException { try { writeStartElement(qname); if (value != null) { - streamUtils.writeValue(writer, type, value); + streamUtils.writeValue(writer, schemaNode, value, qname.getModule()); } writer.writeEndElement(); } catch (XMLStreamException e) { @@ -105,11 +109,13 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode } } - private void writeElement(final QName qname, final SchemaNode schemaNode, final Object value) throws IOException { + 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); + streamUtils.writeValue(writer, schemaNode, value, qname.getModule()); } writer.writeEndElement(); } catch (XMLStreamException e) { @@ -140,17 +146,75 @@ 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 QName name, 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); } @Override - public void leafSetEntryNode(final Object value) throws IOException { + public void leafSetEntryNode(final QName name, final Object value) throws IOException { final LeafListSchemaNode schema = tracker.leafSetEntryNode(); writeElement(schema.getQName(), schema, value); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) { + tracker.startLeafSet(name); + } + @Override public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException { final SchemaNode schema = tracker.startContainerNode(name); @@ -214,9 +278,15 @@ 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(); + final Transformer transformer = TRANSFORMER_FACTORY.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); final StreamResult result = new StreamResult(new StringWriter()); @@ -439,7 +509,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); } }