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=73bd1765d1d0cc121702ee110b85075647bec6e5;hb=bb60da5fe2d1928defb46ed92b290cfff93dcd81;hp=65fd57000fd79b4fdfd25c59e30bb629839c5e87;hpb=2e92af4130b94023c3eb8caecaab577f75ac03c1;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 65fd57000f..73bd1765d1 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 @@ -36,7 +36,7 @@ import org.opendaylight.yangtools.yang.common.UnqualifiedQName; import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ContainerLike; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; @@ -44,6 +44,7 @@ import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; +import org.opendaylight.yangtools.yang.model.api.ModuleLike; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer; import org.opendaylight.yangtools.yang.model.api.OperationDefinition; @@ -55,6 +56,7 @@ 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.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.Submodule; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; @@ -78,6 +80,7 @@ public final class SchemaContextUtil { private static final Logger LOG = LoggerFactory.getLogger(SchemaContextUtil.class); private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings(); + private static final Pattern GROUPS_PATTERN = Pattern.compile("\\[(.*?)\\]"); private SchemaContextUtil() { // Hidden on purpose @@ -265,7 +268,12 @@ public final class SchemaContextUtil { final SchemaNode actualSchemaNode, final PathExpression relativeXPath) { checkState(!relativeXPath.isAbsolute(), "Revision Aware XPath MUST be relative i.e. MUST contains ../, " + "for non relative Revision Aware XPath use findDataSchemaNode method"); - return resolveRelativeXPath(context, module, relativeXPath.getOriginalString(), actualSchemaNode); + return resolveRelativeXPath(context, module, removePredicatesFromXpath(relativeXPath.getOriginalString()), + actualSchemaNode); + } + + private static String removePredicatesFromXpath(final String xpath) { + return GROUPS_PATTERN.matcher(xpath).replaceAll(""); } /** @@ -327,7 +335,7 @@ public final class SchemaContextUtil { * @return Notification schema or null, if notification is not present in schema context. */ @Beta - public static @Nullable ContainerSchemaNode getRpcDataSchema(final @NonNull SchemaContext schema, + public static @Nullable ContainerLike getRpcDataSchema(final @NonNull SchemaContext schema, final @NonNull SchemaPath path) { requireNonNull(schema, "Schema context must not be null."); requireNonNull(path, "Schema path must not be null."); @@ -356,7 +364,7 @@ public final class SchemaContextUtil { for (Module module : context.getModules()) { ret.add(moduleToIdentifier(module)); - for (Module submodule : module.getSubmodules()) { + for (Submodule submodule : module.getSubmodules()) { ret.add(moduleToIdentifier(submodule)); } } @@ -364,7 +372,7 @@ public final class SchemaContextUtil { return ret; } - private static SourceIdentifier moduleToIdentifier(final Module module) { + private static SourceIdentifier moduleToIdentifier(final ModuleLike module) { return RevisionSourceIdentifier.create(module.getName(), module.getRevision()); } @@ -380,7 +388,7 @@ public final class SchemaContextUtil { SchemaNode foundNode = null; final Iterable nextPath = nextLevel(path); - foundNode = module.getDataChildByName(current); + foundNode = module.dataChildByName(current); if (foundNode != null && nextPath.iterator().hasNext()) { foundNode = findNodeIn(foundNode, nextPath); } @@ -428,7 +436,7 @@ public final class SchemaContextUtil { if (parent instanceof DataNodeContainer) { final DataNodeContainer parentDataNodeContainer = (DataNodeContainer) parent; - foundNode = parentDataNodeContainer.getDataChildByName(current); + foundNode = parentDataNodeContainer.dataChildByName(current); if (foundNode != null && nextPath.iterator().hasNext()) { foundNode = findNodeIn(foundNode, nextPath); } @@ -442,10 +450,10 @@ public final class SchemaContextUtil { } if (foundNode == null && parent instanceof ActionNodeContainer) { - foundNode = ((ActionNodeContainer) parent).getActions().stream() - .filter(act -> current.equals(act.getQName())).findFirst().orElse(null); - if (foundNode != null && nextPath.iterator().hasNext()) { - foundNode = findNodeIn(foundNode, nextPath); + final Optional next = ((ActionNodeContainer) parent).getActions().stream() + .filter(act -> current.equals(act.getQName())).findFirst(); + if (next.isPresent() && nextPath.iterator().hasNext()) { + foundNode = findNodeIn(next.orElseThrow(), nextPath); } } @@ -492,7 +500,7 @@ public final class SchemaContextUtil { if (foundNode == null) { // fallback that tries to map into one of the child cases for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) parent).getCases()) { - final DataSchemaNode maybeChild = caseNode.getDataChildByName(current); + final DataSchemaNode maybeChild = caseNode.dataChildByName(current); if (maybeChild != null) { foundNode = findNodeIn(maybeChild, nextPath); break; @@ -603,7 +611,7 @@ public final class SchemaContextUtil { return QName.create(module.getQNameModule(), prefixedName.next()); } - return QName.create(parentModule.getNamespace(), parentModule.getRevision(), prefixedPathPart); + return QName.create(parentModule.getQNameModule(), prefixedPathPart); } /** @@ -829,7 +837,11 @@ public final class SchemaContextUtil { } private static List doSplitXPath(final String xpath) { - return SLASH_SPLITTER.splitToList(xpath); + final List ret = new ArrayList<>(); + for (String str : SLASH_SPLITTER.split(xpath)) { + ret.add(str); + } + return ret; } /**