X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-model-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fmodel%2Futil%2FSchemaContextUtil.java;h=2352eedc8a32fe076d9e345e6ddc028d12c9ea44;hb=4ad3612cb95e3aa811ddd5d1aa76bc93052bf7cd;hp=20fe4ceb3a5401687394ef46377510441eaa9862;hpb=08c9d84f927740567791ffb0b9dfba6176cee321;p=yangtools.git diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java index 20fe4ceb3a..2352eedc8a 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.model.util; import com.google.common.annotations.Beta; import com.google.common.base.Function; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; @@ -17,6 +18,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; @@ -25,6 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -219,7 +222,7 @@ public final class SchemaContextUtil { Preconditions.checkState(schemaNode.getPath() != null, "Schema Path for Schema Node is not " + "set properly (Schema Path is NULL)"); - final QName qname = Iterables.getFirst(schemaNode.getPath().getPathTowardsRoot(), null); + final QName qname = schemaNode.getPath().getLastComponent(); Preconditions.checkState(qname != null, "Schema Path contains invalid state of path parts. " + "The Schema Path MUST contain at least ONE QName which defines namespace and Local name of path."); @@ -247,7 +250,7 @@ public final class SchemaContextUtil { * @return Notification schema or null, if notification is not present in schema context. */ @Beta - public static @Nullable NotificationDefinition getNotificationSchema(@Nonnull final SchemaContext schema,@Nonnull final SchemaPath path) { + @Nullable public static NotificationDefinition getNotificationSchema(@Nonnull final SchemaContext schema, @Nonnull final SchemaPath path) { Preconditions.checkNotNull(schema, "Schema context must not be null."); Preconditions.checkNotNull(path, "Schema path must not be null."); for (final NotificationDefinition potential : schema.getNotifications()) { @@ -266,7 +269,7 @@ public final class SchemaContextUtil { * @return Notification schema or null, if notification is not present in schema context. */ @Beta - public static @Nullable ContainerSchemaNode getRpcDataSchema(@Nonnull final SchemaContext schema,@Nonnull final SchemaPath path) { + @Nullable public static ContainerSchemaNode getRpcDataSchema(@Nonnull final SchemaContext schema, @Nonnull final SchemaPath path) { Preconditions.checkNotNull(schema, "Schema context must not be null."); Preconditions.checkNotNull(path, "Schema path must not be null."); final Iterator it = path.getPathFromRoot().iterator(); @@ -627,13 +630,25 @@ public final class SchemaContextUtil { RevisionAwareXPath pathStatement = typeDefinition.getPathStatement(); pathStatement = new RevisionAwareXPathImpl(stripConditionsFromXPathString(pathStatement), pathStatement.isAbsolute()); - Module parentModule = findParentModuleByType(schemaContext, schema); - final DataSchemaNode dataSchemaNode; - if(pathStatement.isAbsolute()) { - dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext, parentModule, pathStatement); + if (pathStatement.isAbsolute()) { + SchemaNode baseSchema = schema; + while (baseSchema instanceof DerivableSchemaNode) { + final Optional basePotential = ((DerivableSchemaNode) baseSchema).getOriginal(); + if (basePotential.isPresent()) { + baseSchema = basePotential.get(); + } else { + break; + } + } + + Module parentModule = findParentModuleOfReferencingType(schemaContext, baseSchema); + dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext, parentModule, + pathStatement); } else { - dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNodeForRelativeXPath(schemaContext, parentModule, schema, pathStatement); + Module parentModule = findParentModule(schemaContext, schema); + dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNodeForRelativeXPath(schemaContext, + parentModule, schema, pathStatement); } // FIXME this is just to preserve backwards compatibility since yangtools do not mind wrong leafref xpaths @@ -652,7 +667,33 @@ public final class SchemaContextUtil { } } + private static Module findParentModuleOfReferencingType(final SchemaContext schemaContext, + final SchemaNode schemaNode) { + Preconditions.checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!"); + Preconditions.checkArgument(schemaNode != null, "Schema Node cannot be NULL!"); + TypeDefinition nodeType = null; + + if (schemaNode instanceof LeafSchemaNode) { + nodeType = ((LeafSchemaNode) schemaNode).getType(); + } else if (schemaNode instanceof LeafListSchemaNode) { + nodeType = ((LeafListSchemaNode) schemaNode).getType(); + } + + if (nodeType.getBaseType() != null) { + while (nodeType.getBaseType() != null) { + nodeType = nodeType.getBaseType(); + } + + final QNameModule typeDefModuleQname = nodeType.getQName().getModule(); + return schemaContext.findModuleByNamespaceAndRevision(typeDefModuleQname.getNamespace(), + typeDefModuleQname.getRevision()); + } + + return SchemaContextUtil.findParentModule(schemaContext, schemaNode); + } + /** + * @deprecated due to expensive lookup * Returns parent Yang Module for specified Schema Context in which Schema * Node is declared. If Schema Node is of type 'ExtendedType' it tries to find parent module * in which the type was originally declared (needed for correct leafref path resolution).
@@ -671,6 +712,7 @@ public final class SchemaContextUtil { * Schema Node is NOT present, the method will returns * null */ + @Deprecated public static Module findParentModuleByType(final SchemaContext schemaContext, final SchemaNode schemaNode) { Preconditions.checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!"); Preconditions.checkArgument(schemaNode != null, "Schema Node cannot be NULL!"); @@ -682,8 +724,8 @@ public final class SchemaContextUtil { nodeType = ((LeafListSchemaNode) schemaNode).getType(); } - if (nodeType != null && nodeType instanceof ExtendedType) { - while (nodeType.getBaseType() instanceof ExtendedType) { + if (!BaseTypes.isYangBuildInType(nodeType) && nodeType.getBaseType() != null) { + while (nodeType.getBaseType() != null && !BaseTypes.isYangBuildInType(nodeType.getBaseType())) { nodeType = nodeType.getBaseType(); } @@ -726,6 +768,8 @@ public final class SchemaContextUtil { } } + private static final Pattern STRIP_PATTERN = Pattern.compile("\\[.*\\]"); + /** * Removes conditions from xPath pointed to target node. * @@ -735,7 +779,7 @@ public final class SchemaContextUtil { * */ private static String stripConditionsFromXPathString(final RevisionAwareXPath pathStatement) { - return pathStatement.toString().replaceAll("\\[.*\\]", ""); + return STRIP_PATTERN.matcher(pathStatement.toString()).replaceAll(""); } /**