Move SchemaTreeNamespace.findNode() 70/102170/3
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 19 Aug 2022 13:15:12 +0000 (15:15 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 19 Aug 2022 20:48:31 +0000 (22:48 +0200)
SchemaTreeNamespace as a separate class may be going away, let's
migrate its utility method to a different place.

JIRA: YANGTOOLS-1453
Change-Id: Iabee4a009591af75aa46560d09e15b1043abeabd
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentInferenceAction.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ParserNamespaces.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaTreeNamespace.java

index 8afdb0274bdf1341b3b5994e7b98a5e820a4e78b..338afb78b8d51176928278ddfe25eb17591ae446 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
-import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.ParserNamespaces;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
@@ -96,7 +96,7 @@ final class AugmentInferenceAction implements InferenceAction {
             }
 
             final SchemaNodeIdentifier augmentArg = augmentNode.getArgument();
-            final Optional<StmtContext<?, ?, ?>> targetNode = SchemaTreeNamespace.findNode(
+            final Optional<StmtContext<?, ?, ?>> targetNode = ParserNamespaces.findSchemaTreeStatement(
                 AbstractAugmentStatementSupport.getSearchRoot(augmentNode), augmentArg);
             if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) {
                 augmentNode.setUnsupported();
index 65768d1beeffaac0bec0b9e83817b0ab84f886bd..d0e85fd385f2a12e156650ea3b11b5b4814d23d6 100644 (file)
@@ -44,7 +44,6 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineTargetNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.ParserNamespaces;
-import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.BoundStmtCtx;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
@@ -293,7 +292,7 @@ public final class UsesStatementSupport
 
         // FIXME: this really should be handled via separate inference, i.e. we first instantiate the template and when
         //        it appears, this refine will trigger on it. This reinforces the FIXME below.
-        final Optional<StmtContext<?, ?, ?>> optRefineTargetCtx = SchemaTreeNamespace.findNode(
+        final Optional<StmtContext<?, ?, ?>> optRefineTargetCtx = ParserNamespaces.findSchemaTreeStatement(
             usesParentCtx, (SchemaNodeIdentifier) refineArgument);
         InferenceException.throwIf(!optRefineTargetCtx.isPresent(), subStmtCtx, "Refine target node %s not found.",
             refineArgument);
index a337c834c497e9df3e88cd532b457367272ba9c9..90d062cedbb3298fa695f734e9ac85f6478431ad 100644 (file)
@@ -8,6 +8,9 @@
 package org.opendaylight.yangtools.yang.parser.spi;
 
 import com.google.common.collect.SetMultimap;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Optional;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.Empty;
@@ -25,13 +28,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement
 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
 
 /**
@@ -224,6 +230,51 @@ public final class ParserNamespaces {
     public static final @NonNull ParserNamespace<StmtContext<?, ?, ?>, SourceIdentifier> MODULECTX_TO_SOURCE =
         new ParserNamespace<>("modulectx-to-source");
 
+    /**
+     * Find statement context identified by interpreting specified {@link SchemaNodeIdentifier} starting at specified
+     * {@link StmtContext}.
+     *
+     * @param root Search root context
+     * @param identifier {@link SchemaNodeIdentifier} relative to search root
+     * @return Matching statement context, if present.
+     * @throws NullPointerException if any of the arguments is null
+     */
+    public static Optional<StmtContext<?, ?, ?>> findSchemaTreeStatement(final StmtContext<?, ?, ?> root,
+            final SchemaNodeIdentifier identifier) {
+        final Iterator<QName> iterator = identifier.getNodeIdentifiers().iterator();
+        if (!iterator.hasNext()) {
+            return Optional.of(root);
+        }
+
+        QName nextPath = iterator.next();
+        StmtContext<?, ?, ?> current = root.getFromNamespace(SchemaTreeNamespace.instance(), nextPath);
+        if (current == null) {
+            return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), root));
+        }
+        while (current != null && iterator.hasNext()) {
+            nextPath = iterator.next();
+            final StmtContext<?, ?, ?> nextNodeCtx = current.getFromNamespace(SchemaTreeNamespace.instance(), nextPath);
+            if (nextNodeCtx == null) {
+                return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), current));
+            }
+            current = nextNodeCtx;
+        }
+        return Optional.ofNullable(current);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static StmtContext<?, ?, ?> tryToFindUnknownStatement(final String localName,
+            final StmtContext<?, ?, ?> current) {
+        final Collection<? extends StmtContext<?, ?, ?>> unknownSubstatements = StmtContextUtils.findAllSubstatements(
+            current, UnknownStatement.class);
+        for (final StmtContext<?, ?, ?> unknownSubstatement : unknownSubstatements) {
+            if (localName.equals(unknownSubstatement.rawArgument())) {
+                return unknownSubstatement;
+            }
+        }
+        return null;
+    }
+
     private ParserNamespaces() {
         // Hidden on purpose
     }
index 8b7043c3c97a6848456713dd836dbf546a0e9fb0..deb5cd2c8f89da0391ddbdce2aa89d187203eba7 100644 (file)
@@ -9,19 +9,13 @@ package org.opendaylight.yangtools.yang.parser.spi;
 
 import com.google.common.annotations.Beta;
 import java.io.Serial;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 
 /**
  * Statement local namespace, which holds direct schema node descendants. This corresponds to the contents of the schema
@@ -45,49 +39,4 @@ public final class SchemaTreeNamespace<D extends DeclaredStatement<QName>, E ext
             @NonNull SchemaTreeNamespace<D, E> instance() {
         return (SchemaTreeNamespace<D, E>) INSTANCE;
     }
-
-    /**
-     * Find statement context identified by interpreting specified {@link SchemaNodeIdentifier} starting at specified
-     * {@link StmtContext}.
-     *
-     * @param root Search root context
-     * @param identifier {@link SchemaNodeIdentifier} relative to search root
-     * @return Matching statement context, if present.
-     * @throws NullPointerException if any of the arguments is null
-     */
-    public static Optional<StmtContext<?, ?, ?>> findNode(final StmtContext<?, ?, ?> root,
-            final SchemaNodeIdentifier identifier) {
-        final Iterator<QName> iterator = identifier.getNodeIdentifiers().iterator();
-        if (!iterator.hasNext()) {
-            return Optional.of(root);
-        }
-
-        QName nextPath = iterator.next();
-        StmtContext<?, ?, ?> current = root.getFromNamespace(SchemaTreeNamespace.INSTANCE, nextPath);
-        if (current == null) {
-            return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), root));
-        }
-        while (current != null && iterator.hasNext()) {
-            nextPath = iterator.next();
-            final StmtContext<?, ?, ?> nextNodeCtx = current.getFromNamespace(SchemaTreeNamespace.INSTANCE, nextPath);
-            if (nextNodeCtx == null) {
-                return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), current));
-            }
-            current = nextNodeCtx;
-        }
-        return Optional.ofNullable(current);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static StmtContext<?, ?, ?> tryToFindUnknownStatement(final String localName,
-            final StmtContext<?, ?, ?> current) {
-        final Collection<? extends StmtContext<?, ?, ?>> unknownSubstatements = StmtContextUtils.findAllSubstatements(
-            current, UnknownStatement.class);
-        for (final StmtContext<?, ?, ?> unknownSubstatement : unknownSubstatements) {
-            if (localName.equals(unknownSubstatement.rawArgument())) {
-                return unknownSubstatement;
-            }
-        }
-        return null;
-    }
 }