Bug 8307: Add the option for activating deviation statements
[yangtools.git] / yang / yang-system-test / src / main / java / org / opendaylight / yangtools / yang / parser / system / test / SystemTestUtils.java
index 7ffcfce5c3de26778192020d35e96b62d2a8943f..5b1e3b40388bfd871319dcce6a796693276d2b48 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.yangtools.yang.parser.system.test;
 
+import com.google.common.base.Preconditions;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.FileNotFoundException;
@@ -15,11 +16,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.function.Predicate;
+import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.repo.api.StatementParserMode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
@@ -35,55 +36,84 @@ class SystemTestUtils {
         }
     };
 
-    static SchemaContext parseYangSources(final Collection<File> files, final Predicate<QName> isFeatureSupported)
-            throws ReactorException, FileNotFoundException {
-        return parseYangSources(files, StatementParserMode.DEFAULT_MODE, isFeatureSupported);
-    }
-
-    static SchemaContext parseYangSources(final Collection<File> files,
-            final StatementParserMode statementParserMode, final Predicate<QName> isFeatureSupported)
-            throws ReactorException, FileNotFoundException {
-        return parseYangSources(isFeatureSupported, statementParserMode, files.toArray(new File[files.size()]));
-    }
+    static SchemaContext parseYangSources(final List<String> yangLibDirs, final List<String> yangTestFiles,
+            final Set<QName> supportedFeatures, final boolean recursiveSearch) throws FileNotFoundException, ReactorException {
+        /*
+         * Current dir "." should be always present implicitly in the list of
+         * directories where dependencies are searched for
+         */
+        if (!yangLibDirs.contains(".")) {
+            yangLibDirs.add(".");
+        }
 
-    static SchemaContext parseYangSources(final Predicate<QName> isFeatureSupported,
-            final StatementParserMode statementParserMode, final File... files) throws ReactorException,
-            FileNotFoundException {
-        final YangStatementSourceImpl [] sources = new YangStatementSourceImpl[files.length];
+        final List<File> libFiles = new ArrayList<>();
+        for (final String yangLibDir : yangLibDirs) {
+            libFiles.addAll(getYangFiles(yangLibDir, recursiveSearch));
+        }
 
-        for (int i = 0; i < files.length; i++) {
-            sources[i] = new YangStatementSourceImpl(new NamedFileInputStream(files[i], files[i].getPath()));
+        final List<File> testFiles = new ArrayList<>();
+        for (final String yangTestFile : yangTestFiles) {
+            testFiles.add(new File(yangTestFile));
         }
 
-        return parseYangSources(isFeatureSupported, statementParserMode, sources);
+        return parseYangSources(supportedFeatures, testFiles, libFiles);
+    }
+
+    static SchemaContext parseYangSources(final Set<QName> supportedFeatures, final List<File> testFiles,
+            final List<File> libFiles) throws FileNotFoundException, ReactorException {
+        final StatementStreamSource[] testSources = getYangStatementSources(testFiles);
+        final StatementStreamSource[] libSources = getYangStatementSources(libFiles);
+        return parseYangSources(testSources, libSources, supportedFeatures);
     }
 
-    static SchemaContext parseYangSources(final Predicate<QName> isFeatureSupported,
-            final StatementParserMode statementParserMode, final YangStatementSourceImpl... sources)
-            throws ReactorException {
-        final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild(
-                statementParserMode, isFeatureSupported);
-        reactor.addSources(sources);
+    static SchemaContext parseYangSources(final StatementStreamSource[] testSources,
+            final StatementStreamSource[] libSources, final Set<QName> supportedFeatures) throws ReactorException {
+        Preconditions.checkArgument(testSources != null && testSources.length > 0, "No yang sources");
+
+        final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
+        reactor.addSources(testSources);
+        reactor.addLibSources(libSources);
+
+        if (supportedFeatures != null) {
+            reactor.setSupportedFeatures(supportedFeatures);
+        }
 
         return reactor.buildEffective();
     }
 
-    static SchemaContext parseYangSources(final List<String> yangDirs, final List<String> yangFiles,
-            final Predicate<QName> isFeatureSupported) throws FileNotFoundException, ReactorException {
-        final List<File> allYangFiles = new ArrayList<>();
-        for (final String yangDir : yangDirs) {
-            allYangFiles.addAll(getYangFiles(yangDir));
+    private static StatementStreamSource[] getYangStatementSources(final List<File> yangFiles)
+            throws FileNotFoundException {
+        final StatementStreamSource[] yangSources = new StatementStreamSource[yangFiles.size()];
+        for (int i = 0; i < yangFiles.size(); i++) {
+            yangSources[i] = new YangStatementSourceImpl(new NamedFileInputStream(yangFiles.get(i), yangFiles.get(i)
+                    .getPath()));
         }
+        return yangSources;
+    }
 
-        for (final String yangFile : yangFiles) {
-            allYangFiles.add(new File(yangFile));
+    private static Collection<File> getYangFiles(final String yangSourcesDirectoryPath, final boolean recursiveSearch)
+            throws FileNotFoundException {
+        final File testSourcesDir = new File(yangSourcesDirectoryPath);
+        if (testSourcesDir == null || !testSourcesDir.isDirectory()) {
+            throw new FileNotFoundException(String.format("%s no such directory", yangSourcesDirectoryPath));
         }
 
-        return parseYangSources(allYangFiles, isFeatureSupported);
+        return recursiveSearch ? searchYangFiles(testSourcesDir) : Arrays.asList(testSourcesDir.listFiles(YANG_FILE_FILTER));
     }
 
-    private static Collection<File> getYangFiles(final String yangSourcesDirectoryPath) {
-        final File testSourcesDir = new File(yangSourcesDirectoryPath);
-        return Arrays.asList(testSourcesDir.listFiles(YANG_FILE_FILTER));
+    private static List<File> searchYangFiles(final File dir) {
+        Preconditions.checkNotNull(dir);
+        Preconditions.checkArgument(dir.isDirectory(), "File %s is not a directory", dir.getPath());
+
+        final List<File> yangFiles = new ArrayList<>();
+        for (final File file : dir.listFiles()) {
+            if (file.isDirectory()) {
+                yangFiles.addAll(searchYangFiles(file));
+            } else if (file.isFile() && file.getName().toLowerCase().endsWith(".yang")) {
+                yangFiles.add(file);
+            }
+        }
+
+        return yangFiles;
     }
 }