From 02959594e02c3f68c70cca0632276ca143fcdbe4 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 29 Oct 2020 12:55:55 +0100 Subject: [PATCH] Add OnDemandSchemaTreeStorageNode In order to correctly implement schema dependencies, we need to invoke a callback from namespace prerequisites back to StatementContextBase and its subclasses. The conduit here is NamespaceBehavior.getFrom(), which is invoked with a namespace key. For ChildSchemaNodeNamespace this ends up the QName matching the argument the corresponding SchemaTreeEffectiveStatement will end up having. Introduce OnDemandSchemaTreeStorageNode, which acts as an extension to normal NamespaceStorageNode behavior -- it allows an implementation to supply a QName-based child statement to be returned. Since StatementContextBase is a NamespaceStorageNode, its subclasses can now additionally implement this interface to receive the callback. JIRA: YANGTOOLS-784 Change-Id: I0e6f621eb39b341af61005b2334174e814c18875 Signed-off-by: Robert Varga (cherry picked from commit 5be3107a8f7daca1e3584bace9a684e21315df70) --- .../namespace/ChildSchemaNodeNamespace.java | 19 ++++++++++--- .../parser/spi/meta/NamespaceBehaviour.java | 28 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java index fe9c4e58c9..7c972fa38e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/namespace/ChildSchemaNodeNamespace.java @@ -28,9 +28,8 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; */ @Beta public final class ChildSchemaNodeNamespace, E extends EffectiveStatement> - extends NamespaceBehaviour, ChildSchemaNodeNamespace> - implements StatementNamespace { - + extends NamespaceBehaviour, ChildSchemaNodeNamespace> + implements StatementNamespace { public ChildSchemaNodeNamespace() { super((Class) ChildSchemaNodeNamespace.class); } @@ -43,7 +42,19 @@ public final class ChildSchemaNodeNamespace, @Override public StmtContext getFrom(final NamespaceStorageNode storage, final QName key) { - return globalOrStatementSpecific(storage).getFromLocalStorage(getIdentifier(), key); + // Get the backing storage node for the requested storage + final NamespaceStorageNode storageNode = globalOrStatementSpecific(storage); + // Check try to look up existing node + final StmtContext existing = storageNode.getFromLocalStorage(getIdentifier(), key); + + // An existing node takes precedence, if it does not exist try to request it + return existing != null ? existing : requestFrom(storageNode, key); + } + + private static , E extends EffectiveStatement> + StmtContext requestFrom(final NamespaceStorageNode storageNode, final QName key) { + return storageNode instanceof OnDemandSchemaTreeStorageNode + ? ((OnDemandSchemaTreeStorageNode) storageNode).requestSchemaTreeChild(key) : null; } @Override 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 86b687d917..2139cd5562 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 @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.spi.meta; import static java.util.Objects.requireNonNull; +import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Verify; import java.util.Map; @@ -17,6 +18,9 @@ import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.concepts.AbstractIdentifiable; +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; /** @@ -107,6 +111,30 @@ public abstract class NamespaceBehaviour + * This method must not change its mind about a child's presence -- once it returns non-present, it has to be + * always returning non-present. + * + * @param qname node identifier of the child being requested + * @return Requested child, if it is present. + */ + , E extends EffectiveStatement> + @Nullable StmtContext requestSchemaTreeChild(QName qname); + } + protected NamespaceBehaviour(final Class identifier) { super(identifier); } -- 2.36.6