Consider submodule imports when sorting modules 74/70974/8
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 16 Apr 2018 10:24:39 +0000 (12:24 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 16 Apr 2018 13:48:31 +0000 (15:48 +0200)
YANGTOOLS-806 started skipping import statements, hence
a module's effective requirements are no longer expressed
in their imports.

Teach ModuleDependencySort about submodules and populate
the graph based on submodule's imports, too.

JIRA: YANGTOOLS-876
Change-Id: I1aed32de034cf2e602e130afcbeafb171fac514b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/ModuleDependencySort.java
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/ModuleDependencySortTest.java
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SimpleSchemaContextTest.java

index dee1a18f1ae7aee9547cc529b440cd1afa517d5f..d39faae09d64f5a53250589d70f55c38e40ade4d 100644 (file)
@@ -16,6 +16,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -110,7 +111,7 @@ public final class ModuleDependencySort {
             }
 
             // no need to check if other Type of object, check is performed in process modules
-            for (final ModuleImport imprt : module.getImports()) {
+            for (final ModuleImport imprt : allImports(module)) {
                 final String toName = imprt.getModuleName();
                 final Optional<Revision> toRevision = imprt.getRevision();
 
@@ -139,6 +140,19 @@ public final class ModuleDependencySort {
         }
     }
 
+    private static Collection<ModuleImport> allImports(final Module mod) {
+        if (mod.getSubmodules().isEmpty()) {
+            return mod.getImports();
+        }
+
+        final Collection<ModuleImport> concat = new LinkedHashSet<>();
+        concat.addAll(mod.getImports());
+        for (Module sub : mod.getSubmodules()) {
+            concat.addAll(sub.getImports());
+        }
+        return concat;
+    }
+
     /**
      * Get imported module by its name and revision from moduleGraph.
      */
index a310b0622a2592b305ab1a40c360c911977e78ba..c95bb141a8d01213b388e1fcc41fc147b746924c 100644 (file)
@@ -14,28 +14,61 @@ import static org.mockito.Mockito.doReturn;
 import com.google.common.collect.ImmutableSet;
 import java.net.URI;
 import java.util.List;
+import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ModuleDependencySortTest {
-    private static final QNameModule TEST = QNameModule.create(URI.create("foo"));
+    private static final QNameModule FOO_MODULE = QNameModule.create(URI.create("foo"));
+    private static final QNameModule BAR_MODULE = QNameModule.create(URI.create("bar"));
 
     @Mock
     private Module fooNoRev;
 
+    @Mock
+    private ModuleImport fooNoRevImport;
+
+    @Mock
+    private Module bar;
+
+    @Mock
+    private Module barSubmodule;
+
     @Before
     public void before() {
-        doReturn(ImmutableSet.of()).when(fooNoRev).getImports();
         doReturn("foo").when(fooNoRev).getName();
-        doReturn(TEST).when(fooNoRev).getQNameModule();
-        doReturn(TEST.getNamespace()).when(fooNoRev).getNamespace();
-        doReturn(TEST.getRevision()).when(fooNoRev).getRevision();
+        doReturn(FOO_MODULE).when(fooNoRev).getQNameModule();
+        doReturn(FOO_MODULE.getNamespace()).when(fooNoRev).getNamespace();
+        doReturn(FOO_MODULE.getRevision()).when(fooNoRev).getRevision();
+        doReturn(YangVersion.VERSION_1).when(fooNoRev).getYangVersion();
+        doReturn(ImmutableSet.of()).when(fooNoRev).getImports();
+        doReturn(ImmutableSet.of()).when(fooNoRev).getSubmodules();
+
+        doReturn("foo").when(fooNoRevImport).getModuleName();
+        doReturn(Optional.empty()).when(fooNoRevImport).getRevision();
+
+        doReturn("bar").when(bar).getName();
+        doReturn(BAR_MODULE).when(bar).getQNameModule();
+        doReturn(BAR_MODULE.getNamespace()).when(bar).getNamespace();
+        doReturn(BAR_MODULE.getRevision()).when(bar).getRevision();
+        doReturn(YangVersion.VERSION_1).when(bar).getYangVersion();
+        doReturn(ImmutableSet.of()).when(bar).getImports();
+        doReturn(ImmutableSet.of(barSubmodule)).when(bar).getSubmodules();
+
+        doReturn("bar-submodule").when(barSubmodule).getName();
+        doReturn(BAR_MODULE).when(barSubmodule).getQNameModule();
+        doReturn(BAR_MODULE.getNamespace()).when(barSubmodule).getNamespace();
+        doReturn(BAR_MODULE.getRevision()).when(barSubmodule).getRevision();
+        doReturn(ImmutableSet.of(fooNoRevImport)).when(barSubmodule).getImports();
+        doReturn(ImmutableSet.of()).when(barSubmodule).getSubmodules();
     }
 
     @Test
@@ -43,6 +76,12 @@ public class ModuleDependencySortTest {
         assertSortedTo(of(fooNoRev), fooNoRev);
     }
 
+    @Test
+    public void testSubmodules() {
+        assertSortedTo(of(fooNoRev, bar), bar, fooNoRev);
+        assertSortedTo(of(fooNoRev, bar), fooNoRev, bar);
+    }
+
     private static void assertSortedTo(final List<Module> expected, final Module... modules) {
         assertEquals(expected, ModuleDependencySort.sort(modules));
     }
index 365f5c855ccc0aa2f7860158c46720201cb42550..54e3c3fa85fb8187116245a45dc05ec913dd2fa9 100644 (file)
@@ -77,6 +77,7 @@ public class SimpleSchemaContextTest {
         doReturn(mod).when(ret).getQNameModule();
         doReturn(mod.toString()).when(ret).toString();
         doReturn(ImmutableSet.of()).when(ret).getImports();
+        doReturn(ImmutableSet.of()).when(ret).getSubmodules();
         return ret;
     }
 }