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.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.ContainerSchemaNode;
+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<SchemaNode>
- implements SchemaContextProvider {
- private final SchemaTracker tracker;
+final class SchemaAwareXMLStreamNormalizedNodeStreamWriter
+ extends XMLStreamNormalizedNodeStreamWriter<TypedDataSchemaNode> 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
- 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, resolveType(schemaNode.getType()), 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);
+ final Optional<AnnotationSchemaNode> optAnnotation =
+ AnnotationSchemaNode.find(streamUtils.getEffectiveModelContext(), qname);
if (optAnnotation.isPresent()) {
- return streamUtils.encodeValue(xmlWriter, optAnnotation.get(), value, qname.getModule());
+ return streamUtils.encodeValue(xmlWriter, resolveType(optAnnotation.get().getType()), value,
+ qname.getModule());
}
checkArgument(!qname.getRevision().isPresent(), "Failed to find bound annotation %s", qname);
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();
}
tracker.startAugmentationNode(identifier);
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name);
- startElement(schema.getQName());
- }
-
@Override
public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
if (DOMSource.class.isAssignableFrom(objectModel)) {
}
@Override
- public SchemaContext getSchemaContext() {
- return streamUtils.getSchemaContext();
+ public EffectiveModelContext getEffectiveModelContext() {
+ return streamUtils.getEffectiveModelContext();
}
@Override
public void scalarValue(final Object value) throws IOException {
final Object current = tracker.getParent();
if (current instanceof TypedDataSchemaNode) {
- writeValue(value, (SchemaNode) current);
+ writeValue(value, (TypedDataSchemaNode) current);
} else if (current instanceof AnydataSchemaNode) {
anydataValue(value);
} else {
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;
+ }
}