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 a02a467 Parse extensions
a02a467 is described below
commit a02a46708a2c8194182c372da576a54b0cad68ff
Author: David Bosschaert <[email protected]>
AuthorDate: Fri Jul 2 14:16:27 2021 +0100
Parse extensions
---
.../feature/osgi/impl/ExtensionBuilderImpl.java | 80 +++++++---------------
.../feature/osgi/impl/FeatureServiceImpl.java | 59 +++++++++++++---
.../feature/osgi/impl/FeatureServiceImplTest.java | 38 ++++++++++
.../src/test/resources/features/test-exfeat1.json | 13 +++-
4 files changed, 123 insertions(+), 67 deletions(-)
diff --git
a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/ExtensionBuilderImpl.java
b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/ExtensionBuilderImpl.java
index b3c63a1..d52d298 100644
---
a/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/ExtensionBuilderImpl.java
+++
b/osgi-featuremodel/src/main/java/org/apache/sling/feature/osgi/impl/ExtensionBuilderImpl.java
@@ -37,6 +37,7 @@ class ExtensionBuilderImpl implements FeatureExtensionBuilder
{
private final Kind kind;
private final List<String> content = new ArrayList<>();
+ private final List<FeatureArtifact> artifacts = new ArrayList<>();
ExtensionBuilderImpl(String name, Type type, Kind kind) {
this.name = name;
@@ -64,47 +65,17 @@ class ExtensionBuilderImpl implements
FeatureExtensionBuilder {
}
@Override
- public FeatureExtensionBuilder addArtifact(ID id) {
+ public FeatureExtensionBuilder addArtifact(FeatureArtifact art) {
if (type != Type.ARTIFACTS)
throw new IllegalStateException("Cannot add artifacts to extension
of type " + type);
- StringBuilder aid = new StringBuilder();
- aid.append(id.getGroupId());
- aid.append(':');
- aid.append(id.getArtifactId());
- aid.append(':');
- aid.append(id.getVersion());
-
- id.getType().ifPresent(
- t -> {
- aid.append(':');
- aid.append(t);
-
- id.getClassifier().ifPresent(
- c -> {
- aid.append(':');
- aid.append(2);
- }
- );
- });
- aid.append('\n');
- content.add(aid.toString());
+ artifacts.add(art);
return this;
}
-
- @Override
- public FeatureExtensionBuilder addArtifact(String groupId, String
artifactId, String version) {
- return addArtifact(groupId, artifactId, version, null, null);
- }
-
- @Override
- public FeatureExtensionBuilder addArtifact(String groupId, String
artifactId, String version, String at, String classifier) {
- return addArtifact(FEATURE_SERVICE.getID(groupId, artifactId, version,
at, classifier));
- }
@Override
public FeatureExtension build() {
- return new ExtensionImpl(name, type, kind, content);
+ return new ExtensionImpl(name, type, kind, content, artifacts);
}
private static class ExtensionImpl implements FeatureExtension {
@@ -112,12 +83,14 @@ class ExtensionBuilderImpl implements
FeatureExtensionBuilder {
private final Type type;
private final Kind kind;
private final List<String> content;
+ private final List<FeatureArtifact> artifacts;
- private ExtensionImpl(String name, Type type, Kind kind, List<String>
content) {
+ private ExtensionImpl(String name, Type type, Kind kind, List<String>
content, List<FeatureArtifact> artifacts) {
this.name = name;
this.type = type;
this.kind = kind;
this.content = Collections.unmodifiableList(content);
+ this.artifacts = Collections.unmodifiableList(artifacts);
}
public String getName() {
@@ -150,32 +123,31 @@ class ExtensionBuilderImpl implements
FeatureExtensionBuilder {
}
public List<FeatureArtifact> getArtifacts() {
- List<FeatureArtifact> res = new ArrayList<>();
-
- for (String s : content) {
- res.add(FEATURE_SERVICE.getBuilderFactory().newArtifactBuilder(
-
FEATURE_SERVICE.getIDfromMavenCoordinates(s)).build());
- }
-
- return res;
- }
+ if (type != Type.ARTIFACTS)
+ throw new IllegalStateException("Extension is not of type Text
" + type);
- @Override
- public int hashCode() {
- return Objects.hash(content, name, type);
+ return artifacts;
}
@Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (!(obj instanceof ExtensionImpl))
- return false;
- ExtensionImpl other = (ExtensionImpl) obj;
- return Objects.equals(content, other.content) &&
Objects.equals(name, other.name) && type == other.type;
- }
+ public int hashCode() {
+ return Objects.hash(artifacts, content, kind, name,
type);
+ }
@Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExtensionImpl other = (ExtensionImpl) obj;
+ return Objects.equals(artifacts, other.artifacts) &&
Objects.equals(content, other.content)
+ && kind == other.kind &&
Objects.equals(name, other.name) && type == other.type;
+ }
+
+ @Override
public String toString() {
return "ExtensionImpl [name=" + name + ", type=" + type + "]";
}
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 226a400..2fc8132 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
@@ -33,8 +33,6 @@ import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonString;
import javax.json.JsonValue;
-import javax.json.JsonWriter;
-import javax.json.JsonWriterFactory;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonGeneratorFactory;
@@ -42,6 +40,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.FeatureArtifactBuilder;
import org.osgi.service.feature.FeatureBuilder;
import org.osgi.service.feature.FeatureBundle;
import org.osgi.service.feature.FeatureBundleBuilder;
@@ -222,17 +221,55 @@ public class FeatureServiceImpl implements FeatureService
{
switch (type) {
case TEXT:
- builder.addText(exData.getString("text"));
+ exData.getJsonArray("text")
+ .stream()
+ .filter(jv -> jv.getValueType() ==
JsonValue.ValueType.STRING)
+ .map(jv -> ((JsonString) jv).getString())
+ .forEach(builder::addText);
+
break;
case ARTIFACTS:
- JsonArray ja2 = exData.getJsonArray("artifacts");
- for (JsonValue jv : ja2) {
- if (jv.getValueType() == JsonValue.ValueType.STRING) {
- String id = ((JsonString) jv).getString();
- builder.addArtifact(getIDfromMavenCoordinates(id));
- }
- }
- break;
+ exData.getJsonArray("artifacts")
+ .stream()
+ .filter(jv -> jv.getValueType() ==
JsonValue.ValueType.OBJECT)
+ .map(jv -> (JsonObject) jv)
+ .forEach(md -> {
+ Map<String, JsonValue> v = new HashMap<>(md);
+ JsonString idVal = (JsonString) v.remove("id");
+
+ ID id =
getIDfromMavenCoordinates(idVal.getString());
+ FeatureArtifactBuilder fab =
builderFactory.newArtifactBuilder(id);
+
+ for (Map.Entry<String,JsonValue> mde :
v.entrySet()) {
+ JsonValue val = mde.getValue();
+ switch (val.getValueType()) {
+ case STRING:
+ fab.addMetadata(mde.getKey(),
((JsonString) val).getString());
+ break;
+ case FALSE:
+ fab.addMetadata(mde.getKey(),
false);
+ break;
+ case TRUE:
+ fab.addMetadata(mde.getKey(),
true);
+ break;
+ case NUMBER:
+ JsonNumber num = (JsonNumber)
val;
+ if
(num.toString().contains(".")) {
+
fab.addMetadata(mde.getKey(), num.doubleValue());
+ } else {
+
fab.addMetadata(mde.getKey(), num.longValue());
+ }
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ }
+
+ builder.addArtifact(fab.build());
+ });
+
+ break;
case JSON:
builder.setJSON(exData.getJsonObject("json").toString());
break;
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 cbefb72..9d09fd2 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
@@ -39,9 +39,11 @@ import org.junit.Before;
import org.junit.Test;
import org.osgi.service.feature.BuilderFactory;
import org.osgi.service.feature.Feature;
+import org.osgi.service.feature.FeatureArtifact;
import org.osgi.service.feature.FeatureBuilder;
import org.osgi.service.feature.FeatureBundle;
import org.osgi.service.feature.FeatureConfiguration;
+import org.osgi.service.feature.FeatureExtension;
public class FeatureServiceImplTest {
FeatureServiceImpl features;
@@ -147,6 +149,42 @@ public class FeatureServiceImplTest {
}
@Test
+ public void testFeatureWithExtension() throws Exception {
+ URL res = getClass().getResource("/features/test-exfeat1.json");
+ try (Reader r = new InputStreamReader(res.openStream())) {
+ Feature f = features.readFeature(r);
+
+ Map<String, FeatureExtension> extensions = f.getExtensions();
+ assertEquals(3, extensions.size());
+
+ FeatureExtension textEx = extensions.get("my-text-ex");
+ assertEquals(FeatureExtension.Kind.OPTIONAL, textEx.getKind());
+ assertEquals(FeatureExtension.Type.TEXT, textEx.getType());
+ assertEquals(List.of("ABC", "DEF"), textEx.getText());
+
+ FeatureExtension artEx = extensions.get("my-art-ex");
+ assertEquals(FeatureExtension.Kind.MANDATORY, artEx.getKind());
+ assertEquals(FeatureExtension.Type.ARTIFACTS, artEx.getType());
+ List<FeatureArtifact> arts = artEx.getArtifacts();
+ assertEquals(2, arts.size());
+
+ FeatureArtifact art1 = arts.get(0);
+ assertEquals("g:a:1", art1.getID().toString());
+ assertEquals(1, art1.getMetadata().size());
+ assertEquals(12345L, art1.getMetadata().get("my-md"));
+
+ FeatureArtifact art2 = arts.get(1);
+ assertEquals("g:a:zip:foobar:2", art2.getID().toString());
+ assertEquals(0, art2.getMetadata().size());
+
+ FeatureExtension jsonEx = extensions.get("my-json-ex");
+ assertEquals(FeatureExtension.Kind.TRANSIENT, jsonEx.getKind());
+ assertEquals(FeatureExtension.Type.JSON, jsonEx.getType());
+ assertEquals("{\"foo\":[1,2,3]}", jsonEx.getJSON());
+ }
+ }
+
+ @Test
public void testCreateFeatureBundle() {
BuilderFactory factory = features.getBuilderFactory();
diff --git a/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
b/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
index 6213d87..a0e0977 100644
--- a/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
+++ b/osgi-featuremodel/src/test/resources/features/test-exfeat1.json
@@ -3,10 +3,19 @@
"extensions" : {
"my-text-ex": {
"kind": "optional",
- "text": "ABC"
+ "text": [
+ "ABC", "DEF"
+ ]
},
"my-art-ex": {
- "artifacts": ["g:a:1", "g:a:2"],
+ "artifacts": [
+ {
+ "id": "g:a:1",
+ "my-md": 12345
+ }, {
+ "id": "g:a:zip:foobar:2"
+ }
+ ],
"kind": "mandatory"
},
"my-json-ex": {