NETCONF-506: fix YII deserialization in FilterContentValidator 42/67742/1
authorMarek Gradzki <mgradzki@cisco.com>
Tue, 30 Jan 2018 19:27:17 +0000 (20:27 +0100)
committerMarek Gradzki <mgradzki@cisco.com>
Tue, 30 Jan 2018 20:55:25 +0000 (21:55 +0100)
Treat leafref keys in the same way as indentityref keys.
Follows https://git.opendaylight.org/gerrit/#/c/53996/

See also NETCONF-384.

Change-Id: I36a67b12e23c7da43f4e5c6002de8ae031d18e6a
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/FilterContentValidator.java
netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf506Test.java [new file with mode: 0644]
netconf/mdsal-netconf-connector/src/test/resources/filter/netconf506.xml [new file with mode: 0644]
netconf/mdsal-netconf-connector/src/test/resources/yang/filter-validator-test-mod-0.yang

index c6f5714e1f295403336ab0bac32f402b3d8ed1f5..343afa75cd4959f3113c03a80ef105a28844bea1 100644 (file)
@@ -37,7 +37,9 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -206,18 +208,18 @@ public class FilterContentValidator {
                 if (listKey instanceof IdentityrefTypeDefinition) {
                     keys.put(qualifiedName, keyValue.get());
                 } else {
-                    if (listKey.getType() instanceof IdentityrefTypeDefinition) {
+                    final TypeDefinition<? extends TypeDefinition<?>> keyType = listKey.getType();
+                    if (keyType instanceof IdentityrefTypeDefinition || keyType instanceof LeafrefTypeDefinition) {
                         final Document document = filterContent.getDomElement().getOwnerDocument();
                         final NamespaceContext nsContext = new UniversalNamespaceContextImpl(document, false);
                         final XmlCodecFactory xmlCodecFactory =
                                 XmlCodecFactory.create(schemaContext.getCurrentContext());
-                        final TypeAwareCodec<?, NamespaceContext, XMLStreamWriter> identityrefTypeCodec =
+                        final TypeAwareCodec<?, NamespaceContext, XMLStreamWriter> typeCodec =
                                 xmlCodecFactory.codecFor(listKey);
-                        final QName deserializedKey =
-                                (QName) identityrefTypeCodec.parseValue(nsContext, keyValue.get());
-                        keys.put(qualifiedName, deserializedKey);
+                        final Object deserializedKeyValue = typeCodec.parseValue(nsContext, keyValue.get());
+                        keys.put(qualifiedName, deserializedKeyValue);
                     } else {
-                        final Object deserializedKey = TypeDefinitionAwareCodec.from(listKey.getType())
+                        final Object deserializedKey = TypeDefinitionAwareCodec.from(keyType)
                                 .deserialize(keyValue.get());
                         keys.put(qualifiedName, deserializedKey);
                     }
diff --git a/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf506Test.java b/netconf/mdsal-netconf-connector/src/test/java/org/opendaylight/netconf/mdsal/connector/ops/get/Netconf506Test.java
new file mode 100644 (file)
index 0000000..f25ac1f
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2018 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.netconf.mdsal.connector.ops.get;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+import org.opendaylight.controller.config.util.xml.XmlElement;
+import org.opendaylight.controller.config.util.xml.XmlUtil;
+import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+import org.w3c.dom.Document;
+
+public class Netconf506Test {
+
+    private static final QName BASE = QName.create("urn:dummy:mod-0", "2016-03-01", "mainroot");
+
+    @Test
+    public void testValidateTypes() throws Exception {
+        final List<InputStream> sources = new ArrayList<>();
+        sources.add(getClass().getResourceAsStream("/yang/filter-validator-test-mod-0.yang"));
+        sources.add(getClass().getResourceAsStream("/yang/mdsal-netconf-mapping-test.yang"));
+        final SchemaContext context = YangParserTestUtils.parseYangStreams(sources);
+        final CurrentSchemaContext currentContext = mock(CurrentSchemaContext.class);
+        doReturn(context).when(currentContext).getCurrentContext();
+        final FilterContentValidator validator = new FilterContentValidator(currentContext);
+
+        final Document document = XmlUtil.readXmlToDocument(FilterContentValidatorTest.class
+                .getResourceAsStream("/filter/netconf506.xml"));
+
+        final XmlElement xmlElement = XmlElement.fromDomDocument(document);
+        final YangInstanceIdentifier actual = validator.validate(xmlElement);
+
+        final Map<QName, Object> inputs = new HashMap<>();
+        inputs.put(QName.create(BASE, "name"), "foo");
+
+        final YangInstanceIdentifier expected = YangInstanceIdentifier.builder()
+                .node(BASE)
+                .node(QName.create(BASE, "leafref-key-list"))
+                .nodeWithKey(QName.create(BASE, "leafref-key-list"), inputs)
+                .build();
+        assertEquals(expected, actual);
+    }
+}
diff --git a/netconf/mdsal-netconf-connector/src/test/resources/filter/netconf506.xml b/netconf/mdsal-netconf-connector/src/test/resources/filter/netconf506.xml
new file mode 100644 (file)
index 0000000..9ae2b54
--- /dev/null
@@ -0,0 +1,13 @@
+<!--
+  ~ Copyright (c) 2018 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
+  -->
+
+<mainroot xmlns="urn:dummy:mod-0">
+    <leafref-key-list>
+        <name>foo</name>
+    </leafref-key-list>
+</mainroot>
\ No newline at end of file
index 9b62160274d6c868d757b7250720407d22a70f89..f2b2082d1f839a47956618f812846a46e397a5f9 100644 (file)
@@ -107,5 +107,19 @@ module filter-validator-test-mod-0 {
                 }
             }
         }
+
+        list leafref-key-list {
+            key "name";
+            leaf name {
+                type leafref {
+                    path "../config/name";
+                }
+            }
+            container config {
+                leaf name {
+                    type string;
+                }
+            }
+        }
     }
 }
\ No newline at end of file