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;
}
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();
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;
// 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);
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;
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;
/**
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
}
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
@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;
- }
}