private void onFeature()

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


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

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

            // 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, infos);
            }

            if (generateSourceJar) {
                final Collection<ArtifactInfo> infos = ctx.getArtifactInfos(regionName, ctx.getConfig().isUseApiDependencies());
                final File sourceJar = createArchive(ctx, apiRegion, ArtifactType.SOURCES, this.apiSourceResources, infos, 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, 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, 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());
    }