protected void execute()

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