Switch NodeDataWithSchema to use NormalizedMetadataStreamWriter
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
index a13a1646e6e18c4a4c2b62799520bb04c64d5762..a4510dc8a3b3cf4c9b132a329eab9d4d859c888a 100644 (file)
@@ -8,13 +8,17 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 import java.io.IOException;
+import java.util.Optional;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.yangtools.rfc7952.model.api.AnnotationSchemaNode;
+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.NodeWithValue;
@@ -47,6 +51,20 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
         return streamUtils.encodeValue(xmlWriter, schemaNode, value, schemaNode.getQName().getModule());
     }
 
+    @Override
+    String encodeAnnotationValue(final ValueWriter xmlWriter, final QName qname, final Object value)
+            throws XMLStreamException {
+        final Optional<AnnotationSchemaNode> optAnnotation = AnnotationSchemaNode.find(streamUtils.getSchemaContext(),
+            qname);
+        if (optAnnotation.isPresent()) {
+            return streamUtils.encodeValue(xmlWriter, optAnnotation.get(), value, qname.getModule());
+        }
+
+        checkArgument(!qname.getRevision().isPresent(), "Failed to find bound annotation %s", qname);
+        checkArgument(value instanceof String, "Invalid non-string value %s for unbound annotation %s", value, qname);
+        return (String) value;
+    }
+
     @Override
     void startList(final NodeIdentifier name) {
         tracker.startList(name);