You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2018/07/12 10:04:29 UTC

[sling-org-apache-sling-feature-applicationbuilder] 01/01: Annotate bundles and api-regions extension with from-feature

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

davidb pushed a commit to branch features-service
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-applicationbuilder.git

commit 1dd611498527dc63d9a532e7b2f75a50ca994043
Author: David Bosschaert <bo...@adobe.com>
AuthorDate: Thu Jul 12 12:04:07 2018 +0200

    Annotate bundles and api-regions extension with from-feature
---
 .../feature/applicationbuilder/impl/Main.java      | 73 +++++++++++++++++++---
 1 file changed, 65 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java b/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
index 4a2d9f4..9939d64 100644
--- a/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
@@ -24,29 +24,39 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.sling.feature.Application;
+import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.builder.ApplicationBuilder;
 import org.apache.sling.feature.builder.BuilderContext;
 import org.apache.sling.feature.builder.FeatureProvider;
-import org.apache.sling.feature.io.ArtifactHandler;
 import org.apache.sling.feature.io.ArtifactManager;
 import org.apache.sling.feature.io.ArtifactManagerConfig;
 import org.apache.sling.feature.io.IOUtils;
 import org.apache.sling.feature.io.json.ApplicationJSONWriter;
 import org.apache.sling.feature.io.json.FeatureJSONReader;
+import org.apache.sling.feature.io.json.FeatureJSONReader.SubstituteVariables;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Stream;
 
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
+
 public class Main {
 
     private static Logger LOGGER;
@@ -224,6 +234,7 @@ public class Main {
             try
             {
                 final Feature f = IOUtils.getFeature(initFile, artifactManager, FeatureJSONReader.SubstituteVariables.RESOLVE);
+                addFromFeatureToBundlesAndRegions(f);
                 features.add(f);
             }
             catch (Exception ex)
@@ -232,6 +243,21 @@ public class Main {
             }
         }
 
+        /* */
+        // For each bundle in each feature mark where it came from 'from-feature'
+        // For each api-region extension in each feature mark it's 'from-feature'
+        /*
+        for (Feature f : features) {
+            System.out.println("*** feature: " + f.getId().toMvnId());
+            for (Artifact b : f.getBundles()) {
+                b.getMetadata().put("from-feature", f.getId().toMvnId());
+            }
+        }
+        */
+
+        // remove the from-feature stuff in the ApplicationBuilder.assemble()
+        /* */
+
         Collections.sort(features);
 
         app = ApplicationBuilder.assemble(app, new BuilderContext(new FeatureProvider() {
@@ -239,12 +265,9 @@ public class Main {
             @Override
             public Feature provide(final ArtifactId id) {
                 try {
-                    final ArtifactHandler handler = artifactManager.getArtifactHandler(id.toMvnUrl());
-                    try (final FileReader r = new FileReader(handler.getFile())) {
-                        final Feature f = FeatureJSONReader.read(r, handler.getUrl(), FeatureJSONReader.SubstituteVariables.RESOLVE);
-                        return f;
-                    }
-
+                    Feature f = IOUtils.getFeature(id.toMvnUrl(), artifactManager, SubstituteVariables.RESOLVE);
+                    addFromFeatureToBundlesAndRegions(f);
+                    return f;
                 } catch (final IOException e) {
                     // ignore
                 }
@@ -261,6 +284,40 @@ public class Main {
         return app;
     }
 
+    private static void addFromFeatureToBundlesAndRegions(Feature f) {
+        for (Artifact bundle : f.getBundles()) {
+            bundle.getMetadata().put("from-feature", f.getId().toMvnId());
+        }
+
+        for (Extension e : f.getExtensions()) {
+            if ("api-regions".equals(e.getName())) {
+                JsonArray ja = Json.createReader(new StringReader(e.getJSON())).readArray();
+                JsonArray newArray = addToJSONMaps(ja, "from-feature", f.getId().toMvnId());
+                e.setJSON(newArray.toString());
+            }
+        }
+    }
+
+    private static JsonArray addToJSONMaps(JsonArray ja, String key, String value) {
+        JsonArrayBuilder ab = Json.createArrayBuilder();
+
+        for (JsonValue jv : ja) {
+            if (jv instanceof JsonObject) {
+                JsonObject jo = (JsonObject) jv;
+                JsonObjectBuilder ob = Json.createObjectBuilder();
+                for (Map.Entry<String, JsonValue> entry : jo.entrySet()) {
+                    ob.add(entry.getKey(), entry.getValue());
+                }
+                ob.add(key, value);
+                ab.add(ob.build());
+            } else {
+                ab.add(jv);
+            }
+        }
+
+        return ab.build();
+    }
+
     private static Application buildApplication(final Application app) {
         final org.apache.sling.feature.Artifact a = new org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0"));
         a.getMetadata().put(org.apache.sling.feature.Artifact.KEY_START_ORDER, "1");