Add submodule lookup namespace 18/68418/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 19 Feb 2018 20:08:56 +0000 (21:08 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 19 Feb 2018 22:41:30 +0000 (23:41 +0100)
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>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ModuleEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java

index 8a05f8711daf5bf9834125b5285602f56e18a3de..052015a5ab974c4ac52b7cae2dd99d368fe3020d 100644 (file)
@@ -36,6 +36,16 @@ public interface ModuleEffectiveStatement extends EffectiveStatement<String, Mod
         }
     }
 
+    /**
+     * 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.
      *
index a0f0101fb3f02c06c5f13d993821cc4248a87a8e..386ae9ad8dbecf8e53bbc207df0a6a17a7e816f1 100644 (file)
@@ -24,13 +24,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
 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.spi.source.IncludedSubmoduleNameToModuleCtx;
 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;
@@ -60,6 +63,12 @@ final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleS
             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()));
     }
 
     @Override
@@ -82,6 +91,9 @@ final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleS
         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);
     }