X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-codec-xml%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fcodec%2Fxml%2FStreamWriterFacade.java;h=22d9a4e2917957bbfa1dd56050b03cc6a62b1655;hb=e52e9a1e6d035f64165ce1bc2bb8f6686f1cba6d;hp=fd950978043695a5ff0f62a090e7c3f23aa968b8;hpb=262e81a79d1a124f8f5c6a747d8408fabe0b9048;p=yangtools.git diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java index fd95097804..22d9a4e291 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java @@ -11,8 +11,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.base.Strings; import java.net.URI; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.xml.XMLConstants; @@ -31,6 +29,7 @@ import org.slf4j.LoggerFactory; final class StreamWriterFacade extends ValueWriter { private static final Logger LOG = LoggerFactory.getLogger(StreamWriterFacade.class); private static final Set BROKEN_NAMESPACES = ConcurrentHashMap.newKeySet(); + private static final Set LEGACY_ATTRIBUTES = ConcurrentHashMap.newKeySet(); private final XMLStreamWriter writer; private final RandomPrefix prefixes; @@ -44,7 +43,6 @@ final class StreamWriterFacade extends ValueWriter { prefixes = new RandomPrefix(writer.getNamespaceContext()); } - @Override void writeCharacters(final String text) throws XMLStreamException { if (!Strings.isNullOrEmpty(text)) { flushElement(); @@ -115,22 +113,7 @@ final class StreamWriterFacade extends ValueWriter { } } - void writeAttributes(final Map attributes) throws XMLStreamException { - flushElement(); - for (final Entry entry : attributes.entrySet()) { - final QName qname = entry.getKey(); - final String namespace = qname.getNamespace().toString(); - - if (!Strings.isNullOrEmpty(namespace)) { - final String prefix = getPrefix(qname.getNamespace(), namespace); - writer.writeAttribute(prefix, namespace, qname.getLocalName(), entry.getValue()); - } else { - writer.writeAttribute(qname.getLocalName(), entry.getValue()); - } - } - } - - private String getPrefix(final URI uri, final String str) throws XMLStreamException { + String getPrefix(final URI uri, final String str) throws XMLStreamException { final String prefix = writer.getPrefix(str); if (prefix != null) { return prefix; @@ -175,14 +158,25 @@ final class StreamWriterFacade extends ValueWriter { void writeStreamReader(final DOMSourceXMLStreamReader reader) throws XMLStreamException { flushElement(); + // We track depth, as we do not want to output the top-most element + int depth = 0; while (reader.hasNext()) { final int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: - forwardStartElement(reader); + if (depth != 0) { + forwardStartElement(reader); + } else { + forwardNamespaces(reader); + forwardAttributes(reader); + } + ++depth; break; case XMLStreamConstants.END_ELEMENT: - writer.writeEndElement(); + if (depth != 0) { + writer.writeEndElement(); + } + --depth; break; case XMLStreamConstants.PROCESSING_INSTRUCTION: forwardProcessingInstruction(reader); @@ -223,8 +217,16 @@ final class StreamWriterFacade extends ValueWriter { } } + static void warnLegacyAttribute(final String localName) { + if (LEGACY_ATTRIBUTES.add(localName)) { + LOG.info("Encountered annotation {} not bound to module. Please examine the call stack and fix this " + + "warning by defining a proper YANG annotation to cover it", localName, + new Throwable("Call stack")); + } + } + private void forwardAttributes(final DOMSourceXMLStreamReader reader) throws XMLStreamException { - for (int i = 0; i < reader.getAttributeCount(); ++i) { + for (int i = 0, count = reader.getAttributeCount(); i < count; ++i) { final String localName = reader.getAttributeLocalName(i); final String value = reader.getAttributeValue(i); final String prefix = reader.getAttributePrefix(i);