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