public void postProcess()

in src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataHandler.java [62:152]


    public void postProcess(HandlerContext handlerContext, Feature feature, Extension extension) {

        if (AnalyserMetaDataExtension.EXTENSION_NAME.equals(extension.getName())) {
            LOG.debug("Handling analyser-metadata extension {}", extension);
            JsonObject extensionJSONStructure = extension.getJSONStructure().asJsonObject();
            JsonObjectBuilder result = Json.createObjectBuilder();
            Map<String, JsonValue> directEntries = new HashMap<>();
            Map<String, JsonValue> wildcardEntries = new LinkedHashMap<>();
            JsonObject[] systemBundleHolder = new JsonObject[1];
            extensionJSONStructure.entrySet().forEach(entry -> {
                if (entry.getKey().contains("*")) {
                    wildcardEntries.put(entry.getKey(), entry.getValue());
                } else if (entry.getKey().equals(AnalyserMetaDataExtension.SYSTEM_BUNDLE_KEY)) {
                    systemBundleHolder[0] = entry.getValue().asJsonObject();
                } else {
                    directEntries.put(entry.getKey(), entry.getValue());
                }
            });

            feature.getBundles().stream().forEach(bundle -> findFirst(directEntries, wildcardEntries, bundle.getId())
                    .ifPresent(json -> {
                        if (nullManifest(json)) {
                            JsonObjectBuilder wrapper = Json.createObjectBuilder(json);
                            wrapper.remove(AnalyserMetaDataExtension.MANIFEST_KEY);
                            result.add(bundle.getId().toMvnId(), wrapper);
                        } else if (noManifest(json)) {
                            JsonObjectBuilder wrapper = Json.createObjectBuilder(json);
                            getManifest(handlerContext, bundle.getId())
                                    .ifPresent(
                                            manifest -> wrapper.add(AnalyserMetaDataExtension.MANIFEST_KEY, manifest));
                            result.add(bundle.getId().toMvnId(), wrapper);
                        } else {
                            result.add(bundle.getId().toMvnId(), json);
                        }
                    }));

            // only process if we have an empty system bundle definition
            if (JsonValue.EMPTY_JSON_OBJECT.equals(systemBundleHolder[0])) {
                JsonObject systemBundle = systemBundleHolder[0];
                try {
                    ExecutionEnvironmentExtension executionEnv =
                            ExecutionEnvironmentExtension.getExecutionEnvironmentExtension(feature);
                    if (executionEnv != null) {
                        ArtifactId frameworkId = executionEnv.getFramework().getId();
                        if (executionEnv.getJavaVersion() == null) {
                            LOG.warn(
                                    "No java version set in execution environment extension, skipping version validation");
                        } else {
                            Version requiredJavaVersion = executionEnv.getJavaVersion();
                            Version currentJavaVersion = new Version(SystemUtils.JAVA_VERSION);

                            if (requiredJavaVersion.getMajor() != currentJavaVersion.getMajor())
                                throw new IllegalStateException(
                                        "Execution environment requires Java " + requiredJavaVersion.getMajor()
                                                + ", but running on " + currentJavaVersion.getMajor() + ". Aborting.");
                        }
                        FrameworkScanner scanner = ServiceLoader.load(FrameworkScanner.class)
                                .iterator()
                                .next();

                        BundleDescriptor fw = scanner.scan(
                                frameworkId, feature.getFrameworkProperties(), handlerContext.getArtifactProvider());
                        JsonObjectBuilder wrapper = Json.createObjectBuilder(systemBundle);
                        JsonObjectBuilder manifest = Json.createObjectBuilder();
                        manifest.add(Constants.PROVIDE_CAPABILITY, capabilitiesToString(fw.getCapabilities()));
                        manifest.add(Constants.EXPORT_PACKAGE, exportedPackagesToString(fw.getExportedPackages()));
                        wrapper.add(AnalyserMetaDataExtension.MANIFEST_KEY, manifest);
                        wrapper.add(AnalyserMetaDataExtension.ARTIFACT_ID_KEY, frameworkId.toMvnId());
                        wrapper.add(
                                AnalyserMetaDataExtension.SCANNER_CACHE_KEY,
                                SystemBundleDescriptor.createCacheKey(frameworkId, feature.getFrameworkProperties()));
                        result.add(AnalyserMetaDataExtension.SYSTEM_BUNDLE_KEY, wrapper);
                    } else {
                        LOG.warn("No execution environment found, not creating framework capabilities");
                    }
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            } else if (systemBundleHolder[0] != null) {
                // preserve the existing system bundle information
                result.add(AnalyserMetaDataExtension.SYSTEM_BUNDLE_KEY, systemBundleHolder[0]);
            }

            feature.getExtensions().remove(extension);

            // Mark the extension as optional now that we've processed it.
            Extension newEx = new Extension(ExtensionType.JSON, extension.getName(), ExtensionState.OPTIONAL);
            newEx.setJSONStructure(result.build());
            feature.getExtensions().add(newEx);
        }
    }