Propagate type to XMLStreamWriterUtils
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
index a4510dc8a3b3cf4c9b132a329eab9d4d859c888a..c74a80e2fcb539ca9ee83959e608a11e4f359399 100644 (file)
@@ -24,7 +24,8 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 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;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -32,9 +33,10 @@ 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.TypedDataSchemaNode;
 
-final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<SchemaNode>
-        implements SchemaContextProvider {
+final class SchemaAwareXMLStreamNormalizedNodeStreamWriter
+        extends XMLStreamNormalizedNodeStreamWriter<TypedDataSchemaNode> implements SchemaContextProvider {
     private final SchemaTracker tracker;
     private final SchemaAwareXMLStreamWriterUtils streamUtils;
 
@@ -46,9 +48,10 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    String encodeValue(final ValueWriter xmlWriter, final Object value, final SchemaNode schemaNode)
+    String encodeValue(final ValueWriter xmlWriter, final Object value, final TypedDataSchemaNode schemaNode)
             throws XMLStreamException {
-        return streamUtils.encodeValue(xmlWriter, schemaNode, value, schemaNode.getQName().getModule());
+        return streamUtils.encodeValue(xmlWriter, schemaNode, schemaNode.getType(), value,
+            schemaNode.getQName().getModule());
     }
 
     @Override
@@ -57,7 +60,8 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
         final Optional<AnnotationSchemaNode> optAnnotation = AnnotationSchemaNode.find(streamUtils.getSchemaContext(),
             qname);
         if (optAnnotation.isPresent()) {
-            return streamUtils.encodeValue(xmlWriter, optAnnotation.get(), value, qname.getModule());
+            final AnnotationSchemaNode schema = optAnnotation.get();
+            return streamUtils.encodeValue(xmlWriter, schema, schema.getType(), value, qname.getModule());
         }
 
         checkArgument(!qname.getRevision().isPresent(), "Failed to find bound annotation %s", qname);
@@ -85,7 +89,8 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
             if (parent == schema) {
                 endElement();
             }
-        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode) {
+        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode
+                || schema instanceof AnydataSchemaNode || schema instanceof AnyxmlSchemaNode) {
             endElement();
         }
     }
@@ -135,9 +140,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        tracker.startAnyxmlNode(name);
-        startElement(name.getNodeType());
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            tracker.startAnyxmlNode(name);
+            startElement(name.getNodeType());
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -148,15 +157,24 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     @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);
+        if (current instanceof TypedDataSchemaNode) {
+            writeValue(value, (TypedDataSchemaNode) current);
+        } else if (current instanceof AnydataSchemaNode) {
+            anydataValue(value);
+        } else {
+            throw new IllegalStateException("Unexpected scalar value " + value + " with " + 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);
+        checkState(current instanceof AnyxmlSchemaNode, "Unexpected scala value %s with %s", value, current);
         anyxmlValue(value);
     }
+
+    @Override
+    void startAnydata(final NodeIdentifier name) {
+        tracker.startAnydataNode(name);
+    }
 }