This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch issue/SLING-10288
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-analyser.git

commit 847f9ce2171ec743df0311772a16e013f58684aa
Author: Robert Munteanu <romb...@apache.org>
AuthorDate: Fri Jun 7 14:32:44 2024 +0200

    SLING-10288 - checkpoint
---
 .../extensions/AnalyserMetaDataExtension.java      | 13 ++++--
 .../extensions/AnalyserMetaDataHandler.java        | 49 +++++++++++++++++++++-
 2 files changed, 56 insertions(+), 6 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataExtension.java
 
b/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataExtension.java
index 61c574f..40b7172 100644
--- 
a/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataExtension.java
+++ 
b/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataExtension.java
@@ -16,20 +16,22 @@
  */
 package org.apache.sling.feature.analyser.extensions;
 
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.scanner.BundleDescriptor;
+import org.osgi.framework.Constants;
 
 import jakarta.json.Json;
 import jakarta.json.JsonObject;
 import jakarta.json.JsonObjectBuilder;
 import jakarta.json.JsonValue;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.stream.Stream;
 
 public class AnalyserMetaDataExtension {
     public static final String EXTENSION_NAME = "analyser-metadata";
@@ -55,6 +57,9 @@ public class AnalyserMetaDataExtension {
 
     private AnalyserMetaDataExtension(JsonObject json) {
         for (Map.Entry<String, JsonValue> entry : json.entrySet()) {
+            if ( entry.getKey().equals(Constants.SYSTEM_BUNDLE_SYMBOLICNAME) ) 
{
+                continue; // not used for now
+            }
             ArtifactId id = ArtifactId.fromMvnId(entry.getKey());
             JsonObject headers = entry.getValue().asJsonObject();
             if (headers.containsKey("manifest")) {
diff --git 
a/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataHandler.java
 
b/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataHandler.java
index a218ad6..7e7e031 100644
--- 
a/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/analyser/extensions/AnalyserMetaDataHandler.java
@@ -23,9 +23,12 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
+import java.util.ServiceLoader;
 import java.util.jar.JarFile;
 
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.ExecutionEnvironmentExtension;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionState;
 import org.apache.sling.feature.ExtensionType;
@@ -33,6 +36,10 @@ import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.builder.HandlerContext;
 import org.apache.sling.feature.builder.PostProcessHandler;
 import org.apache.sling.feature.io.IOUtils;
+import org.apache.sling.feature.scanner.BundleDescriptor;
+import org.apache.sling.feature.scanner.spi.FrameworkScanner;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,16 +55,21 @@ public class AnalyserMetaDataHandler implements 
PostProcessHandler {
 
     @Override
     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[] frameworkDefinitionHolder = new JsonObject[1];
             extensionJSONStructure.entrySet().forEach(
                     entry -> {
                         if (entry.getKey().contains("*")) {
                             wildcardEntries.put(entry.getKey(), 
entry.getValue());
+                        } else if 
(entry.getKey().equals(Constants.SYSTEM_BUNDLE_SYMBOLICNAME)) {
+                            frameworkDefinitionHolder[0] = 
entry.getValue().asJsonObject();
                         } else {
                             directEntries.put(entry.getKey(), 
entry.getValue());
                         }
@@ -83,6 +95,39 @@ public class AnalyserMetaDataHandler implements 
PostProcessHandler {
                              }
                         )
             );;
+            
+            if (frameworkDefinitionHolder[0] != null) {
+                JsonObject v = frameworkDefinitionHolder[0];
+                // TODO - add test
+                // TODO - finalise contract
+                // TODO - make use of the information in the Analyser, if 
present
+                FrameworkScanner scanner = 
ServiceLoader.load(FrameworkScanner.class).iterator().next();
+                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.");
+                            
+                        }
+                        BundleDescriptor fw = scanner.scan(frameworkId, 
feature.getFrameworkProperties(), handlerContext.getArtifactProvider());
+                        JsonObjectBuilder wrapper = 
Json.createObjectBuilder(v);
+                        wrapper.add(Constants.PROVIDE_CAPABILITY, 
fw.getCapabilities().toString());
+                        wrapper.add(Constants.EXPORT_PACKAGE, 
fw.getExportedPackages().toString());
+                        result.add(Constants.SYSTEM_BUNDLE_SYMBOLICNAME, 
wrapper);
+                    } else {
+                        LOG.warn("No execution environment found, not creating 
framework capabilities");
+                    }
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+            }
 
             feature.getExtensions().remove(extension);
 
@@ -92,7 +137,7 @@ public class AnalyserMetaDataHandler implements 
PostProcessHandler {
             feature.getExtensions().add(newEx);
         }
     }
-
+ 
     private boolean noManifest(JsonObject object) {
         return manifest(object, null) && !object.getBoolean("no-manifest", 
false);
     }
@@ -104,7 +149,7 @@ public class AnalyserMetaDataHandler implements 
PostProcessHandler {
     private boolean manifest(JsonObject object, Object match) {
         return object.get(MANIFEST_KEY) == match;
     }
-
+    
     private Optional<JsonObject> findFirst(Map<String, JsonValue> 
directValues, Map<String, JsonValue> wildcardValues, ArtifactId bundle) {
         JsonValue direct = directValues.get(bundle.toMvnId());
         if (direct != null && direct != JsonValue.NULL) {

Reply via email to