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