Fix AnyXmlNode root element namespace/attribute forwarding
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / StreamWriterFacade.java
index fd950978043695a5ff0f62a090e7c3f23aa968b8..22d9a4e2917957bbfa1dd56050b03cc6a62b1655 100644 (file)
@@ -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<String> BROKEN_NAMESPACES = ConcurrentHashMap.newKeySet();
+    private static final Set<String> 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<QName, String> attributes) throws XMLStreamException {
-        flushElement();
-        for (final Entry<QName, String> 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);