Search in sources :

Example 1 with YangParserConfiguration

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);
}
Also used : YangTextSchemaSource(org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource) BuildContext(org.sonatype.plexus.build.incremental.BuildContext) YangParserConfiguration(org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration) YangSyntaxErrorException(org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException) Stopwatch(com.google.common.base.Stopwatch) LoggerFactory(org.slf4j.LoggerFactory) YangParserFactory(org.opendaylight.yangtools.yang.parser.api.YangParserFactory) ArrayList(java.util.ArrayList) Builder(com.google.common.collect.ImmutableSet.Builder) ImmutableList(com.google.common.collect.ImmutableList) MavenProject(org.apache.maven.project.MavenProject) Objects.requireNonNull(java.util.Objects.requireNonNull) Map(java.util.Map) DefaultBuildContext(org.sonatype.plexus.build.incremental.DefaultBuildContext) CodeGeneratorArg(org.opendaylight.yangtools.yang2sources.plugin.ConfigArg.CodeGeneratorArg) Path(java.nio.file.Path) FileGeneratorFactory(org.opendaylight.yangtools.plugin.generator.api.FileGeneratorFactory) YangParserException(org.opendaylight.yangtools.yang.parser.api.YangParserException) ImmutableSet(com.google.common.collect.ImmutableSet) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) Files(java.nio.file.Files) TextToIRTransformer(org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer) Collection(java.util.Collection) Throwables(com.google.common.base.Throwables) Set(java.util.Set) IOException(java.io.IOException) ServiceLoader(java.util.ServiceLoader) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) Maps(com.google.common.collect.Maps) Collectors(java.util.stream.Collectors) File(java.io.File) Preconditions.checkState(com.google.common.base.Preconditions.checkState) MojoFailureException(org.apache.maven.plugin.MojoFailureException) List(java.util.List) IRSchemaSource(org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRSchemaSource) YangConstants(org.opendaylight.yangtools.yang.common.YangConstants) Entry(java.util.Map.Entry) Optional(java.util.Optional) FileGeneratorException(org.opendaylight.yangtools.plugin.generator.api.FileGeneratorException) VisibleForTesting(com.google.common.annotations.VisibleForTesting) YangParser(org.opendaylight.yangtools.yang.parser.api.YangParser) ArrayList(java.util.ArrayList) Stopwatch(com.google.common.base.Stopwatch) Entry(java.util.Map.Entry) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) YangTextSchemaSource(org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource) MojoFailureException(org.apache.maven.plugin.MojoFailureException) IOException(java.io.IOException) YangParserConfiguration(org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration) YangParserException(org.opendaylight.yangtools.yang.parser.api.YangParserException) File(java.io.File)

Aggregations

VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Preconditions.checkState (com.google.common.base.Preconditions.checkState)1 Stopwatch (com.google.common.base.Stopwatch)1 Throwables (com.google.common.base.Throwables)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableSet (com.google.common.collect.ImmutableSet)1 Builder (com.google.common.collect.ImmutableSet.Builder)1 Maps (com.google.common.collect.Maps)1 File (java.io.File)1 IOException (java.io.IOException)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 Objects.requireNonNull (java.util.Objects.requireNonNull)1 Optional (java.util.Optional)1