*/
package org.opendaylight.yangtools.yang.data.codec.xml;
-import com.google.common.base.Strings;
+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 java.util.Map.Entry;
-import javax.annotation.Nonnull;
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.api.schema.stream.NormalizedNodeStreamWriter;
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.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.SchemaPath;
-final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<SchemaNode> {
+final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<SchemaNode>
+ implements SchemaContextProvider {
private final SchemaTracker tracker;
- private final XMLStreamWriterUtils streamUtils;
+ private final SchemaAwareXMLStreamWriterUtils streamUtils;
- private SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context,
- final SchemaPath path) {
+ SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final SchemaContext context,
+ final SchemaTracker tracker) {
super(writer);
- this.tracker = SchemaTracker.create(context, path);
- this.streamUtils = XMLStreamWriterUtils.create(context);
- }
-
- static NormalizedNodeStreamWriter newInstance(final XMLStreamWriter writer, final SchemaContext context,
- final SchemaPath path) {
- return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context, path);
+ this.tracker = requireNonNull(tracker);
+ this.streamUtils = new SchemaAwareXMLStreamWriterUtils(context);
}
@Override
- protected void writeAttributes(@Nonnull final Map<QName, String> attributes) throws IOException {
- for (final Entry<QName, String> qNameStringEntry : attributes.entrySet()) {
- try {
- final String namespace = qNameStringEntry.getKey().getNamespace().toString();
-
- if (Strings.isNullOrEmpty(namespace)) {
- writer.writeAttribute(qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue());
- } else {
- writer.writeAttribute(namespace, qNameStringEntry.getKey().getLocalName(), qNameStringEntry.getValue());
- }
- } catch (final XMLStreamException e) {
- throw new IOException("Unable to emit attribute " + qNameStringEntry, e);
- }
- }
+ String encodeValue(final ValueWriter xmlWriter, final Object value, final SchemaNode schemaNode)
+ throws XMLStreamException {
+ return streamUtils.encodeValue(xmlWriter, schemaNode, value, schemaNode.getQName().getModule());
}
@Override
- protected void writeValue(final XMLStreamWriter xmlWriter, final QName qname, @Nonnull final Object value,
- final SchemaNode schemaNode) throws IOException, XMLStreamException {
- streamUtils.writeValue(xmlWriter, schemaNode, value, qname.getModule());
- }
-
- @Override
- protected void startList(final NodeIdentifier name) {
+ void startList(final NodeIdentifier name) {
tracker.startList(name);
}
@Override
- protected void startListItem(final PathArgument name) throws IOException {
+ void startListItem(final PathArgument name) throws IOException {
tracker.startListItem(name);
startElement(name.getNodeType());
}
@Override
- protected void endNode(final XMLStreamWriter xmlWriter) throws IOException, XMLStreamException {
+ 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) {
- xmlWriter.writeEndElement();
+ endElement();
}
- } else if (schema instanceof ContainerSchemaNode) {
- // Emit container end element
- xmlWriter.writeEndElement();
+ } 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(NodeIdentifier name, Object value, Map<QName, String> attributes) throws IOException {
- final LeafSchemaNode schema = tracker.leafNode(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, final Map<QName, String> attributes)
- throws IOException {
- final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
- writeElement(schema.getQName(), value, attributes, schema);
+ public void startLeafSetEntryNode(final NodeWithValue<?> name) throws IOException {
+ tracker.startLeafSetEntryNode(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);
- }
@Override
public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
tracker.startLeafSet(name);
}
@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);
}
}