X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frestconf%2Fimpl%2FControllerContext.xtend;h=602e8b92425ea9d1ab26bd784893f7ff3a3a9ba1;hp=882c73d001071dea11ee8bfb1d253887780a0875;hb=fe1c9b6c6080f1d23ffaea6c03252f3c0c26184f;hpb=be484ee2a2b49e55a2b394851f313f00a6ae1362 diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/ControllerContext.xtend b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/ControllerContext.xtend index 882c73d001..602e8b9242 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/ControllerContext.xtend +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/ControllerContext.xtend @@ -27,8 +27,12 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode import org.opendaylight.yangtools.yang.model.api.ListSchemaNode 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.type.LeafrefTypeDefinition +import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil import static com.google.common.base.Preconditions.* +import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec class ControllerContext implements SchemaServiceListener { @@ -36,13 +40,11 @@ class ControllerContext implements SchemaServiceListener { val static NULL_VALUE = "null" - @Property - SchemaContext schemas; + var SchemaContext schemas; private val BiMap uriToModuleName = HashBiMap.create(); private val Map moduleNameToUri = uriToModuleName.inverse(); - private val Map qnameToRpc = new ConcurrentHashMap(); - + private val Map qnameToRpc = new ConcurrentHashMap(); private new() { if (INSTANCE !== null) { @@ -53,13 +55,17 @@ class ControllerContext implements SchemaServiceListener { static def getInstance() { return INSTANCE } - + private def void checkPreconditions() { if (schemas === null) { throw new ResponseException(Response.Status.SERVICE_UNAVAILABLE, RestconfProvider::NOT_INITALIZED_MSG) } } + def setSchemas(SchemaContext schemas) { + onGlobalContextUpdated(schemas) + } + public def InstanceIdWithSchemaNode toInstanceIdentifier(String restconfInstance) { val ret = InstanceIdentifier.builder(); val pathArgs = restconfInstance.split("/"); @@ -73,7 +79,7 @@ class ControllerContext implements SchemaServiceListener { if (schemaNode === null) { return null } - new InstanceIdWithSchemaNode(ret.toInstance, schemaNode) + return new InstanceIdWithSchemaNode(ret.toInstance, schemaNode) } private def findModule(String restconfInstance) { @@ -85,13 +91,13 @@ class ControllerContext implements SchemaServiceListener { } val modulWithFirstYangStatement = pathArgs.filter[s|s.contains(":")].head val startModule = modulWithFirstYangStatement.toModuleName(); - schemas.getLatestModule(startModule) + return getLatestModule(startModule) } - private def getLatestModule(SchemaContext schema, String moduleName) { - checkNotNull(schema) + private def getLatestModule(String moduleName) { + checkPreconditions checkArgument(moduleName !== null && !moduleName.empty) - val modules = schema.modules.filter[m|m.name == moduleName] + val modules = schemas.modules.filter[m|m.name == moduleName] var latestModule = modules.head for (module : modules) { if (module.revision.after(latestModule.revision)) { @@ -128,7 +134,7 @@ class ControllerContext implements SchemaServiceListener { private def dispatch CharSequence toRestconfIdentifier(PathArgument argument, DataSchemaNode node) { throw new IllegalArgumentException("Conversion of generic path argument is not supported"); } - + def findModuleByNamespace(URI namespace) { checkPreconditions var module = uriToModuleName.get(namespace) @@ -283,9 +289,10 @@ class ControllerContext implements SchemaServiceListener { private def void addKeyValue(HashMap map, DataSchemaNode node, String uriValue) { checkNotNull(uriValue); checkArgument(node instanceof LeafSchemaNode); - val decoded = URLDecoder.decode(uriValue); + val urlDecoded = URLDecoder.decode(uriValue); + val typedef = (node as LeafSchemaNode).type; + val decoded = TypeDefinitionAwareCodec.from(typedef)?.deserialize(urlDecoded) map.put(node.QName, decoded); - } private def String toModuleName(String str) { @@ -309,27 +316,54 @@ class ControllerContext implements SchemaServiceListener { } } - public def QName toQName(String name) { + private def QName toQName(String name) { val module = name.toModuleName; val node = name.toNodeName; val namespace = moduleNameToUri.get(module); - return new QName(namespace,null,node); + return new QName(namespace, null, node); + } + + def getRpcDefinition(String name) { + return qnameToRpc.get(name.toQName) } override onGlobalContextUpdated(SchemaContext context) { this.schemas = context; - for(operation : context.operations) { - val qname = new QName(operation.QName.namespace,null,operation.QName.localName); - qnameToRpc.put(qname,operation); + for (operation : context.operations) { + val qname = new QName(operation.QName.namespace, null, operation.QName.localName); + qnameToRpc.put(qname, operation); } } - - def ContainerSchemaNode getRpcOutputSchema(QName name) { - qnameToRpc.get(name)?.output; - } - - def ContainerSchemaNode getRpcInputSchema(QName name) { - qnameToRpc.get(name)?.input; - } + /** + * Resolve target type from leafref type. + * + * According to RFC 6020 referenced element has to be leaf (chapter 9.9). + * Therefore if other element is referenced then null value is returned. + * + * Currently only cases without path-predicate are supported. + * + * @param leafRef + * @param schemaNode + * data schema node which contains reference + * @return type if leaf is referenced and it is possible to find referenced + * node in schema context. In other cases null value is returned + */ + def LeafSchemaNode resolveTypeFromLeafref(LeafrefTypeDefinition leafRef, DataSchemaNode schemaNode) { + val xPath = leafRef.getPathStatement(); + val module = SchemaContextUtil.findParentModule(schemas, schemaNode); + + var SchemaNode foundSchemaNode + if (xPath.isAbsolute()) { + foundSchemaNode = SchemaContextUtil.findDataSchemaNode(schemas, module, xPath); + } else { + foundSchemaNode = SchemaContextUtil.findDataSchemaNodeForRelativeXPath(schemas, module, schemaNode, xPath); + } + + if (foundSchemaNode instanceof LeafSchemaNode) { + return foundSchemaNode as LeafSchemaNode; + } + + return null; + } }