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=eec2d452a178c15da2f0c70befa8c1367aae31eb;hp=930aa663bb4cc91b013d42dec40b5775921e95c2;hb=9212fed678702583f4a555641208cf1c7b45b829;hpb=9f9188b4b31a8962b83527d03bec8a4c75e733ed 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 930aa663bb..eec2d452a1 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 @@ -1,6 +1,7 @@ package org.opendaylight.controller.sal.restconf.impl import com.google.common.collect.BiMap +import com.google.common.collect.FluentIterable import com.google.common.collect.HashBiMap import java.net.URI import java.net.URLDecoder @@ -11,6 +12,7 @@ import java.util.Map import java.util.concurrent.ConcurrentHashMap import javax.ws.rs.core.Response import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener +import org.opendaylight.controller.sal.rest.impl.RestUtil import org.opendaylight.controller.sal.rest.impl.RestconfProvider import org.opendaylight.yangtools.yang.common.QName import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier @@ -18,6 +20,7 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.InstanceIdent import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument +import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode import org.opendaylight.yangtools.yang.model.api.ChoiceNode import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode @@ -27,15 +30,10 @@ 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 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition import org.slf4j.LoggerFactory -import com.google.common.collect.FluentIterable + +import static com.google.common.base.Preconditions.* class ControllerContext implements SchemaServiceListener { val static LOG = LoggerFactory.getLogger(ControllerContext) @@ -96,7 +94,7 @@ class ControllerContext implements SchemaServiceListener { return getLatestModule(startModule) } - private def getLatestModule(String moduleName) { + def getLatestModule(String moduleName) { checkPreconditions checkArgument(moduleName !== null && !moduleName.empty) val modules = schemas.modules.filter[m|m.name == moduleName] @@ -142,20 +140,37 @@ class ControllerContext implements SchemaServiceListener { var module = uriToModuleName.get(namespace) if (module === null) { val moduleSchemas = schemas.findModuleByNamespace(namespace); - if(moduleSchemas === null) throw new IllegalArgumentException() + if(moduleSchemas === null) return null var latestModule = moduleSchemas.head for (m : moduleSchemas) { if (m.revision.after(latestModule.revision)) { latestModule = m } } - if(latestModule === null) throw new IllegalArgumentException() + if(latestModule === null) return null uriToModuleName.put(namespace, latestModule.name) module = latestModule.name; } return module } + def findNamespaceByModule(String module) { + var namespace = moduleNameToUri.get(module) + if (namespace === null) { + val moduleSchemas = schemas.modules.filter[it|it.name.equals(module)] + var latestModule = moduleSchemas.head + for (m : moduleSchemas) { + if (m.revision.after(latestModule.revision)) { + latestModule = m + } + } + if(latestModule === null) return null + namespace = latestModule.namespace + uriToModuleName.put(namespace, latestModule.name) + } + return namespace + } + def CharSequence toRestconfIdentifier(QName qname) { checkPreconditions var module = uriToModuleName.get(qname.namespace) @@ -295,11 +310,8 @@ class ControllerContext implements SchemaServiceListener { val typedef = (node as LeafSchemaNode).type; var decoded = TypeDefinitionAwareCodec.from(typedef)?.deserialize(urlDecoded) - if(decoded == null) { - var baseType = typedef - while (baseType.baseType != null) { - baseType = baseType.baseType; - } + if(decoded === null) { + var baseType = RestUtil.resolveBaseTypeFrom(typedef) if(baseType instanceof IdentityrefTypeDefinition) { decoded = toQName(urlDecoded) } @@ -349,35 +361,4 @@ class ControllerContext implements SchemaServiceListener { } } - /** - * 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; - } }