From: Martin Vitez Date: Mon, 13 Jan 2014 16:03:39 +0000 (+0100) Subject: Added module sorting to SchemaContext. X-Git-Tag: yangtools-0.6.0~101^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=e28eb711ad8962659e16e047027c46eadd4f3599;p=yangtools.git Added module sorting to SchemaContext. Added test. Signed-off-by: Martin Vitez --- diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java index 2d1da1f833..3d595ed524 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java @@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.parser.impl; import java.net.URI; import java.util.Date; import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -18,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; final class SchemaContextImpl implements SchemaContext { private final Set modules; @@ -37,7 +40,8 @@ final class SchemaContextImpl implements SchemaContext { @Override public Set getModules() { - return modules; + List sorted = ModuleDependencySort.sort(modules.toArray(new Module[modules.size()])); + return new LinkedHashSet(sorted); } @Override diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java index eed8ad0308..bb2fea413b 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java @@ -10,14 +10,20 @@ package org.opendaylight.yangtools.yang.parser.impl; import static org.junit.Assert.*; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.InputStream; import java.net.URI; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; +import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.junit.Before; @@ -809,4 +815,99 @@ public class YangParserTest { assertEquals(6, modules.size()); } + @Test + public void testSorting() throws FileNotFoundException { + // Correct order: m2, m4, m6, m8, m7, m6, m3, m1 + File yangFile = new File(getClass().getResource("/sorting-test/m1.yang").getPath()); + File dependenciesDir = new File(getClass().getResource("/sorting-test").getPath()); + YangModelParser parser = new YangParserImpl(); + modules = parser.parseYangModels(yangFile, dependenciesDir); + SchemaContext ctx = new SchemaContextImpl(modules); + checkOrder(modules); + assertSetEquals(modules, ctx.getModules()); + + // ########## + parser = new YangParserImpl(); + final File testDir = dependenciesDir; + final String[] fileList = testDir.list(); + final List testFiles = new ArrayList<>(); + if (fileList == null) { + throw new FileNotFoundException(dependenciesDir.getAbsolutePath()); + } + for (String fileName : fileList) { + testFiles.add(new File(testDir, fileName)); + } + Set newModules = parser.parseYangModels(testFiles); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + // ########## + newModules = parser.parseYangModels(testFiles, null); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + // ########## + List streams = new ArrayList<>(); + for (File f : testFiles) { + streams.add(new FileInputStream(f)); + } + newModules = parser.parseYangModelsFromStreams(streams); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + // ########## + streams.clear(); + for (File f : testFiles) { + streams.add(new FileInputStream(f)); + } + newModules = parser.parseYangModelsFromStreams(streams, null); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + // ########## + Map mapped = parser.parseYangModelsMapped(testFiles); + newModules = new LinkedHashSet<>(mapped.values()); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + // ########## + streams.clear(); + for (File f : testFiles) { + streams.add(new FileInputStream(f)); + } + Map mappedStreams = parser.parseYangModelsFromStreamsMapped(streams); + newModules = new LinkedHashSet<>(mappedStreams.values()); + assertSetEquals(newModules, modules); + ctx = new SchemaContextImpl(newModules); + assertSetEquals(newModules, ctx.getModules()); + } + + private void checkOrder(Collection modules) { + Iterator it = modules.iterator(); + Module m = it.next(); + assertEquals("m2", m.getName()); + m = it.next(); + assertEquals("m4", m.getName()); + m = it.next(); + assertEquals("m6", m.getName()); + m = it.next(); + assertEquals("m8", m.getName()); + m = it.next(); + assertEquals("m7", m.getName()); + m = it.next(); + assertEquals("m5", m.getName()); + m = it.next(); + assertEquals("m3", m.getName()); + m = it.next(); + assertEquals("m1", m.getName()); + } + + private void assertSetEquals(Set s1, Set s2) { + assertEquals(s1, s2); + Iterator it = s1.iterator(); + for (Module m : s2) { + assertEquals(m, it.next()); + } + } + } diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang new file mode 100644 index 0000000000..48c5e9b8e2 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m1.yang @@ -0,0 +1,15 @@ +module m1 { + + yang-version 1; + namespace "urn:test.m1"; + prefix "m1"; + + import m3 { + prefix "m3"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang new file mode 100644 index 0000000000..0d6942a2a9 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m2.yang @@ -0,0 +1,10 @@ +module m2 { + + yang-version 1; + namespace "urn:test.m2"; + prefix "m2"; + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang new file mode 100644 index 0000000000..fd8f2daf1f --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m3.yang @@ -0,0 +1,15 @@ +module m3 { + + yang-version 1; + namespace "urn:test.m3"; + prefix "m3"; + + import m5 { + prefix "m5"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang new file mode 100644 index 0000000000..117f36e7f6 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m4.yang @@ -0,0 +1,15 @@ +module m4 { + + yang-version 1; + namespace "urn:test.m4"; + prefix "m4"; + + import m2 { + prefix "m2"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang new file mode 100644 index 0000000000..843cb52d1f --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m5.yang @@ -0,0 +1,15 @@ +module m5 { + + yang-version 1; + namespace "urn:test.m5"; + prefix "m5"; + + import m7 { + prefix "m7"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang new file mode 100644 index 0000000000..26b08774b3 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m6.yang @@ -0,0 +1,15 @@ +module m6 { + + yang-version 1; + namespace "urn:test.m6"; + prefix "m6"; + + import m4 { + prefix "m4"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang new file mode 100644 index 0000000000..b78c40d411 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m7.yang @@ -0,0 +1,15 @@ +module m7 { + + yang-version 1; + namespace "urn:test.m7"; + prefix "m7"; + + import m8 { + prefix "m8"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang b/yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang new file mode 100644 index 0000000000..6518a351de --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/sorting-test/m8.yang @@ -0,0 +1,15 @@ +module m8 { + + yang-version 1; + namespace "urn:test.m8"; + prefix "m8"; + + import m6 { + prefix "m6"; + revision-date 2014-01-13; + } + + revision 2014-01-13 { + } + +}