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",