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;
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;
}
};
- 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;
}
}