From 6682a8e2a8c02ed7a66bddb8b7a86009ffbbb98d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 5 Nov 2020 17:16:01 +0100 Subject: [PATCH] Graduate ChildSchemaNodeNamespace as SchemaTreeNamespace This is a @Beta construct in yang-parser-rfc7950, but it provides a crucial link between statements and namespaces. In terms of semantic change, this is a direct replacement for the SPI idea that there is a SchemaNodeIdentifierNamespace. While that namespace allowed lookup based on SchemaNodeIdentifier, while SchemaTreeNamespace follows QName addressing -- i.e. we are changing the addressing mode and allowing more flexible walks. This is a strictly speaking API-breaking change, but since it enables reactor/parser-rfc7950 interactions and is allowed under @Beta API change rules, we will backport this to otherwise stable branches. Existence of this namespace allows us to neatly tie it with OnDemandSchemaTreeStorageNode. JIRA: YANGTOOLS-1168 Change-Id: I9b1c30d21f7021d4c21f3e5a519f6cd1539871ad Signed-off-by: Robert Varga --- .../AnyxmlStatementSupportOverride.java | 4 +- .../rfc7950/reactor/RFC7950Reactors.java | 4 +- .../stmt/BaseSchemaTreeStatementSupport.java | 7 +-- .../AbstractAugmentStatementSupport.java | 6 +-- .../AbstractDeviateStatementSupport.java | 4 +- .../stmt/uses/UsesStatementSupport.java | 4 +- .../spi/SchemaNodeIdentifierNamespace.java | 3 ++ .../yang/parser/spi/SchemaTreeNamespace.java} | 44 ++++++++++++++----- .../parser/spi/meta/NamespaceBehaviour.java | 8 ++++ 9 files changed, 59 insertions(+), 25 deletions(-) rename yang/{yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java => yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaTreeNamespace.java} (77%) diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java index 4aa9c8453e..e7f52455f2 100644 --- a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java +++ b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java @@ -18,8 +18,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml.AnyxmlStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.ForwardingStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -70,7 +70,7 @@ public final class AnyxmlStatementSupportOverride private static Optional getAnyXmlSchema( final StmtContext ctx, final SchemaNodeIdentifier contentSchemaPath) { - return ChildSchemaNodeNamespace.findNode(ctx.getRoot(), contentSchemaPath) + return SchemaTreeNamespace.findNode(ctx.getRoot(), contentSchemaPath) .map(StmtContext::buildEffective) .filter(ContainerSchemaNode.class::isInstance).map(ContainerSchemaNode.class::cast); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java index b4c9ee5404..7bac557ebe 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java @@ -16,7 +16,6 @@ import com.google.common.collect.Sets; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.parser.openconfig.stmt.OpenConfigVersionSupport; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ModuleQNameToPrefix; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.URIStringToImportPrefix; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.YangNamespaceContextNamespace; @@ -120,6 +119,7 @@ import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule; import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; @@ -218,7 +218,7 @@ public final class RFC7950Reactors { .addSupport(YinElementStatementSupport.getInstance()) .addSupport(ArgumentStatementSupport.getInstance()) .addSupport(ExtensionStatementSupport.getInstance()) - .addSupport(new ChildSchemaNodeNamespace<>()) + .addSupport(SchemaTreeNamespace.getInstance()) .addSupport(ExtensionNamespace.BEHAVIOUR) .addSupport(TypedefStatementSupport.getInstance()) .addSupport(TypeNamespace.BEHAVIOUR) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseSchemaTreeStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseSchemaTreeStatementSupport.java index 0d180264f3..2bb06827d9 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseSchemaTreeStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseSchemaTreeStatementSupport.java @@ -11,13 +11,14 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; 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; /** - * Specialization of {@link BaseQNameStatementSupport} for stating the onStatementAdded method. + * Specialization of {@link BaseQNameStatementSupport} for {@link SchemaTreeEffectiveStatement} implementations. Every + * statement automatically participates in {@link SchemaTreeNamespace}. * * @param Declared Statement representation * @param Effective Statement representation @@ -34,7 +35,7 @@ public abstract class BaseSchemaTreeStatementSupport stmt) { - stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt); + stmt.coerceParentContext().addToNs(SchemaTreeNamespace.class, stmt.coerceStatementArgument(), stmt); } // Non-final because {@code input} and {@code output} are doing their own thing. diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java index abbd447387..5c85334c3c 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java @@ -33,10 +33,10 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; 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; @@ -91,7 +91,7 @@ abstract class AbstractAugmentStatementSupport final ModelActionBuilder augmentAction = augmentNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); augmentAction.requiresCtx(augmentNode, ModelProcessingPhase.EFFECTIVE_MODEL); final Prerequisite>> target = augmentAction.mutatesEffectiveCtxPath( - getSearchRoot(augmentNode), ChildSchemaNodeNamespace.class, + getSearchRoot(augmentNode), SchemaTreeNamespace.class, augmentNode.coerceStatementArgument().getNodeIdentifiers()); augmentAction.apply(new InferenceAction() { @@ -131,7 +131,7 @@ abstract class AbstractAugmentStatementSupport */ if (YangStmtMapping.USES == augmentNode.coerceParentContext().getPublicDefinition()) { final SchemaNodeIdentifier augmentArg = augmentNode.coerceStatementArgument(); - final Optional> targetNode = ChildSchemaNodeNamespace.findNode( + final Optional> targetNode = SchemaTreeNamespace.findNode( getSearchRoot(augmentNode), augmentArg); if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) { augmentNode.setIsSupportedToBuildEffective(false); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java index a809ad5a6e..0ce5325f84 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java @@ -28,9 +28,9 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement; 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.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; 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; @@ -130,7 +130,7 @@ abstract class AbstractDeviateStatementSupport final Prerequisite>> targetCtxPrerequisite = deviateAction.mutatesEffectiveCtxPath(deviateStmtCtx.getRoot(), - ChildSchemaNodeNamespace.class, deviationTarget.getNodeIdentifiers()); + SchemaTreeNamespace.class, deviationTarget.getNodeIdentifiers()); deviateAction.apply(new InferenceAction() { @Override diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java index 73e682c9de..c260f2888b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java @@ -33,11 +33,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineEffectiveStatementImpl; import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; 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; @@ -301,7 +301,7 @@ public final class UsesStatementSupport subStmtCtx.getStatementSourceReference(), "Invalid refine argument %s. It must be instance of SchemaNodeIdentifier.", refineArgument); - final Optional> optRefineTargetCtx = ChildSchemaNodeNamespace.findNode( + final Optional> optRefineTargetCtx = SchemaTreeNamespace.findNode( usesParentCtx, (SchemaNodeIdentifier) refineArgument); InferenceException.throwIf(!optRefineTargetCtx.isPresent(), subStmtCtx.getStatementSourceReference(), "Refine target node %s not found.", refineArgument); diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java index cbed70ad84..eadda2e485 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaNodeIdentifierNamespace.java @@ -20,7 +20,10 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace.TreeBa *

* This namespace is scoped to the parent node or module, unless the parent node is a case node. In that case, * the namespace is scoped to the closest ancestor node that is not a case or choice node. + * + * @deprecated This namespace was never implemented. Its purpose is generalized in {@link SchemaTreeNamespace}. */ +@Deprecated(forRemoval = true) public interface SchemaNodeIdentifierNamespace extends TreeBased, EffectiveStatement>> { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaTreeNamespace.java similarity index 77% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java rename to yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaTreeNamespace.java index b8a7e51724..793bc39511 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SchemaTreeNamespace.java @@ -5,17 +5,20 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.yangtools.yang.parser.rfc7950.namespace; +package org.opendaylight.yangtools.yang.parser.spi; import com.google.common.annotations.Beta; import java.util.Collection; import java.util.Iterator; import java.util.Map; 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.meta.EffectiveStatement; 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.NamespaceBehaviour; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace; @@ -24,22 +27,41 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; /** - * Statement local namespace, which holds direct schema node descendants. + * Statement local namespace, which holds direct schema node descendants. This corresponds to the contents of the schema + * tree as exposed through {@link SchemaTreeAwareEffectiveStatement}. */ +// FIXME: 7.0.0: this contract seems to fall on the reactor side of things rather than parser-spi. Consider moving this +// into yang-(parser-)reactor-api. @Beta -public final class ChildSchemaNodeNamespace, E extends EffectiveStatement> - extends NamespaceBehaviour, ChildSchemaNodeNamespace> +public final class SchemaTreeNamespace, + E extends SchemaTreeEffectiveStatement> + extends NamespaceBehaviour, SchemaTreeNamespace> implements StatementNamespace { - public ChildSchemaNodeNamespace() { - super((Class) ChildSchemaNodeNamespace.class); + private static final @NonNull SchemaTreeNamespace INSTANCE = new SchemaTreeNamespace<>(); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private SchemaTreeNamespace() { + super((Class) SchemaTreeNamespace.class); + } + + @SuppressWarnings("unchecked") + public static , E extends SchemaTreeEffectiveStatement> + @NonNull SchemaTreeNamespace getInstance() { + return (SchemaTreeNamespace) INSTANCE; } @Override public StmtContext get(final QName key) { - // TODO Auto-generated method stub + // FIXME: 7.0.0: this method needs to be well-defined return null; } + /** + * {@inheritDoc} + * + *

+ * This method is analogous to {@link SchemaTreeAwareEffectiveStatement#findSchemaTreeNode(QName)}. + */ @Override public StmtContext getFrom(final NamespaceStorageNode storage, final QName key) { // Get the backing storage node for the requested storage @@ -59,7 +81,7 @@ public final class ChildSchemaNodeNamespace, @Override public Map> getAllFrom(final NamespaceStorageNode storage) { - // TODO Auto-generated method stub + // FIXME: 7.0.0: this method needs to be well-defined return null; } @@ -67,7 +89,7 @@ public final class ChildSchemaNodeNamespace, @Override public void addTo(final NamespaceStorageNode storage, final QName key, final StmtContext value) { final StmtContext prev = globalOrStatementSpecific(storage).putToLocalStorageIfAbsent( - ChildSchemaNodeNamespace.class, key, value); + SchemaTreeNamespace.class, key, value); if (prev != null) { throw new SourceException(value.getStatementSourceReference(), @@ -95,7 +117,7 @@ public final class ChildSchemaNodeNamespace, QName nextPath = iterator.next(); @SuppressWarnings("unchecked") - StmtContext current = (StmtContext) root.getFromNamespace(ChildSchemaNodeNamespace.class, + StmtContext current = (StmtContext) root.getFromNamespace(SchemaTreeNamespace.class, nextPath); if (current == null) { return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), root)); @@ -104,7 +126,7 @@ public final class ChildSchemaNodeNamespace, nextPath = iterator.next(); @SuppressWarnings("unchecked") final StmtContext nextNodeCtx = (StmtContext) current.getFromNamespace( - ChildSchemaNodeNamespace.class, nextPath); + SchemaTreeNamespace.class, nextPath); if (nextNodeCtx == null) { return Optional.ofNullable(tryToFindUnknownStatement(nextPath.getLocalName(), current)); } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceBehaviour.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceBehaviour.java index 577c59c290..25d4409547 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceBehaviour.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/NamespaceBehaviour.java @@ -22,6 +22,8 @@ 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.meta.IdentifierNamespace; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; /** * Definition / implementation of specific Identifier Namespace behaviour. A namespace behaviour is built on top @@ -128,8 +130,14 @@ public abstract class NamespaceBehaviour + * The results produced by this method are expected to be consistent with + * {@link SchemaTreeAwareEffectiveStatement#findSchemaTreeNode(QName)} and + * {@link SchemaTreeNamespace#getFrom(NamespaceStorageNode, QName)}. + * * @param qname node identifier of the child being requested * @return Requested child, if it is present. + * @throws NullPointerException in {@code qname} is null */ , E extends EffectiveStatement> @Nullable StmtContext requestSchemaTreeChild(QName qname); -- 2.36.6