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 2021/07/02 14:17:36 UTC

[sling-whiteboard] branch master updated: Support writing feature extensions

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

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new c9fd29f  Support writing feature extensions
c9fd29f is described below

commit c9fd29f8f8bfc324b533e9844e47976d9675ca35
Author: David Bosschaert <da...@apache.org>
AuthorDate: Fri Jul 2 15:16:56 2021 +0100

    Support writing feature extensions
---
 .../feature/osgi/impl/FeatureBuilderImpl.java      |  8 ++--
 .../feature/osgi/impl/FeatureServiceImpl.java      | 51 ++++++++++++++++++++++
 .../feature/osgi/impl/FeatureServiceImplTest.java  | 10 ++++-
 .../src/test/resources/features/test-exfeat1.json  |  4 +-
 4 files changed, 66 insertions(+), 7 deletions(-)

diff --git a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureBuilderImpl.java b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureBuilderImpl.java
index 28f19e6..151ff99 100644
--- a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureBuilderImpl.java
+++ b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureBuilderImpl.java
@@ -19,7 +19,7 @@ package org.apache.sling.feature.osgi.impl;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -46,9 +46,9 @@ class FeatureBuilderImpl implements FeatureBuilder {
 
     private final List<FeatureBundle> bundles = new ArrayList<>();
     private final List<String> categories = new ArrayList<>();
-    private final Map<String,FeatureConfiguration> configurations = new HashMap<>();
-    private final Map<String,FeatureExtension> extensions = new HashMap<>();
-    private final Map<String,String> variables = new HashMap<>();
+    private final Map<String,FeatureConfiguration> configurations = new LinkedHashMap<>();
+    private final Map<String,FeatureExtension> extensions = new LinkedHashMap<>();
+    private final Map<String,String> variables = new LinkedHashMap<>();
 
     FeatureBuilderImpl(ID id) {
         this.id = id;
diff --git a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureServiceImpl.java b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureServiceImpl.java
index 2fc8132..34c428b 100644
--- a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureServiceImpl.java
+++ b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/FeatureServiceImpl.java
@@ -18,6 +18,7 @@ package org.apache.sling.feature.osgi.impl;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringReader;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -28,6 +29,7 @@ import java.util.Map;
 
 import javax.json.Json;
 import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
 import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
@@ -40,6 +42,7 @@ import org.apache.felix.cm.json.impl.JsonSupport;
 import org.apache.felix.cm.json.impl.TypeConverter;
 import org.osgi.service.feature.BuilderFactory;
 import org.osgi.service.feature.Feature;
+import org.osgi.service.feature.FeatureArtifact;
 import org.osgi.service.feature.FeatureArtifactBuilder;
 import org.osgi.service.feature.FeatureBuilder;
 import org.osgi.service.feature.FeatureBundle;
@@ -293,6 +296,17 @@ public class FeatureServiceImpl implements FeatureService {
     	feature.getVendor().ifPresent(v -> attrs.put("vendor", v));
     	
 		JsonObjectBuilder json = Json.createObjectBuilder(attrs);
+
+		JsonObject extensions = getExtensions(feature);
+		if (extensions != null) {
+			json.add("extensions", extensions);
+		}
+		
+		// TODO add bundles
+		// TODO add configs
+		// TODO add variables
+		// TODO add frameworkproperties
+		
 		JsonObject fo = json.build();
 		
 		JsonGeneratorFactory gf = Json.createGeneratorFactory(Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true));
@@ -300,4 +314,41 @@ public class FeatureServiceImpl implements FeatureService {
 			gr.write(fo);
 		}
     }
+
+	private JsonObject getExtensions(Feature feature) {
+		Map<String, FeatureExtension> extensions = feature.getExtensions();
+		if (extensions == null || extensions.size() == 0)
+			return null;
+		
+		JsonObjectBuilder ob = Json.createObjectBuilder();
+		
+		for (Map.Entry<String,FeatureExtension> entry : extensions.entrySet()) {
+			FeatureExtension extVal = entry.getValue();
+
+			JsonObjectBuilder vb = Json.createObjectBuilder();
+			vb.add("kind", extVal.getKind().toString().toLowerCase());
+			
+			switch (extVal.getType()) {
+			case TEXT:
+				vb.add("text", Json.createArrayBuilder(extVal.getText()).build());
+				break;
+			case ARTIFACTS:
+				JsonArrayBuilder arr = Json.createArrayBuilder();
+				for (FeatureArtifact art : extVal.getArtifacts()) {
+					Map<String,Object> attrs = new LinkedHashMap<>();
+					attrs.put("id", art.getID().toString());
+					attrs.putAll(art.getMetadata());
+					arr.add(Json.createObjectBuilder(attrs)).build();
+				}
+				
+				vb.add("artifacts", arr.build());
+				break;
+			case JSON:
+				vb.add("json", Json.createReader(new StringReader(extVal.getJSON())).readValue());
+				break;
+			}
+			ob.add(entry.getKey(), vb.build());
+		}
+		return ob.build();
+	}
 }
diff --git a/osgi-featuremodel/src/test/java/org/apache/sling/feature/osgi/impl/FeatureServiceImplTest.java b/osgi-featuremodel/src/test/java/org/apache/sling/feature/osgi/impl/FeatureServiceImplTest.java
index 9d09fd2..2568081 100644
--- a/osgi-featuremodel/src/test/java/org/apache/sling/feature/osgi/impl/FeatureServiceImplTest.java
+++ b/osgi-featuremodel/src/test/java/org/apache/sling/feature/osgi/impl/FeatureServiceImplTest.java
@@ -151,8 +151,9 @@ public class FeatureServiceImplTest {
     @Test
     public void testFeatureWithExtension() throws Exception {
         URL res = getClass().getResource("/features/test-exfeat1.json");
+        Feature f;
         try (Reader r = new InputStreamReader(res.openStream())) {
-            Feature f = features.readFeature(r);
+            f = features.readFeature(r);
             
             Map<String, FeatureExtension> extensions = f.getExtensions();
             assertEquals(3, extensions.size());
@@ -182,6 +183,13 @@ public class FeatureServiceImplTest {
             assertEquals(FeatureExtension.Type.JSON, jsonEx.getType());
             assertEquals("{\"foo\":[1,2,3]}", jsonEx.getJSON());
         }    	
+        
+        StringWriter sw = new StringWriter();
+        features.writeFeature(f, sw);
+        
+        String expected = new String(res.openStream().readAllBytes()).replaceAll("\\s","");
+        String actual = sw.toString().replaceAll("\\s","");
+        assertEquals(expected, actual);
     }
     
     @Test
diff --git a/osgi-featuremodel/src/test/resources/features/test-exfeat1.json b/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
index a0e0977..7112392 100644
--- a/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
+++ b/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
@@ -8,6 +8,7 @@
         	] 
         },
         "my-art-ex": {
+            "kind": "mandatory", 
             "artifacts": [
             	{
 					"id": "g:a:1",
@@ -15,8 +16,7 @@
 				}, {
 					"id": "g:a:zip:foobar:2"
 				}
-			],
-            "kind": "mandatory" 
+			]
         },
         "my-json-ex": {
            "kind": "transient",