From b52c1ffb0df2b84665b4d222166a3e4cdb8427bb Mon Sep 17 00:00:00 2001 From: Peter Kajsa Date: Mon, 16 Nov 2015 11:28:29 +0100 Subject: [PATCH] Bug 3874: Support of yang modeled AnyXML - JSON deserialization - added support of yang modeled anyXml deserialization from JSON - basic unit tests Change-Id: Idd52bfe900a52d5d1b30d2cf25449f606e339d50 Signed-off-by: Peter Kajsa --- .../gson/CompositeNodeDataWithSchema.java | 11 +++++++- .../data/codec/gson/JsonParserStream.java | 10 +++++-- .../YangModeledAnyXmlNodeDataWithSchema.java | 28 +++++++++++++++++++ .../retest/YangModeledAnyXmlSupportTest.java | 20 ++++++++++++- 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/YangModeledAnyXmlNodeDataWithSchema.java diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CompositeNodeDataWithSchema.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CompositeNodeDataWithSchema.java index 23654dbb6d..4d40db27f7 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CompositeNodeDataWithSchema.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CompositeNodeDataWithSchema.java @@ -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; } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java index 3389853d34..9a93146e21 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java @@ -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 childDataSchemaNodes = findSchemaNodeByNameAndNamespace(parent.getSchema(), + + final Deque 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 index 0000000000..d89bcefbc6 --- /dev/null +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/YangModeledAnyXmlNodeDataWithSchema.java @@ -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(); + } + +} diff --git a/yang/yang-data-codec-gson/src/test/java/org/opendaylight/yangtools/yang/data/codec/gson/retest/YangModeledAnyXmlSupportTest.java b/yang/yang-data-codec-gson/src/test/java/org/opendaylight/yangtools/yang/data/codec/gson/retest/YangModeledAnyXmlSupportTest.java index 0b368916cf..a9baac8dec 100644 --- a/yang/yang-data-codec-gson/src/test/java/org/opendaylight/yangtools/yang/data/codec/gson/retest/YangModeledAnyXmlSupportTest.java +++ b/yang/yang-data-codec-gson/src/test/java/org/opendaylight/yangtools/yang/data/codec/gson/retest/YangModeledAnyXmlSupportTest.java @@ -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 baz = data.getValue().iterator().next(); @@ -122,4 +140,4 @@ public class YangModeledAnyXmlSupportTest { return doc; } -} +} \ No newline at end of file -- 2.36.6