use of org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration in project yangtools by opendaylight.
the class YangToSourcesProcessor method conditionalExecute.
void conditionalExecute(final boolean skip) throws MojoExecutionException, MojoFailureException {
/*
* Collect all files which affect YANG context. This includes all
* files in current project and optionally any jars/files in the
* dependencies.
*/
final List<File> yangFilesInProject;
try {
yangFilesInProject = listFiles(yangFilesRootDir, excludedFiles);
} catch (IOException e) {
throw new MojoFailureException("Failed to list project files", e);
}
if (yangFilesInProject.isEmpty()) {
// No files to process, skip.
LOG.info("{} No input files found", LOG_PREFIX);
return;
}
// We need to instantiate all code generators to determine required import resolution mode
final List<GeneratorTaskFactory> codeGenerators = instantiateGenerators();
if (codeGenerators.isEmpty()) {
LOG.warn("{} No code generators provided", LOG_PREFIX);
return;
}
final Set<YangParserConfiguration> parserConfigs = codeGenerators.stream().map(GeneratorTaskFactory::parserConfig).collect(Collectors.toUnmodifiableSet());
LOG.info("{} Inspecting {}", LOG_PREFIX, yangFilesRootDir);
final Collection<File> allFiles = new ArrayList<>(yangFilesInProject);
final Collection<ScannedDependency> dependencies;
if (inspectDependencies) {
dependencies = new ArrayList<>();
final Stopwatch watch = Stopwatch.createStarted();
try {
ScannedDependency.scanDependencies(project).forEach(dep -> {
allFiles.add(dep.file());
dependencies.add(dep);
});
} catch (IOException e) {
LOG.error("{} Failed to scan dependencies", LOG_PREFIX, e);
throw new MojoExecutionException(LOG_PREFIX + " Failed to scan dependencies ", e);
}
LOG.info("{} Found {} dependencies in {}", LOG_PREFIX, dependencies.size(), watch);
} else {
dependencies = ImmutableList.of();
}
/*
* Check if any of the listed files changed. If no changes occurred, simply return empty, which indicates
* end of execution.
*/
if (!allFiles.stream().anyMatch(buildContext::hasDelta)) {
LOG.info("{} None of {} input files changed", LOG_PREFIX, allFiles.size());
return;
}
final Stopwatch watch = Stopwatch.createStarted();
final List<Entry<YangTextSchemaSource, IRSchemaSource>> parsed = yangFilesInProject.parallelStream().map(file -> {
final YangTextSchemaSource textSource = YangTextSchemaSource.forPath(file.toPath());
try {
return Map.entry(textSource, TextToIRTransformer.transformText(textSource));
} catch (YangSyntaxErrorException | IOException e) {
throw new IllegalArgumentException("Failed to parse " + file, e);
}
}).collect(Collectors.toList());
LOG.debug("Found project files: {}", yangFilesInProject);
LOG.info("{} Project model files found: {} in {}", LOG_PREFIX, yangFilesInProject.size(), watch);
// FIXME: store these files into state, so that we can verify/clean up
final Builder<File> files = ImmutableSet.builder();
for (YangParserConfiguration parserConfig : parserConfigs) {
final Optional<ProcessorModuleReactor> optReactor = createReactor(yangFilesInProject, parserConfig, dependencies, parsed);
if (optReactor.isPresent()) {
final ProcessorModuleReactor reactor = optReactor.orElseThrow();
if (!skip) {
final Stopwatch sw = Stopwatch.createStarted();
final ContextHolder holder;
try {
holder = reactor.toContext();
} catch (YangParserException e) {
throw new MojoFailureException("Failed to process reactor " + reactor, e);
} catch (IOException e) {
throw new MojoExecutionException("Failed to read reactor " + reactor, e);
}
LOG.info("{} {} YANG models processed in {}", LOG_PREFIX, holder.getContext().getModules().size(), sw);
files.addAll(generateSources(holder, codeGenerators, parserConfig));
} else {
LOG.info("{} Skipping YANG code generation because property yang.skip is true", LOG_PREFIX);
}
// FIXME: this is not right: we should be generating the models exactly once!
// add META_INF/yang
final Collection<YangTextSchemaSource> models = reactor.getModelsInProject();
try {
yangProvider.addYangsToMetaInf(project, models);
} catch (IOException e) {
throw new MojoExecutionException("Failed write model files for " + models, e);
}
}
}
// add META_INF/services
File generatedServicesDir = new GeneratedDirectories(project).getYangServicesDir();
YangProvider.setResource(generatedServicesDir, project);
LOG.debug("{} Yang services files from: {} marked as resources: {}", LOG_PREFIX, generatedServicesDir, META_INF_YANG_SERVICES_STRING_JAR);
}
Aggregations