From 9d217801ee72b49cfd68d9499bb57359d1e14d0e Mon Sep 17 00:00:00 2001 From: Mario Abraham Date: Wed, 21 Aug 2019 15:23:52 +0200 Subject: [PATCH] Teach AbstractGet how to transform MapNodes Added case for MapNode interface in transformNormalizedNode() method Issue-ID: NETCONF-538 Signed-off-by: Mario Abraham Change-Id: I9fa1d7f364d3d68d715aab73473096795da4ed6b (cherry picked from commit ca7514e21fca4d18104d5a09d547d540a32d2e2e) --- .../mdsal/connector/ops/get/AbstractGet.java | 30 ++++++- .../connector/ops/get/Netconf538Test.java | 78 +++++++++++++++++++ .../src/test/resources/filter/netconf538.xml | 3 + .../src/test/resources/yang/simple-list.yang | 16 ++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf538Test.java create mode 100644 netconf/mdsal-netconf-connector/src/test/resources/filter/netconf538.xml create mode 100644 netconf/mdsal-netconf-connector/src/test/resources/yang/simple-list.yang diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java index 8eaef55451..f02bc08adf 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java @@ -28,6 +28,8 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +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.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; @@ -60,6 +62,7 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { protected Node transformNormalizedNode(final Document document, final NormalizedNode data, final YangInstanceIdentifier dataRoot) { + final DOMResult result = new DOMResult(document.createElement(XmlNetconfConstants.DATA_KEY)); final XMLStreamWriter xmlWriter = getXmlStreamWriter(result); @@ -69,7 +72,15 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { final NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(nnStreamWriter, true); - writeRootElement(xmlWriter, nnWriter, (ContainerNode) data); + if (data instanceof ContainerNode) { + writeRootElement(xmlWriter, nnWriter, (ContainerNode) data); + } else if (data instanceof MapNode) { + writeRootElement(xmlWriter, nnWriter, (MapNode) data); + } else { + throw new IllegalArgumentException("Unable to transform node of type: " + data.getClass().toString() + + " offending node: " + data.toString()); + } + return result.getNode(); } @@ -103,6 +114,23 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { } } + private static void writeRootElement(final XMLStreamWriter xmlWriter, final NormalizedNodeWriter nnWriter, + final MapNode data) { + try { + if (data.getNodeType().equals(SchemaContext.NAME)) { + for (final MapEntryNode child : data.getValue()) { + nnWriter.write(child); + } + } else { + nnWriter.write(data); + } + nnWriter.flush(); + xmlWriter.flush(); + } catch (XMLStreamException | IOException e) { + throw new RuntimeException(e); + } + } + protected Element serializeNodeWithParentStructure(final Document document, final YangInstanceIdentifier dataRoot, final NormalizedNode node) { if (!dataRoot.equals(ROOT)) { diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf538Test.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf538Test.java new file mode 100644 index 0000000000..3b8babb3a2 --- /dev/null +++ b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf538Test.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2019 PANTHEON.tech s.r.o. 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.netconf.mdsal.connector.ops.get; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mock; +import org.opendaylight.netconf.api.xml.XmlUtil; +import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; +import org.opendaylight.netconf.mdsal.connector.TransactionProvider; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +public class Netconf538Test { + + private static final String SESSION_ID_FOR_REPORTING = "netconf-test-session1"; + private static final QName BASE = QName.create("urn:dummy:list", "2019-08-21", "user"); + private static final QName NAME_QNAME = QName.create(BASE, "name"); + private static final String LEAF_VALUE = "testName"; + + @Mock + private TransactionProvider transactionProvider; + + @Test + public void transformNormalizedNodeTest_mapNodeTest() throws Exception { + + final SchemaContext context = YangParserTestUtils.parseYangResources(Netconf538Test.class, + "/yang/simple-list.yang"); + final CurrentSchemaContext currentContext = mock(CurrentSchemaContext.class); + doReturn(context).when(currentContext).getCurrentContext(); + + final GetConfig getConfig = new GetConfig(SESSION_ID_FOR_REPORTING, currentContext, transactionProvider); + + final Document document = XmlUtil.readXmlToDocument(FilterContentValidatorTest.class + .getResourceAsStream("/filter/netconf538.xml")); + + LeafNode leafNode = Builders.leafBuilder() + .withNodeIdentifier(YangInstanceIdentifier.NodeIdentifier.create(NAME_QNAME)) + .withValue(LEAF_VALUE).build(); + + MapEntryNode mapEntryNode = Builders.mapEntryBuilder() + .withNodeIdentifier(new YangInstanceIdentifier + .NodeIdentifierWithPredicates(BASE, NAME_QNAME, LEAF_VALUE)) + .withChild(leafNode).build(); + + MapNode data = Builders.mapBuilder().withNodeIdentifier(YangInstanceIdentifier.NodeIdentifier.create(BASE)) + .withChild(mapEntryNode).build(); + + + final YangInstanceIdentifier path = YangInstanceIdentifier.builder().build(); + + final Node node = getConfig.transformNormalizedNode(document, data, path); + + Assert.assertNotNull(node); + Node nodeUser = node.getFirstChild(); + Assert.assertEquals(data.getIdentifier().getNodeType().getLocalName(), nodeUser.getLocalName()); + Node nodeName = nodeUser.getFirstChild(); + Assert.assertEquals(leafNode.getIdentifier().getNodeType().getLocalName(), nodeName.getLocalName()); + Assert.assertEquals(leafNode.getValue(), nodeName.getFirstChild().getNodeValue()); + } + +} diff --git a/netconf/mdsal-netconf-connector/src/test/resources/filter/netconf538.xml b/netconf/mdsal-netconf-connector/src/test/resources/filter/netconf538.xml new file mode 100644 index 0000000000..004bdc097d --- /dev/null +++ b/netconf/mdsal-netconf-connector/src/test/resources/filter/netconf538.xml @@ -0,0 +1,3 @@ + + testName + diff --git a/netconf/mdsal-netconf-connector/src/test/resources/yang/simple-list.yang b/netconf/mdsal-netconf-connector/src/test/resources/yang/simple-list.yang new file mode 100644 index 0000000000..05d2a599e2 --- /dev/null +++ b/netconf/mdsal-netconf-connector/src/test/resources/yang/simple-list.yang @@ -0,0 +1,16 @@ +module simple-list { + namespace "urn:dummy:list"; + prefix "list-0"; + revision "2019-08-21"; + + list user { + key "name"; + config true; + description "This is a list of users in the system."; + + leaf name { + type string; + } + } + +} \ No newline at end of file -- 2.36.6