From: Jan Hajnar Date: Fri, 7 Aug 2015 12:20:01 +0000 (+0200) Subject: Bug 2062 - StreamWriter APIs loses information about leaf-set ordering X-Git-Tag: release/beryllium~31 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=yangtools.git;a=commitdiff_plain;h=e53f1eb27ea4bf5bc49ceda03fd94b787755ff18 Bug 2062 - StreamWriter APIs loses information about leaf-set ordering * added start methods for OrderedLeafSet * modified classes that use NormalizedNodeStreamWriter to use startOrderedLeafSet when needed. Change-Id: I890a338313229b1600adcf5ac2ef1c8b440a220d Signed-off-by: Jan Hajnar Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java index 805aafb477..60e8abfbe3 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java @@ -27,6 +27,11 @@ public abstract class ForwardingNormalizedNodeStreamWriter extends ForwardingObj delegate().startLeafSet(name, childSizeHint); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException { + delegate().startOrderedLeafSet(name, childSizeHint); + } + @Override public void leafSetEntryNode(final Object value) throws IOException { delegate().leafSetEntryNode(value); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java index 19536df9c2..121a654a5e 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java @@ -84,6 +84,12 @@ public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeSt incIndent(); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) { + LOG.debug("{}{}(leaf-list)", ind(), name); + incIndent(); + } + @Override public void startContainerNode(final NodeIdentifier name, final int childSizeHint) { LOG.debug("{}{}(container)", ind(), name); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java index 983378703e..98725c9aa9 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java @@ -138,6 +138,32 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { */ void startLeafSet(NodeIdentifier name, int childSizeHint) throws IOException; + /** + * + * Emits a start of leaf set (leaf-list). + *

+ * Emits start of leaf set, during writing leaf set event, only + * {@link #leafSetEntryNode(Object)} calls are valid. Leaf set event is + * finished by calling {@link #endNode()}. + * + * @param name + * name of node as defined in schema, namespace and revision are + * derived from parent node. + * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. + * @throws IllegalArgumentException + * If emitted leaf node is invalid in current context or was + * emitted multiple times. + * @throws IllegalStateException + * If node was emitted inside map, + * choice unkeyed list node. + * @throws IOException if an underlying IO error occurs + */ + void startOrderedLeafSet(NodeIdentifier name, int childSizeHint) throws IOException, IllegalArgumentException; + /** * Emits a leaf set entry node * diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java index b05b547dde..f2ff0d3ba3 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java @@ -32,6 +32,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; @@ -236,8 +237,12 @@ public class NormalizedNodeWriter implements Closeable, Flushable { writer.startMapNode(n.getIdentifier(), childSizeHint(n.getValue())); return writeChildren(n.getValue()); } + if (node instanceof OrderedLeafSetNode) { + final LeafSetNode n = (LeafSetNode) node; + writer.startOrderedLeafSet(n.getIdentifier(), childSizeHint(n.getValue())); + return writeChildren(n.getValue()); + } if (node instanceof LeafSetNode) { - //covers also OrderedLeafSetNode for which doesn't exist start* method final LeafSetNode n = (LeafSetNode) node; writer.startLeafSet(n.getIdentifier(), childSizeHint(n.getValue())); return writeChildren(n.getValue()); diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index 0a8f9877e9..aefb981f66 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -111,6 +111,12 @@ public final class JSONNormalizedNodeStreamWriter implements NormalizedNodeStrea writeValue(value, codec); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException { + tracker.startLeafSet(name); + context = new JSONStreamWriterListContext(context, name); + } + /* * Warning suppressed due to static final constant which triggers a warning * for the call to schema.isPresenceContainer(). diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/LeafListNodeDataWithSchema.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/LeafListNodeDataWithSchema.java index 8357be54a9..5033ddf275 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/LeafListNodeDataWithSchema.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/LeafListNodeDataWithSchema.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.codec.gson; import java.io.IOException; import org.opendaylight.yangtools.yang.data.api.schema.stream.SchemaAwareNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; class LeafListNodeDataWithSchema extends CompositeNodeDataWithSchema { public LeafListNodeDataWithSchema(final DataSchemaNode schema) { @@ -18,8 +19,13 @@ class LeafListNodeDataWithSchema extends CompositeNodeDataWithSchema { @Override public void write(final SchemaAwareNormalizedNodeStreamWriter writer) throws IOException { - writer.nextDataSchemaNode(getSchema()); - writer.startLeafSet(provideNodeIdentifier(), childSizeHint()); + final LeafListSchemaNode schema = (LeafListSchemaNode) getSchema(); + writer.nextDataSchemaNode(schema); + if (schema.isUserOrdered()) { + writer.startOrderedLeafSet(provideNodeIdentifier(), childSizeHint()); + } else { + writer.startLeafSet(provideNodeIdentifier(), childSizeHint()); + } super.write(writer); writer.endNode(); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index 26c53391d7..757c9e23c1 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -210,6 +210,11 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode writeElement(schema.getQName(), schema, value); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) { + tracker.startLeafSet(name); + } + @Override public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException { final SchemaNode schema = tracker.startContainerNode(name); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java index 3fd8e6d9da..a0f66a3638 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java @@ -40,6 +40,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder; @@ -170,13 +171,29 @@ public class ImmutableNormalizedNodeStreamWriter implements SchemaAwareNormalize @Override public void leafSetEntryNode(final Object value) { - Preconditions.checkArgument(getCurrent() instanceof ImmutableLeafSetNodeBuilder); - @SuppressWarnings("unchecked") - final ListNodeBuilder> builder = ((ImmutableLeafSetNodeBuilder) getCurrent()); - builder.withChildValue(value); + if (getCurrent() instanceof ImmutableOrderedLeafSetNodeBuilder) { + @SuppressWarnings("unchecked") + ListNodeBuilder> builder = ((ImmutableOrderedLeafSetNodeBuilder) getCurrent()); + builder.withChildValue(value); + } else if (getCurrent() instanceof ImmutableLeafSetNodeBuilder) { + @SuppressWarnings("unchecked") + ListNodeBuilder> builder = ((ImmutableLeafSetNodeBuilder) getCurrent()); + builder.withChildValue(value); + } else { + throw new IllegalArgumentException("LeafSetEntryNode is not valid for parent " + getCurrent()); + } + nextSchema = null; } + @Override + public void startOrderedLeafSet(final NodeIdentifier name,final int childSizeHint) { + checkDataNodeContainer(); + final ListNodeBuilder> builder = Builders.orderedLeafSetBuilder(); + builder.withNodeIdentifier(name); + enter(builder); + } + @Override public void anyxmlNode(final NodeIdentifier name, final Object value) { checkDataNodeContainer(); diff --git a/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java b/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java index acd448ef1f..ce508a48d3 100644 --- a/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java +++ b/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java @@ -108,6 +108,11 @@ public abstract class QNameTransformingStreamWriter extends ForwardingObject imp delegate().startLeafSet(transform(name), childSizeHint); } + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException, IllegalArgumentException { + delegate().startOrderedLeafSet(transform(name), childSizeHint); + } + @Override public void leafSetEntryNode(final Object value) throws IOException, IllegalArgumentException { delegate().leafSetEntryNode(value);