Bug 3595 - RESTCONF: GET operation on a node in a list, identified by 12/22112/2
authorJan Hajnar <jhajnar@cisco.com>
Mon, 8 Jun 2015 15:28:12 +0000 (17:28 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 10 Jun 2015 11:33:07 +0000 (11:33 +0000)
leaf-ref fails.

* added referenced type resolution for leafrefs in ControllerContext

Change-Id: Ic38b77038feb786a46a8bdd069448f006418d7bf
Signed-off-by: Jan Hajnar <jhajnar@cisco.com>
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/ControllerContext.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/Bug3595Test.java [new file with mode: 0644]
opendaylight/md-sal/sal-rest-connector/src/test/resources/leafref/yang/leafref-module.yang
opendaylight/md-sal/sal-rest-connector/src/test/resources/leafref/yang/referenced-module.yang

index ad2409bfcf13be60407f853cdce454abf49c1d09..b33d79e1d0a20cf094800c4a5fb06a63103394e1 100644 (file)
@@ -63,6 +63,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
 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.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -754,17 +756,19 @@ public class ControllerContext implements SchemaContextListener {
 
     private void addKeyValue(final HashMap<QName, Object> map, final DataSchemaNode node, final String uriValue,
             final DOMMountPoint mountPoint) {
-        Preconditions.<String> checkNotNull(uriValue);
+        Preconditions.checkNotNull(uriValue);
         Preconditions.checkArgument((node instanceof LeafSchemaNode));
 
         final String urlDecoded = urlPathArgDecode(uriValue);
-        final TypeDefinition<? extends Object> typedef = ((LeafSchemaNode) node).getType();
-        final Codec<Object, Object> codec = RestCodec.from(typedef, mountPoint);
-
-        Object decoded = codec == null ? null : codec.deserialize(urlDecoded);
+        TypeDefinition<?> typedef = ((LeafSchemaNode) node).getType();
+        final TypeDefinition<?> baseType = RestUtil.resolveBaseTypeFrom(typedef);
+        if (baseType instanceof LeafrefTypeDefinition) {
+            typedef = SchemaContextUtil.getBaseTypeForLeafRef((LeafrefTypeDefinition) baseType, globalSchema, node);
+        }
+        Codec<Object, Object> codec = RestCodec.from(typedef, mountPoint);
+        Object decoded = codec.deserialize(urlDecoded);
         String additionalInfo = "";
         if (decoded == null) {
-            final TypeDefinition<? extends Object> baseType = RestUtil.resolveBaseTypeFrom(typedef);
             if ((baseType instanceof IdentityrefTypeDefinition)) {
                 decoded = toQName(urlDecoded);
                 additionalInfo = "For key which is of type identityref it should be in format module_name:identity_name.";
diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/Bug3595Test.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/Bug3595Test.java
new file mode 100644 (file)
index 0000000..cb15aad
--- /dev/null
@@ -0,0 +1,45 @@
+package org.opendaylight.controller.sal.restconf.impl.test;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+import java.io.FileNotFoundException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.opendaylight.controller.sal.restconf.impl.ControllerContext;
+import org.opendaylight.controller.sal.restconf.impl.InstanceIdentifierContext;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+public class Bug3595Test {
+
+    private static final QName CONT_QNAME = QName.create("leafref:module", "2014-04-17", "cont");
+    private static final QName LST_WITH_LFREF_KEY_QNAME = QName.create(CONT_QNAME, "lst-with-lfref-key");
+    private static final QName LFREF_KEY_QNAME = QName.create(CONT_QNAME, "lfref-key");
+
+
+    private static ControllerContext controllerContext = ControllerContext.getInstance();
+
+    @BeforeClass
+    public static void initialize() throws FileNotFoundException {
+        SchemaContext schemaContext = TestUtils.loadSchemaContext("/leafref/yang");
+        Module module = TestUtils.findModule(schemaContext.getModules(), "leafref-module");
+        assertNotNull(module);
+        module = TestUtils.findModule(schemaContext.getModules(), "referenced-module");
+        assertNotNull(module);
+
+        controllerContext.setGlobalSchema(schemaContext);
+    }
+
+    @Test
+    public void testLeafrefListKeyDeserializtion() {
+        final YangInstanceIdentifier node1IIexpected = YangInstanceIdentifier.of(CONT_QNAME)
+                .node(LST_WITH_LFREF_KEY_QNAME).node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
+                        LST_WITH_LFREF_KEY_QNAME, LFREF_KEY_QNAME, "node1"));
+        final InstanceIdentifierContext<?> iiContext =
+                controllerContext.toInstanceIdentifier("leafref-module:cont/lst-with-lfref-key/node1");
+        iiContext.getInstanceIdentifier();
+        assertEquals(node1IIexpected, iiContext.getInstanceIdentifier());
+    }
+}
index 00df290691d44266ce31ccd32607df557a1d2f02..9675b79ac92502cf792aa8b5bd4caf53cf7e2ba0 100644 (file)
@@ -1,15 +1,15 @@
 module leafref-module {
-  namespace "leafref:module";  
+  namespace "leafref:module";
 
 
   prefix "lfrfmodule";
 
-  import referenced-module { prefix refmod; revision-date 2014-04-17;} 
+  import referenced-module { prefix refmod; revision-date 2014-04-17;}
 
-  
-  revision 2014-04-17 {    
+
+  revision 2014-04-17 {
   }
-  
+
 
     container cont {
         leaf lf1 {
@@ -39,6 +39,16 @@ module leafref-module {
                 path "../lf1";
             }
         }
-        
+
+        list lst-with-lfref-key {
+            key "lfref-key";
+
+            leaf lfref-key {
+                type leafref {
+                    path "/refmod:cont/refmod:id-ref";
+                }
+            }
+        }
+
     }
-}
\ No newline at end of file
+}
index b6de719e4d4744385333d6da51e627693625d57d..05dd123eebbcba9bd216e47680d0beaf497bc0bf 100644 (file)
@@ -1,13 +1,23 @@
 module referenced-module {
-  namespace "referenced:module";  
+  namespace "referenced:module";
 
   prefix "refmodule";
-  revision 2014-04-17 {    
+  revision 2014-04-17 {
   }
 
     container cont {
         leaf lf1 {
             type instance-identifier;
         }
+
+        leaf id-ref {
+            type leafref {
+                path "../../id";
+            }
+        }
+    }
+
+    leaf id {
+        type string;
     }
-}
\ No newline at end of file
+}