Migrate getDataChildByName() users
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / SchemaContextUtil.java
index 65fd57000fd79b4fdfd25c59e30bb629839c5e87..73bd1765d1d0cc121702ee110b85075647bec6e5 100644 (file)
@@ -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<QName> 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<? extends SchemaNode> 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<String> doSplitXPath(final String xpath) {
-        return SLASH_SPLITTER.splitToList(xpath);
+        final List<String> ret = new ArrayList<>();
+        for (String str : SLASH_SPLITTER.split(xpath)) {
+            ret.add(str);
+        }
+        return ret;
     }
 
     /**