Allow JSON/XML writers to be instantiated with root node
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
index 5072d50786c7ec293e8e35e2f43ee5a93b163713..51f1742df540829a83c0f86cb669e307c4fb7615 100644 (file)
@@ -8,19 +8,17 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import com.google.common.base.Strings;
+import static java.util.Objects.requireNonNull;
+
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Map;
-import java.util.Map.Entry;
-import javax.annotation.Nonnull;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-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;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@@ -28,71 +26,50 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
-final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<SchemaNode> {
+final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<SchemaNode>
+        implements SchemaContextProvider {
     private final SchemaTracker tracker;
-    private final XmlStreamUtils streamUtils;
+    private final SchemaAwareXMLStreamWriterUtils streamUtils;
 
-    private SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context,
-                                                           final SchemaPath path) {
+    SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context,
+            final SchemaTracker tracker) {
         super(writer);
-        this.tracker = SchemaTracker.create(context, path);
-        this.streamUtils = XmlStreamUtils.create(context);
-    }
-
-    static NormalizedNodeStreamWriter newInstance(final XMLStreamWriter writer, final SchemaContext context,
-            final SchemaPath path) {
-        return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context, path);
+        this.tracker = requireNonNull(tracker);
+        this.streamUtils = new SchemaAwareXMLStreamWriterUtils(context);
     }
 
     @Override
-    protected void writeAttributes(@Nonnull final Map<QName, String> attributes) throws IOException {
-        for (final Entry<QName, String> qNameStringEntry : attributes.entrySet()) {
-            try {
-                final String namespace = qNameStringEntry.getKey().getNamespace().toString();
-
-                if (Strings.isNullOrEmpty(namespace)) {
-                    writer.writeAttribute(qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue());
-                } else {
-                    writer.writeAttribute(namespace, qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue());
-                }
-            } catch (final XMLStreamException e) {
-                throw new IOException("Unable to emit attribute " + qNameStringEntry, e);
-            }
-        }
-    }
-
-    @Override
-    protected void writeValue(final XMLStreamWriter xmlWriter, final QName qname, final Object value,
+    void writeValue(final XMLStreamWriter xmlWriter, final QName qname, final Object value,
             final SchemaNode schemaNode) throws IOException, XMLStreamException {
         streamUtils.writeValue(xmlWriter, schemaNode, value, qname.getModule());
     }
 
     @Override
-    protected void startList(final NodeIdentifier name) {
+    void startList(final NodeIdentifier name) {
         tracker.startList(name);
     }
 
     @Override
-    protected void startListItem(final PathArgument name) throws IOException {
+    void startListItem(final PathArgument name) throws IOException {
         tracker.startListItem(name);
         startElement(name.getNodeType());
     }
 
     @Override
-    protected void endNode(final XMLStreamWriter xmlWriter) throws IOException, XMLStreamException {
+    public void endNode() throws IOException {
         final Object schema = tracker.endNode();
         if (schema instanceof ListSchemaNode) {
             // For lists, we only emit end element on the inner frame
             final Object parent = tracker.getParent();
             if (parent == schema) {
-                xmlWriter.writeEndElement();
+                endElement();
             }
         } else if (schema instanceof ContainerSchemaNode) {
             // Emit container end element
-            xmlWriter.writeEndElement();
+            endElement();
         }
     }
 
@@ -103,7 +80,8 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    public void leafNode(NodeIdentifier name, Object value, Map<QName, String> attributes) throws IOException {
+    public void leafNode(final NodeIdentifier name, final Object value, final Map<QName, String> attributes)
+        throws IOException {
         final LeafSchemaNode schema = tracker.leafNode(name);
         writeElement(schema.getQName(), value, attributes, schema);
     }
@@ -120,6 +98,7 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
         final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         writeElement(schema.getQName(), value, Collections.emptyMap(), schema);
     }
+
     @Override
     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
         tracker.startLeafSet(name);
@@ -157,4 +136,9 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
         final AnyXmlSchemaNode schema = tracker.anyxmlNode(name);
         anyxmlNode(schema.getQName(), value);
     }
+
+    @Override
+    public SchemaContext getSchemaContext() {
+        return streamUtils.getSchemaContext();
+    }
 }