private void onFeature()

in src/main/java/org/apache/sling/feature/maven/mojos/ApisJarMojo.java [484:733]


    private void onFeature(final Feature feature) throws MojoExecutionException {
        getLog().info(MessageUtils.buffer()
                .a("Creating API JARs for Feature ")
                .strong(feature.getId().toMvnId())
                .a(" ...")
                .toString());

        final RegionSupport regionSupport = new RegionSupport(
                this.getLog(), this.incrementalApis, this.toggleApiOnly, this.includeRegions, this.excludeRegions);
        final ApiRegions regions = regionSupport.getApiRegions(feature);
        if (regions == null) {
            // wrongly configured api regions - skip execution, info is logged already so we
            // can just return
            return;
        }

        // create an output directory per feature
        final File featureDir = new File(mainOutputDir, feature.getId().getArtifactId());
        final ApisJarContext ctx = new ApisJarContext(this.mainOutputDir, feature);
        ctx.getConfig().setLicenseDefaults(this.licenseDefaults);
        ctx.getConfig().setLicenseReport(this.licenseReport);
        ctx.getConfig().setLicenseReportHeader(this.licenseReportHeader);
        ctx.getConfig().setLicenseReportFooter(this.licenseReportFooter);
        ctx.getConfig().setJavadocLinks(this.javadocLinks);
        ctx.getConfig().setJavadocClasspathRemovals(this.javadocClasspathRemovals);
        ctx.getConfig().setJavadocClasspathHighestVersions(this.javadocClasspathHighestVersions);
        ctx.getConfig().setJavadocClasspathTops(this.javadocClasspathTops);
        ctx.getConfig().setApiVersion(this.apiVersion);
        ctx.getConfig().setApiName(this.apiName);
        ctx.getConfig().setJavadocSourceLevel(this.javadocSourceLevel);
        ctx.getConfig().setBundleResourceFolders(this.resourceFolders);
        ctx.getConfig().setBundleResources(this.includeResources);
        ctx.getConfig().setClassifierMappings(apiClassifierMappings);
        ctx.getConfig().setRegionMappings(apiRegionNameMappings);
        ctx.getConfig().setManifestEntries(manifestProperties);
        ctx.getConfig().setEnabledToggles(this.enabledToggles);
        ctx.getConfig().setAdditionalJavadocExtensions(this.javadocAdditionalExtensions);

        ctx.getConfig().setUseApiDependencies(this.useApiDependencies);
        ctx.getConfig().setUseApiDependenciesForJavadoc(this.useApiDependenciesForJavadoc);
        ctx.getConfig().setGenerateJavadocForAllApi(this.generateJavadocForAllApi);
        ctx.getConfig().setDependencyRepositories(this.apiRepositoryUrls);

        ctx.getConfig().logConfiguration(getLog());

        // check additional extension configuration first to fail fast
        if (this.generateJavadocJar) {
            for (final ApiRegion apiRegion : regions.listRegions()) {
                final String regionName = apiRegion.getName();

                final List<Artifact> artifacts = ApisUtil.getAdditionalJavadocArtifacts(ctx, regionName);
                for (final Artifact artifact : artifacts) {
                    if (ctx.getFeature().getBundles().getExact(artifact.getId()) != null) {
                        throw new MojoExecutionException("Additional javadoc artifact is also listed as a bundle "
                                + artifact.getId().toMvnId());
                    }
                }
            }
        }

        // for each bundle included in the feature file and record directories
        for (final Artifact artifact : feature.getBundles()) {
            onArtifact(regions, ctx, regionSupport, artifact);
        }

        final List<ArtifactInfo> additionalInfos = new ArrayList<>();
        if (this.generateJavadocJar) {
            for (final ApiRegion apiRegion : regions.listRegions()) {
                additionalInfos.addAll(getAdditionalJavadocArtifacts(ctx, apiRegion, regionSupport));
            }
        }

        // sources report
        final List<ArtifactInfo> allInfos = new ArrayList<>(ctx.getArtifactInfos());
        allInfos.addAll(additionalInfos);
        final File sourcesReport =
                new File(mainOutputDir, this.project.getArtifactId().concat("-sources-report.txt"));
        ApisUtil.writeSourceReport(
                this.generateSourceJar || this.generateJavadocJar, getLog(), sourcesReport, allInfos);

        boolean hasErrors = false;

        // recollect and package stuff per region
        for (final ApiRegion apiRegion : regions.listRegions()) {
            final String regionName = apiRegion.getName();
            final List<String> report = new ArrayList<>();

            final File regionDir = new File(featureDir, regionName);

            final List<Map.Entry<String, File>> additionalResources = new ArrayList<>();
            if (generateApiJar) {
                final Collection<ArtifactInfo> infos =
                        ctx.getArtifactInfos(regionName, ctx.getConfig().isUseApiDependencies());
                this.runProcessor(ctx, apiRegion, ArtifactType.APIS, this.apiResources, additionalResources, infos);
                final File apiJar = createArchive(
                        ctx, apiRegion, ArtifactType.APIS, this.apiResources, infos, additionalResources, report);
                report(
                        ctx,
                        apiJar,
                        ArtifactType.APIS,
                        regionSupport,
                        apiRegion,
                        ctx.getConfig().isUseApiDependencies(),
                        report,
                        null);
                additionalResources.clear();
            }

            // run processor on sources
            if (generateSourceJar || generateJavadocJar) {
                final List<ArtifactInfo> infos = new ArrayList<>(ctx.getArtifactInfos(regionName, false));
                if (generateJavadocJar) {
                    infos.addAll(getAdditionalJavadocArtifacts(ctx, apiRegion, regionSupport));
                }
                this.runProcessor(ctx, apiRegion, ArtifactType.SOURCES, this.apiResources, additionalResources, infos);
            }

            if (generateSourceJar) {
                final Collection<ArtifactInfo> infos =
                        ctx.getArtifactInfos(regionName, ctx.getConfig().isUseApiDependencies());
                final File sourceJar = createArchive(
                        ctx,
                        apiRegion,
                        ArtifactType.SOURCES,
                        this.apiSourceResources,
                        infos,
                        additionalResources,
                        report);
                report(
                        ctx,
                        sourceJar,
                        ArtifactType.SOURCES,
                        regionSupport,
                        apiRegion,
                        ctx.getConfig().isUseApiDependencies(),
                        report,
                        null);
            }

            if (ctx.getConfig().isUseApiDependencies() && (this.generateApiJar || this.generateSourceJar)) {
                this.createDependenciesFile(ctx, apiRegion);
            }

            if (generateJavadocJar) {
                final File javadocsDir = new File(regionDir, ArtifactType.JAVADOC.getId());
                final ExecutionEnvironmentExtension ext =
                        ExecutionEnvironmentExtension.getExecutionEnvironmentExtension(feature);
                final JavadocLinks links = new JavadocLinks();
                links.calculateLinks(
                        ctx.getConfig().getJavadocLinks(),
                        ctx.getArtifactInfos(regionName, false),
                        ext != null ? ext.getFramework() : null);

                final Collection<ArtifactInfo> infos = generateJavadoc(
                        ctx,
                        regionName,
                        links,
                        javadocsDir,
                        regionSupport,
                        ctx.getConfig().isUseApiDependenciesForJavadoc());
                ctx.setJavadocDir(javadocsDir);
                final File javadocJar = createArchive(
                        ctx, apiRegion, ArtifactType.JAVADOC, this.apiJavadocResources, infos, null, report);
                report(
                        ctx,
                        javadocJar,
                        ArtifactType.JAVADOC,
                        regionSupport,
                        apiRegion,
                        ctx.getConfig().isUseApiDependenciesForJavadoc(),
                        report,
                        links);

                if (ctx.getConfig().isUseApiDependencies() && ctx.getConfig().isGenerateJavadocForAllApi()) {
                    final File javadocsAllDir = new File(regionDir, ArtifactType.JAVADOC_ALL.getId());
                    final Collection<ArtifactInfo> infosForAll =
                            generateJavadoc(ctx, regionName, links, javadocsAllDir, regionSupport, false);
                    ctx.setJavadocDir(javadocsAllDir);
                    final File javadocAllJar = createArchive(
                            ctx,
                            apiRegion,
                            ArtifactType.JAVADOC_ALL,
                            this.apiJavadocResources,
                            infosForAll,
                            null,
                            report);
                    report(ctx, javadocAllJar, ArtifactType.JAVADOC, regionSupport, apiRegion, false, report, links);
                }
            }

            // write dependency report
            final ArtifactId dependencyReportId = this.buildArtifactId(ctx, apiRegion, ArtifactType.DEPENDENCY_REPORT);
            final File dependencyReportFile = new File(mainOutputDir, dependencyReportId.toMvnName());
            if (this.useApiDependencies) {
                final List<String> output = new ArrayList<>();
                for (final ArtifactInfo info : ctx.getArtifactInfos(regionName, false)) {
                    if (!info.isUseAsDependencyPerRegion(regionName)
                            && !"".equals(info.getNotUseAsDependencyPerRegionReason(regionName))) {
                        output.add("- "
                                .concat(info.getId().toMvnId())
                                .concat(" : ")
                                .concat(info.getNotUseAsDependencyPerRegionReason(regionName)));
                    }
                }
                Collections.sort(output);
                if (output.isEmpty()) {
                    output.add("All artifacts are used as a dependency");
                } else {
                    output.add(0, "The following artifacts are not used as a dependency:");
                }
                output.stream().forEach(msg -> getLog().info(msg));
                try {
                    Files.write(dependencyReportFile.toPath(), output);
                } catch (final IOException e) {
                    throw new MojoExecutionException("Unable to write " + dependencyReportFile, e);
                }
            } else {
                if (dependencyReportFile.exists()) {
                    dependencyReportFile.delete();
                }
            }

            // write report
            final ArtifactId reportId = this.buildArtifactId(ctx, apiRegion, ArtifactType.REPORT);
            final File reportFile = new File(mainOutputDir, reportId.toMvnName());
            if (!report.isEmpty()) {
                report.stream().forEach(v -> getLog().info(v));
                try {
                    Files.write(reportFile.toPath(), report);
                } catch (final IOException e) {
                    throw new MojoExecutionException("Unable to write " + reportFile, e);
                }
                hasErrors = true;
            } else {
                if (reportFile.exists()) {
                    reportFile.delete();
                }
            }
        }

        if (hasErrors && this.failOnError) {
            throw new MojoExecutionException("API generation has errors, please see report files for more information");
        }

        getLog().info(MessageUtils.buffer()
                .a("APIs JARs for Feature ")
                .project(feature.getId().toMvnId())
                .a(" succesfully created")
                .toString());
    }