X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Frestconf%2Futils%2Fparser%2FParserIdentifier.java;h=0ed61c60b602b8b130264f8bfc8bffca63e778d6;hb=c639ecdb0e281f21ac6448f8542abf6e5f902bb5;hp=d24c3deb07336c99016c453b3810d1cf44f556d9;hpb=1582427eb81ac3250f2db5c041838d11432b45a0;p=netconf.git diff --git a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java index d24c3deb07..0ed61c60b6 100644 --- a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java +++ b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java @@ -7,14 +7,10 @@ */ package org.opendaylight.restconf.utils.parser; -import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import java.text.ParseException; import java.util.Date; import java.util.Iterator; import java.util.List; -import javax.annotation.Nullable; import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; import org.opendaylight.netconf.md.sal.rest.schema.SchemaExportContext; @@ -30,10 +26,15 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; import org.opendaylight.yangtools.yang.model.api.Module; +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.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * Util class for parsing identifier @@ -48,25 +49,83 @@ public final class ParserIdentifier { } /** - * Make {@link InstanceIdentifierContext} from identifier. + * Make {@link InstanceIdentifierContext} from {@link String} identifier + *
+ * For identifiers of data NOT behind mount points returned + * {@link InstanceIdentifierContext} is prepared with {@code null} reference of {@link DOMMountPoint} and with + * controller's {@link SchemaContext}. + *
+ * For identifiers of data behind mount points returned + * {@link InstanceIdentifierContext} is prepared with reference of {@link DOMMountPoint} and its + * own {@link SchemaContext}. * * @param identifier - * - path identifier + * - path identifier * @param schemaContext - * - {@link SchemaContext} + * - controller schema context + * @param mountPointService + * - mount point service * @return {@link InstanceIdentifierContext} */ - public static InstanceIdentifierContext toInstanceIdentifier(@Nullable final String identifier, - final SchemaContext schemaContext) { - final YangInstanceIdentifier deserialize; - if (identifier != null && identifier.contains(RestconfConstants.MOUNT)) { - final String mountPointId = identifier.substring(0, identifier.indexOf("/" + RestconfConstants.MOUNT)); - deserialize = IdentifierCodec.deserialize(mountPointId, schemaContext); + public static InstanceIdentifierContext toInstanceIdentifier( + final String identifier, + final SchemaContext schemaContext, + final Optional mountPointService) { + if ((identifier != null) && identifier.contains(RestconfConstants.MOUNT)) { + if (!mountPointService.isPresent()) { + throw new RestconfDocumentedException("Mount point service is not available"); + } + + final Iterator pathsIt = Splitter.on("/" + RestconfConstants.MOUNT).split(identifier).iterator(); + + final String mountPointId = pathsIt.next(); + final YangInstanceIdentifier mountYangInstanceIdentifier = IdentifierCodec.deserialize( + mountPointId, schemaContext); + final Optional mountPoint = mountPointService.get().getMountPoint(mountYangInstanceIdentifier); + + if (!mountPoint.isPresent()) { + throw new RestconfDocumentedException( + "Mount point does not exist.", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING); + } + + final String pathId = pathsIt.next().replaceFirst("/", ""); + final YangInstanceIdentifier pathYangInstanceIdentifier = IdentifierCodec.deserialize( + pathId, mountPoint.get().getSchemaContext()); + + final DataSchemaContextNode child = DataSchemaContextTree.from( + mountPoint.get().getSchemaContext()).getChild(pathYangInstanceIdentifier); + if (child != null) { + return new InstanceIdentifierContext(pathYangInstanceIdentifier, child.getDataSchemaNode(), + mountPoint.get(), mountPoint.get().getSchemaContext()); + } + final QName rpcQName = mountYangInstanceIdentifier.getLastPathArgument().getNodeType(); + RpcDefinition def = null; + for (final RpcDefinition rpcDefinition : schemaContext + .findModuleByNamespaceAndRevision(rpcQName.getNamespace(), rpcQName.getRevision()).getRpcs()) { + if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) { + def = rpcDefinition; + break; + } + } + return new InstanceIdentifierContext(mountYangInstanceIdentifier, def, mountPoint.get(), + mountPoint.get().getSchemaContext()); } else { - deserialize = IdentifierCodec.deserialize(identifier, schemaContext); + final YangInstanceIdentifier deserialize = IdentifierCodec.deserialize(identifier, schemaContext); + final DataSchemaContextNode child = DataSchemaContextTree.from(schemaContext).getChild(deserialize); + + if(child != null){ + return new InstanceIdentifierContext(deserialize, child.getDataSchemaNode(), null, schemaContext); + } + final QName rpcQName = deserialize.getLastPathArgument().getNodeType(); + RpcDefinition def = null; + for (final RpcDefinition rpcDefinition : schemaContext.findModuleByNamespaceAndRevision(rpcQName.getNamespace(), rpcQName.getRevision()).getRpcs()) { + if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) { + def = rpcDefinition; + break; + } + } + return new InstanceIdentifierContext(deserialize, def, null, schemaContext); } - final DataSchemaContextNode child = DataSchemaContextTree.from(schemaContext).getChild(deserialize); - return new InstanceIdentifierContext(deserialize, child.getDataSchemaNode(), null, schemaContext); } /** @@ -170,12 +229,11 @@ public final class ParserIdentifier { pathBuilder.append(current); } final InstanceIdentifierContext point = ParserIdentifier - .toInstanceIdentifier(pathBuilder.toString(), schemaContext); - final DOMMountPoint mountPoint = domMountPointService.getMountPoint(point.getInstanceIdentifier()).get(); + .toInstanceIdentifier(pathBuilder.toString(), schemaContext, Optional.of(domMountPointService)); final String moduleName = RestconfValidation.validateAndGetModulName(componentIter); final Date revision = RestconfValidation.validateAndGetRevision(componentIter); - final Module module = mountPoint.getSchemaContext().findModuleByName(moduleName, revision); - return new SchemaExportContext(mountPoint.getSchemaContext(), module); + final Module module = point.getMountPoint().getSchemaContext().findModuleByName(moduleName, revision); + return new SchemaExportContext(point.getMountPoint().getSchemaContext(), module); } } }