in src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegions.java [43:86]
protected void execute(ApiRegions apiRegions, AnalyserTaskContext ctx) throws Exception {
// for each bundle, get the Export-Package and process the packages
FeatureDescriptor featureDescriptor = ctx.getFeatureDescriptor();
for (BundleDescriptor bundleDescriptor : featureDescriptor.getBundleDescriptors()) {
for (PackageInfo packageInfo : bundleDescriptor.getExportedPackages()) {
String exportedPackage = packageInfo.getName();
// use the Sieve technique: remove bundle exported packages from the api-regions
for (final ApiRegion region : apiRegions.listRegions()) {
ApiExport export = region.getExportByName(exportedPackage);
if (export != null) {
region.remove(export);
}
}
}
}
boolean isEmpty = true;
for (final ApiRegion region : apiRegions.listRegions()) {
if (!region.listExports().isEmpty()) {
isEmpty = false;
break;
}
}
// final evaluation: if the Sieve is not empty, not all declared packages are exported by bundles of the same feature
if (!isEmpty) {
// track a single error for each region
for (ApiRegion region : apiRegions.listRegions()) {
if (!region.listExports().isEmpty()) {
Formatter formatter = new Formatter();
formatter.format("Region '%s' defined in feature '%s' declares %s package%s which %s not exported by any bundle:%n",
region.getName(),
ctx.getFeature().getId(),
region.listExports().size(), getExtension(region.listExports(), "", "s"),
getExtension(region.listExports(), "is", "are"));
region.listExports().forEach(api -> formatter.format(" * %s%n", api.getName()));
ctx.reportError(formatter.toString());
formatter.close();
}
}
}
}