leaf-ref fails.
* added referenced type resolution for leafrefs in ControllerContext
Change-Id: Ic38b77038feb786a46a8bdd069448f006418d7bf
Signed-off-by: Jan Hajnar <jhajnar@cisco.com>
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;
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.";
--- /dev/null
+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());
+ }
+}
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 {
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
+}
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
+}