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