X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-model-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fmodel%2Futil%2FSchemaContextUtil.java;h=ea1a9bf677ff8c0f804180eb2ada9961a6a8df86;hb=c358e6dafb7627feb37fcbf1583d31c6170cc958;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..ea1a9bf677 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()); } @@ -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); } } @@ -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; } /**