X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fspi%2Fmeta%2FNamespaceBehaviour.java;h=20782e2b8ac1cd167e8ed2bf1dbd8a7f005af060;hb=a20c66b18adc7fbbf07c84f09623f77eaa48cfca;hp=487175e51f091faaedbbf1b7f6715b2de8af493c;hpb=0f36087499b24a97e1bcd0044cdbb5247b5f96c2;p=yangtools.git 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 487175e51f..20782e2b8a 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,7 +9,7 @@ package org.opendaylight.yangtools.yang.parser.spi.meta; import static java.util.Objects.requireNonNull; -import com.google.common.base.MoreObjects; +import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Verify; import java.util.Map; @@ -17,8 +17,13 @@ import java.util.Map.Entry; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.concepts.Identifiable; +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; +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 @@ -33,7 +38,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; * @param Value type * @param Namespace Type */ -public abstract class NamespaceBehaviour> implements Identifiable> { +public abstract class NamespaceBehaviour> + extends AbstractIdentifiable> { public enum StorageNodeType { /** @@ -43,7 +49,7 @@ public abstract class NamespaceBehaviour identifier; + /** + * Interface implemented by {@link NamespaceStorageNode}s which support dynamic addition of child elements as they + * are requested. This means that such a node can, defer creation of child namespace storage nodes, in effect lazily + * expanding this namespace on an if-needed basis. + */ + @Beta + public interface OnDemandSchemaTreeStorageNode extends NamespaceStorageNode { + /** + * Request that a new member of this node's schema tree statement be added. Implementations are required to + * perform lookup in their internal structure and create a child if tractable. Resulting node is expected to + * have been registered with local storage, so that it is accessible through + * {@link #getFromLocalStorage(Class, Object)}. + * + *

+ * 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. + * + *

+ * 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); + } protected NamespaceBehaviour(final Class identifier) { - this.identifier = requireNonNull(identifier); + super(identifier); } /** @@ -242,11 +276,6 @@ public abstract class NamespaceBehaviour getIdentifier() { - return identifier; - } - protected final V getFromLocalStorage(final NamespaceStorageNode storage, final K key) { return storage.getFromLocalStorage(getIdentifier(), key); } @@ -260,7 +289,7 @@ public abstract class NamespaceBehaviour> extends NamespaceBehaviour { - StorageNodeType storageType; + private final StorageNodeType storageType; StorageSpecific(final Class identifier, final StorageNodeType type) { super(identifier); @@ -344,11 +373,7 @@ public abstract class NamespaceBehaviour