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%2FXmlStreamUtils.java;h=aa379dc963f11606150fe370339eb21895d7edb8;hb=403b1d2e565e9151d46ed2da199cf810f336b2e8;hp=1d319a5acec49db92d0fb909e266ebc85b313508;hpb=27311d19e3b2ea039726f512932022ce0184f418;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtils.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtils.java index 1d319a5ace..aa379dc963 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtils.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtils.java @@ -1,22 +1,21 @@ package org.opendaylight.yangtools.yang.data.impl.codec.xml; import com.google.common.annotations.Beta; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; - import java.net.URI; +import java.util.Map; import java.util.Map.Entry; - import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.AttributesContainer; import org.opendaylight.yangtools.yang.data.api.CompositeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.Node; import org.opendaylight.yangtools.yang.data.api.SimpleNode; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec; import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; @@ -84,7 +83,7 @@ public class XmlStreamUtils { * @param id InstanceIdentifier * @throws XMLStreamException */ - public static void write(final @Nonnull XMLStreamWriter writer, final @Nonnull InstanceIdentifier id) throws XMLStreamException { + public static void write(final @Nonnull XMLStreamWriter writer, final @Nonnull YangInstanceIdentifier id) throws XMLStreamException { Preconditions.checkNotNull(writer, "Writer may not be null"); Preconditions.checkNotNull(id, "Variable should contain instance of instance identifier and can't be null"); @@ -92,7 +91,10 @@ public class XmlStreamUtils { final String str = XmlUtils.encodeIdentifier(prefixes, id); for (Entry e: prefixes.getPrefixes()) { - writer.writeNamespace(e.getValue(), e.getKey().toString()); + final String ns = e.getKey().toString(); + final String p = e.getValue(); + + writer.writeNamespace(p, ns); } writer.writeCharacters(str); } @@ -143,15 +145,35 @@ public class XmlStreamUtils { final String ns = qname.getNamespace() != null ? qname.getNamespace().toString() : ""; if (isEmptyElement(data)) { - writer.writeEmptyElement(pfx, qname.getLocalName(), ns); + if (hasAttributes(data)) { + writer.writeStartElement(pfx, qname.getLocalName(), ns); + final RandomPrefix randomPrefix = new RandomPrefix(); + writeAttributes(writer, (AttributesContainer) data, randomPrefix); + writer.writeEndElement(); + } else { + writer.writeEmptyElement(pfx, qname.getLocalName(), ns); + } return; } writer.writeStartElement(pfx, qname.getLocalName(), ns); - if (data instanceof AttributesContainer && ((AttributesContainer) data).getAttributes() != null) { - for (Entry attribute : ((AttributesContainer) data).getAttributes().entrySet()) { - writer.writeAttribute(attribute.getKey().getNamespace().toString(), attribute.getKey().getLocalName(), attribute.getValue()); - } + writeValue(writer, data, schema); + writer.writeEndElement(); + } + + /** + * Write a value into a XML stream writer. This method assumes the start and end of element is + * emitted by the caller. + * + * @param writer XML Stream writer + * @param data data node + * @param schema Schema node + * @throws XMLStreamException if an encoding problem occurs + */ + public void writeValue(final XMLStreamWriter writer, final @Nonnull Node data, final SchemaNode schema) throws XMLStreamException { + if (hasAttributes(data)) { + RandomPrefix randomPrefix = new RandomPrefix(); + writeAttributes(writer, (AttributesContainer) data, randomPrefix); } if (data instanceof SimpleNode) { @@ -182,8 +204,30 @@ public class XmlStreamUtils { writeElement(writer, child, childSchema); } } + } - writer.writeEndElement(); + private static void writeAttributes(final XMLStreamWriter writer, final AttributesContainer data, final RandomPrefix randomPrefix) throws XMLStreamException { + for (Entry attribute : data.getAttributes().entrySet()) { + writeAttribute(writer, attribute, randomPrefix); + } + } + + private static boolean hasAttributes(final Node data) { + if (data instanceof AttributesContainer) { + final Map c = ((AttributesContainer) data).getAttributes(); + return c != null && !c.isEmpty(); + } else { + return false; + } + } + + @VisibleForTesting + static void writeAttribute(final XMLStreamWriter writer, final Entry attribute, final RandomPrefix randomPrefix) + throws XMLStreamException { + final QName key = attribute.getKey(); + final String prefix = randomPrefix.encodePrefix(key.getNamespace()); + writer.writeAttribute("xmlns:" + prefix, key.getNamespace().toString()); + writer.writeAttribute(prefix, key.getNamespace().toString(), key.getLocalName(), attribute.getValue()); } /** @@ -191,8 +235,8 @@ public class XmlStreamUtils { * emitted by the caller. * * @param writer XML Stream writer - * @param data data node - * @param schema Schema node + * @param type data type + * @param value data value * @throws XMLStreamException if an encoding problem occurs */ public void writeValue(final @Nonnull XMLStreamWriter writer, final @Nonnull TypeDefinition type, final Object value) throws XMLStreamException { @@ -224,6 +268,7 @@ public class XmlStreamUtils { } } + @SuppressWarnings("deprecation") private static void write(final @Nonnull XMLStreamWriter writer, final @Nonnull IdentityrefTypeDefinition type, final @Nonnull Object value) throws XMLStreamException { if (value instanceof QName) { final QName qname = (QName) value; @@ -234,7 +279,8 @@ public class XmlStreamUtils { prefix = "x"; } - writer.writeNamespace(prefix, qname.getNamespace().toString()); + final String ns = qname.getNamespace().toString(); + writer.writeNamespace(prefix, ns); writer.writeCharacters(prefix + ':' + qname.getLocalName()); } else { LOG.debug("Value of {}:{} is not a QName but {}", type.getQName().getNamespace(), type.getQName().getLocalName(), value.getClass()); @@ -243,10 +289,10 @@ public class XmlStreamUtils { } private static void write(final @Nonnull XMLStreamWriter writer, final @Nonnull InstanceIdentifierTypeDefinition type, final @Nonnull Object value) throws XMLStreamException { - if (value instanceof InstanceIdentifier) { - write(writer, (InstanceIdentifier)value); + if (value instanceof YangInstanceIdentifier) { + write(writer, (YangInstanceIdentifier)value); } else { - LOG.debug("Value of {}:{} is not an InstanceIdentifier but {}", type.getQName().getNamespace(), type.getQName().getLocalName(), value.getClass()); + LOG.warn("Value of {}:{} is not an InstanceIdentifier but {}", type.getQName().getNamespace(), type.getQName().getLocalName(), value.getClass()); writer.writeCharacters(String.valueOf(value)); } }