Switch XML value encoding
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
index b2f20c1d28cc0a1b11c9f1c899c4b85e3af91568..a13a1646e6e18c4a4c2b62799520bb04c64d5762 100644 (file)
@@ -8,16 +8,16 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
+import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.Map;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.yang.common.QName;
+import javax.xml.transform.dom.DOMSource;
 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.NodeWithValue;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
@@ -42,9 +42,9 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    void writeValue(final ValueWriter xmlWriter, final QName qname, final Object value,
-            final SchemaNode schemaNode) throws XMLStreamException {
-        streamUtils.writeValue(xmlWriter, schemaNode, value, qname.getModule());
+    String encodeValue(final ValueWriter xmlWriter, final Object value, final SchemaNode schemaNode)
+            throws XMLStreamException {
+        return streamUtils.encodeValue(xmlWriter, schemaNode, value, schemaNode.getQName().getModule());
     }
 
     @Override
@@ -61,42 +61,27 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     @Override
     public void endNode() throws IOException {
         final Object schema = tracker.endNode();
-        if (schema instanceof ListSchemaNode) {
+        if (schema instanceof ListSchemaNode || schema instanceof LeafListSchemaNode) {
             // For lists, we only emit end element on the inner frame
             final Object parent = tracker.getParent();
             if (parent == schema) {
                 endElement();
             }
-        } else if (schema instanceof ContainerSchemaNode) {
-            // Emit container end element
+        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode) {
             endElement();
         }
     }
 
     @Override
-    public void leafNode(final NodeIdentifier name, final Object value) throws IOException {
-        final LeafSchemaNode schema = tracker.leafNode(name);
-        writeElement(schema.getQName(), value, Collections.emptyMap(), schema);
-    }
-
-    @Override
-    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);
-    }
-
-    @Override
-    public void leafSetEntryNode(final QName name, final Object value, final Map<QName, String> attributes)
-            throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
-        writeElement(schema.getQName(), value, attributes, schema);
+    public void startLeafNode(final NodeIdentifier name) throws IOException {
+        tracker.startLeafNode(name);
+        startElement(name.getNodeType());
     }
 
     @Override
-    public void leafSetEntryNode(final QName name, final Object value) throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
-        writeElement(schema.getQName(), value, Collections.emptyMap(), schema);
+    public void startLeafSetEntryNode(final NodeWithValue<?> name) throws IOException {
+        tracker.startLeafSetEntryNode(name);
+        startElement(name.getNodeType());
     }
 
     @Override
@@ -132,13 +117,28 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    public void anyxmlNode(final NodeIdentifier name, final Object value) throws IOException {
-        final AnyXmlSchemaNode schema = tracker.anyxmlNode(name);
-        anyxmlNode(schema.getQName(), value);
+    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
+        tracker.startAnyxmlNode(name);
+        startElement(name.getNodeType());
     }
 
     @Override
     public SchemaContext getSchemaContext() {
         return streamUtils.getSchemaContext();
     }
+
+    @Override
+    public void scalarValue(final Object value) throws IOException {
+        final Object current = tracker.getParent();
+        checkState(current instanceof LeafSchemaNode || current instanceof LeafListSchemaNode,
+            "Unexpected scalar value %s with %s", value, current);
+        writeValue(value, (SchemaNode) current);
+    }
+
+    @Override
+    public void domSourceValue(final DOMSource value) throws IOException {
+        final Object current = tracker.getParent();
+        checkState(current instanceof AnyXmlSchemaNode, "Unexpected scala value %s with %s", value, current);
+        anyxmlValue(value);
+    }
 }