ModuleEffectiveStatement needs to allow looking up which submodules
were included as the effect of include statements. Since submodule
names need to be unique, it is natural to express this as a namespace.
Change-Id: I782caba8dfb9ff4dbea5b81e335f06dc797518d5
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
+ /**
+ * Namespace mapping all included submodules. The namespaces is keyed by submodule name.
+ */
+ abstract class NameToEffectiveSubmoduleNamespace
+ implements IdentifierNamespace<String, @NonNull SubmoduleEffectiveStatement> {
+ private NameToEffectiveSubmoduleNamespace() {
+ // This class should never be subclassed
+ }
+ }
+
/**
* Get the local QNameModule of this module. All implementations need to override this default method.
*
/**
* Get the local QNameModule of this module. All implementations need to override this default method.
*
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveModule;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveModule;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx;
+import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToModuleCtx;
import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleStatement>
implements ModuleEffectiveStatement {
import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleStatement>
implements ModuleEffectiveStatement {
+ private final Map<String, SubmoduleEffectiveStatement> nameToSubmodule;
private final Map<String, ModuleEffectiveStatement> prefixToModule;
private final Map<QNameModule, String> namespaceToPrefix;
private final @NonNull QNameModule qnameModule;
private final Map<String, ModuleEffectiveStatement> prefixToModule;
private final Map<QNameModule, String> namespaceToPrefix;
private final @NonNull QNameModule qnameModule;
tmp.putIfAbsent(e.getValue().localQNameModule(), e.getKey());
}
namespaceToPrefix = ImmutableMap.copyOf(tmp);
tmp.putIfAbsent(e.getValue().localQNameModule(), e.getKey());
}
namespaceToPrefix = ImmutableMap.copyOf(tmp);
+
+ final Map<String, StmtContext<?, ?, ?>> submodules =
+ ctx.getAllFromCurrentStmtCtxNamespace(IncludedSubmoduleNameToModuleCtx.class);
+ nameToSubmodule = submodules == null ? ImmutableMap.of() :
+ ImmutableMap.copyOf(Maps.transformValues(submodules,
+ submodule -> (SubmoduleEffectiveStatement) submodule.buildEffective()));
if (QNameModuleToPrefixNamespace.class.equals(namespace)) {
return Optional.of((Map<K, V>) namespaceToPrefix);
}
if (QNameModuleToPrefixNamespace.class.equals(namespace)) {
return Optional.of((Map<K, V>) namespaceToPrefix);
}
+ if (NameToEffectiveSubmoduleNamespace.class.equals(namespace)) {
+ return Optional.of((Map<K, V>) nameToSubmodule);
+ }
return super.getNamespaceContents(namespace);
}
return super.getNamespaceContents(namespace);
}