Bug 2062 - StreamWriter APIs loses information about leaf-set ordering 58/32258/4
authorJan Hajnar <jhajnar@cisco.com>
Fri, 7 Aug 2015 12:20:01 +0000 (14:20 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 12 Jan 2016 11:57:35 +0000 (11:57 +0000)
* added start methods for OrderedLeafSet
* modified classes that use NormalizedNodeStreamWriter to use
startOrderedLeafSet when needed.

Change-Id: I890a338313229b1600adcf5ac2ef1c8b440a220d
Signed-off-by: Jan Hajnar <jhajnar@cisco.com>
Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/LeafListNodeDataWithSchema.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java
yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java

index 805aafb47785d1615355414fd68d3d0270e210d2..60e8abfbe3fd7c324a951f6283eb3a51bec4d72a 100644 (file)
@@ -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);
index 19536df9c20213ba84d29c6f9b29bd293a7968a7..121a654a5eadc9ff1926297e34a03276dd648735 100644 (file)
@@ -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);
index 983378703e57f72694db34748f7011b008484fd6..98725c9aa932d2c443c8c2735d169ef86a78de8b 100644 (file)
@@ -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).
+     * <p>
+     * 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 <code>map</code>,
+     *             <code>choice</code> <code>unkeyed list</code> node.
+     * @throws IOException if an underlying IO error occurs
+     */
+    void startOrderedLeafSet(NodeIdentifier name, int childSizeHint) throws IOException, IllegalArgumentException;
+
     /**
      * Emits a leaf set entry node
      *
index b05b547dde49cc97084c777eef8dda8634885657..f2ff0d3ba34421fe1f7069fe490dc6515a3daa03 100644 (file)
@@ -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());
index 0a8f9877e992d0f700cd62c68bd102a063595a94..aefb981f66affb0e79580e7e0d08d068c9dbe767 100644 (file)
@@ -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().
index 8357be54a910fc4ef4ec91de39dd1682be3d14ec..5033ddf2751fe707a7e5580c380761da9c788bd1 100644 (file)
@@ -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();
     }
index 26c53391d7882da4f37b3ef8345a8a50207dd385..757c9e23c15d1eedd9ed3d7893e49906cc9af898 100644 (file)
@@ -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);
index 3fd8e6d9daa4375eab006ad65a039e7d15cdb43c..a0f66a36386bf9bd9c10a668e4f345411f0f0656 100644 (file)
@@ -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<Object, LeafSetEntryNode<Object>> builder = ((ImmutableLeafSetNodeBuilder<Object>) getCurrent());
-        builder.withChildValue(value);
+        if (getCurrent() instanceof ImmutableOrderedLeafSetNodeBuilder) {
+            @SuppressWarnings("unchecked")
+            ListNodeBuilder<Object, LeafSetEntryNode<Object>> builder = ((ImmutableOrderedLeafSetNodeBuilder<Object>) getCurrent());
+            builder.withChildValue(value);
+        } else if (getCurrent() instanceof ImmutableLeafSetNodeBuilder) {
+            @SuppressWarnings("unchecked")
+            ListNodeBuilder<Object, LeafSetEntryNode<Object>> builder = ((ImmutableLeafSetNodeBuilder<Object>) 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<Object, LeafSetEntryNode<Object>> builder = Builders.orderedLeafSetBuilder();
+        builder.withNodeIdentifier(name);
+        enter(builder);
+    }
+
     @Override
     public void anyxmlNode(final NodeIdentifier name, final Object value) {
         checkDataNodeContainer();
index acd448ef1f14b1971297459f62a90b5d03a71e80..ce508a48d35679e87cfd085df9711308196b27e8 100644 (file)
@@ -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);