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": {

Reply via email to