X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-codec-xml%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fcodec%2Fxml%2FSchemaAwareXMLStreamNormalizedNodeStreamWriter.java;h=f859479751f1a58a3681e4d58ff27cf94ab22006;hb=5280e8d0efe5177e5bd9fa15bfd2bdc01e222d1b;hp=63fd94b775f3499c0b70e171ad50c30cef8e8e21;hpb=8bfcaa3254d401e4b00cf2da76f64dc56b8a2100;p=yangtools.git diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java index 63fd94b775..f859479751 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java @@ -8,42 +8,68 @@ */ 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.eclipse.jdt.annotation.NonNull; +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; 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.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.data.util.NormalizedNodeStreamWriterStack; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ContainerLike; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; 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.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; -final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter - implements SchemaContextProvider { - private final SchemaTracker tracker; +final class SchemaAwareXMLStreamNormalizedNodeStreamWriter + extends XMLStreamNormalizedNodeStreamWriter implements EffectiveModelContextProvider { + private final NormalizedNodeStreamWriterStack tracker; private final SchemaAwareXMLStreamWriterUtils streamUtils; - SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context, - final SchemaTracker tracker) { + SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final EffectiveModelContext context, + final NormalizedNodeStreamWriterStack tracker) { super(writer); this.tracker = requireNonNull(tracker); this.streamUtils = new SchemaAwareXMLStreamWriterUtils(context); } @Override - void writeValue(final ValueWriter xmlWriter, final Object value, final SchemaNode schemaNode) + String encodeValue(final ValueWriter xmlWriter, final Object value, final TypedDataSchemaNode schemaNode) throws XMLStreamException { - streamUtils.writeValue(xmlWriter, schemaNode, value, schemaNode.getQName().getModule()); + return streamUtils.encodeValue(xmlWriter, resolveType(schemaNode.getType()), value, + schemaNode.getQName().getModule()); + } + + @Override + String encodeAnnotationValue(final ValueWriter xmlWriter, final QName qname, final Object value) + throws XMLStreamException { + final Optional optAnnotation = + AnnotationSchemaNode.find(streamUtils.getEffectiveModelContext(), qname); + if (optAnnotation.isPresent()) { + return streamUtils.encodeValue(xmlWriter, resolveType(optAnnotation.get().getType()), 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 @@ -66,7 +92,8 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm if (parent == schema) { endElement(); } - } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode) { + } else if (schema instanceof ContainerLike || schema instanceof LeafSchemaNode + || schema instanceof AnydataSchemaNode || schema instanceof AnyxmlSchemaNode) { endElement(); } } @@ -110,32 +137,52 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm } @Override - public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException { - final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name); - startElement(schema.getQName()); + 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 - public void startAnyxmlNode(final NodeIdentifier name) throws IOException { - tracker.startAnyxmlNode(name); - startElement(name.getNodeType()); + public EffectiveModelContext getEffectiveModelContext() { + return streamUtils.getEffectiveModelContext(); } @Override - public SchemaContext getSchemaContext() { - return streamUtils.getSchemaContext(); + public void scalarValue(final Object value) throws IOException { + final Object current = tracker.getParent(); + 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 nodeValue(final Object value) throws IOException { + public void domSourceValue(final DOMSource value) throws IOException { final Object current = tracker.getParent(); - checkState(current instanceof LeafSchemaNode || current instanceof AnyXmlSchemaNode - || current instanceof LeafListSchemaNode, "Unexpected scala value %s with %s", value, current); - final SchemaNode schema = (SchemaNode) current; - if (current instanceof AnyXmlSchemaNode) { - anyxmlValue(value); - } else { - writeValue(value, schema); + checkState(current instanceof AnyxmlSchemaNode, "Unexpected scala value %s with %s", value, current); + anyxmlValue(value); + } + + @Override + void startAnydata(final NodeIdentifier name) { + tracker.startAnydataNode(name); + } + + private @NonNull TypeDefinition resolveType(final @NonNull TypeDefinition type) throws XMLStreamException { + if (type instanceof LeafrefTypeDefinition) { + try { + return tracker.resolveLeafref((LeafrefTypeDefinition) type); + } catch (IllegalArgumentException e) { + throw new XMLStreamException("Cannot resolved type " + type, e); + } } + return type; } }