Bug 3874: Support of yang modeled AnyXML - JSON deserialization 42/29742/17
authorPeter Kajsa <pkajsa@cisco.com>
Mon, 16 Nov 2015 10:28:29 +0000 (11:28 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 13 Jan 2016 10:21:15 +0000 (10:21 +0000)
- added support of yang modeled anyXml deserialization from JSON
- basic unit tests

Change-Id: Idd52bfe900a52d5d1b30d2cf25449f606e339d50
Signed-off-by: Peter Kajsa <pkajsa@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/YangModeledAnyXmlNodeDataWithSchema.java [new file with mode: 0644]
yang/yang-data-codec-gson/src/test/java/org/opendaylight/yangtools/yang/data/codec/gson/retest/YangModeledAnyXmlSupportTest.java

index 23654dbb6d18a5024197781864320f128b9e8a40..4d40db27f78c2b48cf7611659e46610619156b9d 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 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.YangModeledAnyXmlSchemaNode;
 
 /**
  * A node which is composed of multiple simpler nodes.
@@ -96,6 +97,10 @@ class CompositeNodeDataWithSchema extends AbstractNodeDataWithSchema {
         if (schema instanceof LeafSchemaNode) {
             newChild = new LeafNodeDataWithSchema(schema);
         } else if (schema instanceof AnyXmlSchemaNode) {
+            // YangModeledAnyXmlSchemaNode is handled by addCompositeChild method.
+            if (schema instanceof YangModeledAnyXmlSchemaNode) {
+                return null;
+            }
             newChild = new AnyXmlNodeDataWithSchema(schema);
         } else {
             return null;
@@ -133,16 +138,20 @@ class CompositeNodeDataWithSchema extends AbstractNodeDataWithSchema {
     }
 
     AbstractNodeDataWithSchema addCompositeChild(final DataSchemaNode schema) {
-        CompositeNodeDataWithSchema newChild;
+        final CompositeNodeDataWithSchema newChild;
+
         if (schema instanceof ListSchemaNode) {
             newChild = new ListNodeDataWithSchema(schema);
         } else if (schema instanceof LeafListSchemaNode) {
             newChild = new LeafListNodeDataWithSchema(schema);
         } else if (schema instanceof ContainerSchemaNode) {
             newChild = new ContainerNodeDataWithSchema(schema);
+        } else if (schema instanceof YangModeledAnyXmlSchemaNode) {
+            newChild = new YangModeledAnyXmlNodeDataWithSchema((YangModeledAnyXmlSchemaNode)schema);
         } else {
             newChild = new CompositeNodeDataWithSchema(schema);
         }
+
         addCompositeChild(newChild);
         return newChild;
     }
index 3389853d34fcb1bc0cc934461700431a0cbf4d38..9a93146e21fb4a5886cdf954e70c2bf6559045bb 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
 
 /**
  * This class parses JSON elements from a GSON JsonReader. It disallows multiple elements of the same name unlike the
@@ -157,14 +158,19 @@ public final class JsonParserStream implements Closeable, Flushable {
             }
             while (in.hasNext()) {
                 final String jsonElementName = in.nextName();
-                final NamespaceAndName namespaceAndName = resolveNamespace(jsonElementName, parent.getSchema());
+                DataSchemaNode parentSchema = parent.getSchema();
+                if (parentSchema instanceof YangModeledAnyXmlSchemaNode) {
+                    parentSchema = ((YangModeledAnyXmlSchemaNode) parentSchema).getSchemaOfAnyXmlData();
+                }
+                final NamespaceAndName namespaceAndName = resolveNamespace(jsonElementName, parentSchema);
                 final String localName = namespaceAndName.getName();
                 addNamespace(namespaceAndName.getUri());
                 if (namesakes.contains(jsonElementName)) {
                     throw new JsonSyntaxException("Duplicate name " + jsonElementName + " in JSON input.");
                 }
                 namesakes.add(jsonElementName);
-                final Deque<DataSchemaNode> childDataSchemaNodes = findSchemaNodeByNameAndNamespace(parent.getSchema(),
+
+                final Deque<DataSchemaNode> childDataSchemaNodes = findSchemaNodeByNameAndNamespace(parentSchema,
                         localName, getCurrentNamespace());
                 if (childDataSchemaNodes.isEmpty()) {
                     throw new IllegalStateException("Schema for node with name " + localName + " and namespace "
diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/YangModeledAnyXmlNodeDataWithSchema.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/YangModeledAnyXmlNodeDataWithSchema.java
new file mode 100644 (file)
index 0000000..d89bcef
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2015 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.io.IOException;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.SchemaAwareNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
+
+final class YangModeledAnyXmlNodeDataWithSchema extends CompositeNodeDataWithSchema {
+
+    public YangModeledAnyXmlNodeDataWithSchema(final YangModeledAnyXmlSchemaNode yangModeledAnyXml) {
+        super(yangModeledAnyXml);
+    }
+
+    @Override
+    public void write(final SchemaAwareNormalizedNodeStreamWriter writer) throws IOException {
+        writer.nextDataSchemaNode(getSchema());
+        writer.startYangModeledAnyXmlNode(provideNodeIdentifier(), childSizeHint());
+        super.write(writer);
+        writer.endNode();
+    }
+
+}
index 0b368916cf92621965c7a7f5b4c5a620cf1f0c35..a9baac8decb81fe93491e7cb29d06004c1e479a4 100644 (file)
@@ -9,14 +9,17 @@ package org.opendaylight.yangtools.yang.data.codec.gson.retest;
 
 import static org.junit.Assert.assertEquals;
 import static org.opendaylight.yangtools.yang.data.codec.gson.retest.TestUtils.loadModules;
+import static org.opendaylight.yangtools.yang.data.codec.gson.retest.TestUtils.loadTextFile;
 
 import com.google.common.base.Preconditions;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;
+import com.google.gson.stream.JsonReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
 import java.net.URISyntaxException;
@@ -35,7 +38,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser.DomToNormalizedNodeParserFactory;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -73,6 +79,18 @@ public class YangModeledAnyXmlSupportTest {
                 .parse(Collections.singletonList(xmlDoc.getDocumentElement()), schemaContext);
     }
 
+    @Test
+    public void jsonToNormalizedNodesTest() throws IOException, URISyntaxException, SAXException {
+        final String inputJson = loadTextFile("/yang-modeled-anyxml/json/baz.json");
+        final NormalizedNodeResult result = new NormalizedNodeResult();
+        final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, schemaContext);
+        jsonParser.parse(new JsonReader(new StringReader(inputJson)));
+        final NormalizedNode<?, ?> transformedInput = result.getResult();
+
+        assertEquals(data.getValue().iterator().next(), transformedInput);
+    }
+
     @Test
     public void normalizedNodesToJsonTest() throws IOException, URISyntaxException, SAXException {
         final DataContainerChild<? extends PathArgument, ?> baz = data.getValue().iterator().next();
@@ -122,4 +140,4 @@ public class YangModeledAnyXmlSupportTest {
         return doc;
     }
 
-}
+}
\ No newline at end of file