From: Robert Varga Date: Wed, 13 Jan 2021 10:11:00 +0000 (+0100) Subject: Add QNameModuleNamespace X-Git-Tag: v7.0.0~321 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F17%2F94617%2F3;p=yangtools.git Add QNameModuleNamespace ModuleEffectiveStatement needs to know its own QNameModule, for obvious reasons. Add a dedicated local namespace to carry this information, so that we do not need to access the caerbannog() implementation leak. This also necessitates an update to NamespaceBehavior to treat STATEMENT_LOCAL specially -- which we do by specializing a NamespaceBehavior.StatementLocal. JIRA: YANGTOOLS-1186 Change-Id: I9357c30122d7fe256f386754893c4e6130920d8e Signed-off-by: Robert Varga --- 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 1e6d4e8976..7d3dd65f96 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 @@ -63,6 +63,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.max_elements.MaxEleme import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.min_elements.MinElementsStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.modifier.ModifierStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.ModuleStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.QNameModuleNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.must.MustStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.namespace.NamespaceStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.notification.NotificationStatementRFC6020Support; @@ -169,6 +170,7 @@ public final class RFC7950Reactors { .addSupport(PreLinkageModuleNamespace.BEHAVIOUR) .addSupport(ImpPrefixToNamespace.BEHAVIOUR) .addSupport(ModuleCtxToModuleQName.BEHAVIOUR) + .addSupport(QNameModuleNamespace.BEHAVIOUR) .build(); private static final StatementSupportBundle LINKAGE_BUNDLE = StatementSupportBundle diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java index b14eed83ce..ddf6773f85 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java @@ -7,7 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module; -import static com.google.common.base.Verify.verifyNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -40,7 +40,6 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveModu import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToModuleCtx; -import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule implements Module, ModuleEffectiveStatement { @@ -55,10 +54,9 @@ final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule stmt, final ImmutableList> substatements, - final Collection submodules) { + final Collection submodules, final QNameModule qnameModule) { super(stmt, substatements, findPrefix(stmt, substatements, "module", stmt.getRawArgument())); - - qnameModule = verifyNotNull(stmt.getFromNamespace(ModuleCtxToModuleQName.class, stmt.caerbannog())); + this.qnameModule = requireNonNull(qnameModule); this.submodules = ImmutableList.copyOf(submodules); final String localPrefix = findFirstEffectiveSubstatementArgument(PrefixEffectiveStatement.class).get(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java index f4e50daeab..e6b59a5a1c 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module; import static com.google.common.base.Verify.verify; +import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; @@ -21,6 +22,7 @@ import java.util.Map; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.common.UnqualifiedQName; @@ -200,6 +202,7 @@ public final class ModuleStatementSupport firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class), stmt, "Prefix of the module [%s] is missing", stmt.argument()); + stmt.addToNs(QNameModuleNamespace.class, Empty.getInstance(), qNameModule); stmt.addToNs(PrefixToModule.class, modulePrefix, qNameModule); stmt.addToNs(ModuleNameToModuleQName.class, moduleName, qNameModule); stmt.addToNs(ModuleCtxToModuleQName.class, stmt, qNameModule); @@ -269,8 +272,10 @@ public final class ModuleStatementSupport submodules.add((Submodule) submodule); } + final QNameModule qnameModule = verifyNotNull(stmt.namespaceItem(QNameModuleNamespace.class, + Empty.getInstance())); try { - return new ModuleEffectiveStatementImpl(stmt, substatements, submodules); + return new ModuleEffectiveStatementImpl(stmt, substatements, submodules, qnameModule); } catch (SubstatementIndexingException e) { throw new SourceException(e.getMessage(), stmt, e); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/QNameModuleNamespace.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/QNameModuleNamespace.java new file mode 100644 index 0000000000..af714f81f9 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/QNameModuleNamespace.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * 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.stmt.module; + +import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Empty; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; + +/** + * Module-local namespace holding the module's QName. + */ +@Beta +public interface QNameModuleNamespace extends IdentifierNamespace { + NamespaceBehaviour BEHAVIOUR = + NamespaceBehaviour.statementLocal(QNameModuleNamespace.class); + +} 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 be4f46d0ab..1d40d20190 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 @@ -180,7 +180,7 @@ public abstract class NamespaceBehaviour> @NonNull NamespaceBehaviour statementLocal( final Class identifier) { - return new StorageSpecific<>(identifier, StorageNodeType.STATEMENT_LOCAL); + return new StatementLocal<>(identifier); } /** @@ -288,34 +288,52 @@ public abstract class NamespaceBehaviour> extends NamespaceBehaviour { - private final StorageNodeType storageType; - - StorageSpecific(final Class identifier, final StorageNodeType type) { + abstract static class AbstractSpecific> + extends NamespaceBehaviour { + AbstractSpecific(final Class identifier) { super(identifier); - storageType = requireNonNull(type); } @Override - public V getFrom(final NamespaceStorageNode storage, final K key) { - NamespaceStorageNode current = findClosestTowardsRoot(storage, storageType); - return getFromLocalStorage(current, key); + public final V getFrom(final NamespaceStorageNode storage, final K key) { + return getFromLocalStorage(findStorageNode(storage), key); } @Override - public Map getAllFrom(final NamespaceStorageNode storage) { - NamespaceStorageNode current = storage; - while (current.getStorageNodeType() != storageType) { - current = current.getParentNamespaceStorage(); - } + public final Map getAllFrom(final NamespaceStorageNode storage) { + return getAllFromLocalStorage(findStorageNode(storage)); + } + + @Override + public final void addTo(final NamespaceStorageNode storage, final K key, final V value) { + addToStorage(findStorageNode(storage), key, value); + } + + abstract NamespaceStorageNode findStorageNode(NamespaceStorageNode storage); + } + + static final class StatementLocal> extends AbstractSpecific { + StatementLocal(final Class identifier) { + super(identifier); + } + + @Override + NamespaceStorageNode findStorageNode(final NamespaceStorageNode storage) { + return storage; + } + } + + static final class StorageSpecific> extends AbstractSpecific { + private final StorageNodeType storageType; - return getAllFromLocalStorage(current); + StorageSpecific(final Class identifier, final StorageNodeType type) { + super(identifier); + storageType = requireNonNull(type); } @Override - public void addTo(final NamespaceBehaviour.NamespaceStorageNode storage, final K key, final V value) { - NamespaceStorageNode current = findClosestTowardsRoot(storage, storageType); - addToStorage(current, key, value); + NamespaceStorageNode findStorageNode(final NamespaceStorageNode storage) { + return findClosestTowardsRoot(storage, storageType); } @Override @@ -325,7 +343,6 @@ public abstract class NamespaceBehaviour> extends NamespaceBehaviour { - TreeScoped(final Class identifier) { super(identifier); }