package org.opendaylight.yangtools.yang.parser.rfc7950.namespace;
import com.google.common.annotations.Beta;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Optional;
import javax.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.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
/**
}
}
+ /**
+ * 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.getPathFromRoot().iterator();
+ if (!iterator.hasNext()) {
+ return Optional.of((Mutable<?, ?, EffectiveStatement<?, ?>>) root);
+ }
+
+ QName nextPath = iterator.next();
+ Mutable<?, ?, EffectiveStatement<?, ?>> current = root.getFromNamespace(ChildSchemaNodeNamespace.class,
+ nextPath);
+ if (current == null) {
+ return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(),
+ (Mutable<?, ?, EffectiveStatement<?, ?>>) root));
+ }
+ while (current != null && iterator.hasNext()) {
+ nextPath = iterator.next();
+ final Mutable<?, ?, EffectiveStatement<?, ?>> nextNodeCtx = current.getFromNamespace(
+ ChildSchemaNodeNamespace.class,nextPath);
+ if (nextNodeCtx == null) {
+ return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), current));
+ }
+ current = nextNodeCtx;
+ }
+ return Optional.ofNullable(current);
+ }
+
+ @SuppressWarnings("unchecked")
+ static Mutable<?, ?, EffectiveStatement<?, ?>> tryToFindUnknownStatement(final String localName,
+ final Mutable<?, ?, EffectiveStatement<?, ?>> current) {
+ final Collection<? extends StmtContext<?, ?, ?>> unknownSubstatements = StmtContextUtils.findAllSubstatements(
+ current, UnknownStatement.class);
+ for (final StmtContext<?, ?, ?> unknownSubstatement : unknownSubstatements) {
+ if (localName.equals(unknownSubstatement.rawStatementArgument())) {
+ return (Mutable<?, ?, EffectiveStatement<?, ?>>) unknownSubstatement;
+ }
+ }
+ return null;
+ }
+
private static NamespaceStorageNode globalOrStatementSpecific(final NamespaceStorageNode storage) {
NamespaceStorageNode current = storage;
while (!isLocalOrGlobal(current.getStorageNodeType())) {
*/
package org.opendaylight.yangtools.yang.parser.rfc7950.namespace;
-import static java.util.Objects.requireNonNull;
-
import com.google.common.annotations.Beta;
-import java.util.Collection;
import java.util.Iterator;
import java.util.Optional;
import javax.annotation.Nonnull;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedNamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
+/**
+ * Legacy namespace for looking up nodes by their Schema Tree identifier.
+ *
+ * @deprecated Use path-based utilities provided around {@link ChildSchemaNodeNamespace} instead.
+ */
@Beta
+@Deprecated
public final class SchemaNodeIdentifierBuildNamespace
extends DerivedNamespaceBehaviour<SchemaNodeIdentifier, Mutable<?, ?, EffectiveStatement<?, ?>>, QName,
SchemaNodeIdentifierBuildNamespace, ChildSchemaNodeNamespace<?, ?>>
* @param identifier {@link SchemaNodeIdentifier} relative to search root
* @return Matching statement context, if present.
* @throws NullPointerException if any of the arguments is null
+ * @deprecated Use {@link ChildSchemaNodeNamespace#findNode(StmtContext, SchemaNodeIdentifier)} instead.
*/
+ @Deprecated
public static Optional<StmtContext<?, ?, ?>> findNode(final StmtContext<?, ?, ?> root,
final SchemaNodeIdentifier identifier) {
- return Optional.ofNullable(root.getFromNamespace(SchemaNodeIdentifierBuildNamespace.class,
- requireNonNull(identifier)));
+ return ChildSchemaNodeNamespace.findNode(root, identifier);
}
@Override
Mutable<?, ?, EffectiveStatement<?, ?>> current = lookupStartStorage.getFromLocalStorage(
ChildSchemaNodeNamespace.class,nextPath);
if (current == null && lookupStartStorage instanceof StmtContext<?, ?, ?>) {
- return tryToFindUnknownStatement(nextPath.getLocalName(),
+ return ChildSchemaNodeNamespace.tryToFindUnknownStatement(nextPath.getLocalName(),
(Mutable<?, ?, EffectiveStatement<?, ?>>) lookupStartStorage);
}
while (current != null && iterator.hasNext()) {
final Mutable<?, ?, EffectiveStatement<?, ?>> nextNodeCtx = current.getFromNamespace(
ChildSchemaNodeNamespace.class,nextPath);
if (nextNodeCtx == null) {
- return tryToFindUnknownStatement(nextPath.getLocalName(), current);
+ return ChildSchemaNodeNamespace.tryToFindUnknownStatement(nextPath.getLocalName(), current);
}
current = nextNodeCtx;
}
return current;
}
- @SuppressWarnings("unchecked")
- private static Mutable<?, ?, EffectiveStatement<?, ?>> tryToFindUnknownStatement(final String localName,
- final Mutable<?, ?, EffectiveStatement<?, ?>> current) {
- final Collection<? extends StmtContext<?, ?, ?>> unknownSubstatements = StmtContextUtils.findAllSubstatements(
- current, UnknownStatement.class);
- for (final StmtContext<?, ?, ?> unknownSubstatement : unknownSubstatements) {
- if (localName.equals(unknownSubstatement.rawStatementArgument())) {
- return (Mutable<?, ?, EffectiveStatement<?, ?>>) unknownSubstatement;
- }
- }
- return null;
- }
-
@Override
public QName getSignificantKey(final SchemaNodeIdentifier key) {
return key.getLastComponent();
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
EffectiveStatement<SchemaNodeIdentifier, AugmentStatement>>> sourceCtxPrereq =
augmentAction.requiresCtx(augmentNode, ModelProcessingPhase.EFFECTIVE_MODEL);
final Prerequisite<Mutable<?, ?, EffectiveStatement<?, ?>>> target =
- augmentAction.mutatesEffectiveCtx(getSearchRoot(augmentNode),
- SchemaNodeIdentifierBuildNamespace.class, augmentNode.getStatementArgument());
+ augmentAction.mutatesEffectiveCtxPath(getSearchRoot(augmentNode),
+ ChildSchemaNodeNamespace.class, augmentNode.getStatementArgument().getPathFromRoot());
augmentAction.apply(new ModelActionBuilder.InferenceAction() {
@Override
* Do not fail, if it is an uses-augment to an unknown node.
*/
if (YangStmtMapping.USES == augmentNode.getParentContext().getPublicDefinition()) {
- final Optional<StmtContext<?, ?, ?>> targetNode = SchemaNodeIdentifierBuildNamespace.findNode(
+ final Optional<StmtContext<?, ?, ?>> targetNode = ChildSchemaNodeNamespace.findNode(
getSearchRoot(augmentNode), augmentNode.getStatementArgument());
if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) {
augmentNode.setIsSupportedToBuildEffective(false);
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
deviateAction.requiresCtx(deviateStmtCtx, ModelProcessingPhase.EFFECTIVE_MODEL);
final Prerequisite<Mutable<?, ?, EffectiveStatement<?, ?>>> targetCtxPrerequisite =
- deviateAction.mutatesEffectiveCtx(deviateStmtCtx.getRoot(),
- SchemaNodeIdentifierBuildNamespace.class, deviationTarget);
+ deviateAction.mutatesEffectiveCtxPath(deviateStmtCtx.getRoot(),
+ ChildSchemaNodeNamespace.class, deviationTarget.getPathFromRoot());
deviateAction.apply(new InferenceAction() {
@Override
import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
subStmtCtx.getStatementSourceReference(),
"Invalid refine argument %s. It must be instance of SchemaNodeIdentifier.", refineArgument);
- final Optional<StmtContext<?, ?, ?>> optRefineTargetCtx = SchemaNodeIdentifierBuildNamespace.findNode(
+ final Optional<StmtContext<?, ?, ?>> optRefineTargetCtx = ChildSchemaNodeNamespace.findNode(
usesParentCtx, (SchemaNodeIdentifier) refineArgument);
InferenceException.throwIf(!optRefineTargetCtx.isPresent(), subStmtCtx.getStatementSourceReference(),
"Refine target node %s not found.", refineArgument);