Bug 2279 - top level element should be entry and not list 78/12378/1
authorJozef Gloncak <jgloncak@cisco.com>
Thu, 30 Oct 2014 09:04:32 +0000 (10:04 +0100)
committerJozef Gloncak <jgloncak@cisco.com>
Thu, 30 Oct 2014 09:42:47 +0000 (10:42 +0100)
JSON input which contains at top level list entry data is now converted
to normalized node structure with top level element of entry type.

Previous status: top level element element was returned as list which
contained list entries.

Change-Id: Ie632f02819aab5a4dc2512b818c729d1074d98dc
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CompositeNodeDataWithSchema.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/ListNodeDataWithSchema.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/TopLevelNodeDataWithSchema.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java

index ee2541d8e651888fd4062db56828e0046b3a8168..2adcbd302e3557ce79f786945f17e63914feb83c 100644 (file)
@@ -48,12 +48,12 @@ class CompositeNodeDataWithSchema extends AbstractNodeDataWithSchema {
     /**
      * nodes which were added to schema via augmentation and are present in data input
      */
-    private final Multimap<AugmentationSchema, AbstractNodeDataWithSchema> augmentationsToChild = ArrayListMultimap.create();
+    protected final Multimap<AugmentationSchema, AbstractNodeDataWithSchema> augmentationsToChild = ArrayListMultimap.create();
 
     /**
      * remaining data nodes (which aren't added via augment). Every of one them should have the same QName.
      */
-    private final List<AbstractNodeDataWithSchema> children = new ArrayList<>();
+    protected final List<AbstractNodeDataWithSchema> children = new ArrayList<>();
 
     public CompositeNodeDataWithSchema(final DataSchemaNode schema) {
         super(schema);
index 1721f428d5c276edd109dd1cec93b29bb6d2ae15..93946567dcb9080e98d131c9922afc3acdd220a5 100644 (file)
@@ -80,10 +80,10 @@ public final class JsonParserStream implements Closeable, Flushable {
         try {
             reader.peek();
             isEmpty = false;
-            CompositeNodeDataWithSchema compositeNodeDataWithSchema = new CompositeNodeDataWithSchema(parentNode);
-            read(reader, compositeNodeDataWithSchema);
-            compositeNodeDataWithSchema.write(writer);
-
+            TopLevelNodeDataWithSchema topLevelNodeDataWithSchema = new TopLevelNodeDataWithSchema(parentNode);
+            read(reader, topLevelNodeDataWithSchema);
+            topLevelNodeDataWithSchema.normalizeTopLevelNode();
+            topLevelNodeDataWithSchema.write(writer);
             return this;
             // return read(reader);
         } catch (EOFException e) {
index d21cd9a77a01000a9e48cb3b941899e68dc7d06f..8f3cab3288fbdccd4a527362f7dd034213c33667 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.yangtools.yang.data.codec.gson;
 
 import java.io.IOException;
-
+import java.util.List;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
@@ -19,6 +19,10 @@ class ListNodeDataWithSchema extends CompositeNodeDataWithSchema {
         super(schema);
     }
 
+    List<AbstractNodeDataWithSchema> getListEntry() {
+        return children;
+    }
+
     @Override
     public void write(final NormalizedNodeStreamWriter writer) throws IOException {
         if (((ListSchemaNode) getSchema()).getKeyDefinition().isEmpty()) {
diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/TopLevelNodeDataWithSchema.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/TopLevelNodeDataWithSchema.java
new file mode 100644 (file)
index 0000000..7ed1477
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.codec.gson;
+
+import java.util.List;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+
+/**
+ * A node which holds top level element.
+ */
+class TopLevelNodeDataWithSchema extends CompositeNodeDataWithSchema {
+
+    public TopLevelNodeDataWithSchema(DataSchemaNode schema) {
+        super(schema);
+    }
+
+    /**
+     * If direct child is of type ListNodeDataWithSchema its direct child - ListEntryNodeDataWitchSchema - is returned.
+     *
+     * ListEntry node should be returned insteand List at top level.
+     */
+    void normalizeTopLevelNode() {
+        if (children.size() == 1 && children.get(0) instanceof ListNodeDataWithSchema) {
+            List<AbstractNodeDataWithSchema> listEntry = ((ListNodeDataWithSchema) children.get(0)).getListEntry();
+            if (listEntry.size() == 1) {
+                children.remove(0);
+                children.add(listEntry.get(0));
+            } else {
+                throw new IllegalStateException("Top level \"list\" element should contain only one list entry.");
+            }
+        }
+    }
+
+}
index fe3d1841a2bd8b67041aa66b7cddaa40120cb4e9..4033ffcdb393a8b0798ec033c2348d339221fc32 100644 (file)
@@ -163,7 +163,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
 
     @Override
     public void startUnkeyedListItem(final NodeIdentifier name,final int childSizeHint) throws IllegalStateException {
-        Preconditions.checkArgument(getCurrent() instanceof ImmutableUnkeyedListNodeBuilder);
+        Preconditions.checkArgument(getCurrent() instanceof ImmutableUnkeyedListNodeBuilder || getCurrent() instanceof NormalizedNodeResultBuilder);
         enter(Builders.unkeyedListEntryBuilder().withNodeIdentifier(name));
     }