You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2018/09/17 11:44:45 UTC

[sling-org-apache-sling-feature-io] 01/01: SLING-7829: Change the includes to be include and from a list to a single (optional) field

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

pauls pushed a commit to branch issues/SLING-7829
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-io.git

commit d4f830586bbce497821a78a1e81e23dcba61175e
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Mon Sep 17 13:44:28 2018 +0200

    SLING-7829: Change the includes to be include and from a list to a single (optional) field
---
 .../sling/feature/io/json/FeatureJSONReader.java   | 156 ++++++++++-----------
 .../sling/feature/io/json/FeatureJSONWriter.java   |  98 +++++++------
 .../sling/feature/io/json/JSONConstants.java       |   4 +-
 .../feature/io/json/FeatureJSONWriterTest.java     |  15 ++
 src/test/resources/features/test.json              |   4 +-
 5 files changed, 140 insertions(+), 137 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java b/src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java
index 0a9eb89..27d4e29 100644
--- a/src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java
+++ b/src/main/java/org/apache/sling/feature/io/json/FeatureJSONReader.java
@@ -33,7 +33,6 @@ import org.apache.felix.utils.resource.RequirementImpl;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.Include;
-import org.apache.sling.feature.builder.FeatureBuilder;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 
@@ -154,104 +153,95 @@ public class FeatureJSONReader extends JSONReaderBase {
     }
 
     private void readIncludes(final Map<String, Object> map) throws IOException {
-        if ( map.containsKey(JSONConstants.FEATURE_INCLUDES)) {
-            final Object includesObj = map.get(JSONConstants.FEATURE_INCLUDES);
-            checkType(JSONConstants.FEATURE_INCLUDES, includesObj, List.class);
+        if ( map.containsKey(JSONConstants.FEATURE_INCLUDE)) {
+            final Object includeObj = map.get(JSONConstants.FEATURE_INCLUDE);
+            checkType(JSONConstants.FEATURE_INCLUDE, includeObj, Map.class, String.class);
 
             @SuppressWarnings("unchecked")
-            final List<Object> includes = (List<Object>)includesObj;
-            for(final Object inc : includes) {
-                checkType("Include", inc, Map.class, String.class);
-                final Include include;
-                if ( inc instanceof String ) {
-                    final ArtifactId id = ArtifactId.parse(inc.toString());
-                    include = new Include(id);
-                } else {
-                    @SuppressWarnings("unchecked")
-                    final Map<String, Object> obj = (Map<String, Object>) inc;
-                    if ( !obj.containsKey(JSONConstants.ARTIFACT_ID) ) {
-                        throw new IOException(exceptionPrefix + " include is missing required artifact id");
-                    }
-                    checkType("Include " + JSONConstants.ARTIFACT_ID, obj.get(JSONConstants.ARTIFACT_ID), String.class);
-                    final ArtifactId id = ArtifactId.parse(obj.get(JSONConstants.ARTIFACT_ID).toString());
-                    include = new Include(id);
+            final Include include;
+            if ( includeObj instanceof String ) {
+                final ArtifactId id = ArtifactId.parse(includeObj.toString());
+                include = new Include(id);
+            } else {
+                @SuppressWarnings("unchecked")
+                final Map<String, Object> obj = (Map<String, Object>) includeObj;
+                if ( !obj.containsKey(JSONConstants.ARTIFACT_ID) ) {
+                    throw new IOException(exceptionPrefix + " include is missing required artifact id");
+                }
+                checkType("Include " + JSONConstants.ARTIFACT_ID, obj.get(JSONConstants.ARTIFACT_ID), String.class);
+                final ArtifactId id = ArtifactId.parse(obj.get(JSONConstants.ARTIFACT_ID).toString());
+                include = new Include(id);
 
-                    if ( obj.containsKey(JSONConstants.INCLUDE_REMOVALS) ) {
-                        checkType("Include removals", obj.get(JSONConstants.INCLUDE_REMOVALS), Map.class);
+                if ( obj.containsKey(JSONConstants.INCLUDE_REMOVALS) ) {
+                    checkType("Include removals", obj.get(JSONConstants.INCLUDE_REMOVALS), Map.class);
+                    @SuppressWarnings("unchecked")
+                    final Map<String, Object> removalObj = (Map<String, Object>) obj.get(JSONConstants.INCLUDE_REMOVALS);
+                    if ( removalObj.containsKey(JSONConstants.FEATURE_BUNDLES) ) {
+                        checkType("Include removal bundles", removalObj.get(JSONConstants.FEATURE_BUNDLES), List.class);
                         @SuppressWarnings("unchecked")
-                        final Map<String, Object> removalObj = (Map<String, Object>) obj.get(JSONConstants.INCLUDE_REMOVALS);
-                        if ( removalObj.containsKey(JSONConstants.FEATURE_BUNDLES) ) {
-                            checkType("Include removal bundles", removalObj.get(JSONConstants.FEATURE_BUNDLES), List.class);
-                            @SuppressWarnings("unchecked")
-                            final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_BUNDLES);
-                            for(final Object val : list) {
-                                checkType("Include removal bundles", val, String.class);
-                                if ( val.toString().startsWith("#")) {
-                                    continue;
-                                }
-                                include.getBundleRemovals().add(ArtifactId.parse(val.toString()));
+                        final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_BUNDLES);
+                        for(final Object val : list) {
+                            checkType("Include removal bundles", val, String.class);
+                            if ( val.toString().startsWith("#")) {
+                                continue;
                             }
+                            include.getBundleRemovals().add(ArtifactId.parse(val.toString()));
                         }
-                        if ( removalObj.containsKey(JSONConstants.FEATURE_CONFIGURATIONS) ) {
-                            checkType("Include removal configuration", removalObj.get(JSONConstants.FEATURE_CONFIGURATIONS), List.class);
-                            @SuppressWarnings("unchecked")
-                            final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_CONFIGURATIONS);
-                            for(final Object val : list) {
-                                checkType("Include removal configuration", val, String.class);
-                                include.getConfigurationRemovals().add(val.toString());
-                            }
+                    }
+                    if ( removalObj.containsKey(JSONConstants.FEATURE_CONFIGURATIONS) ) {
+                        checkType("Include removal configuration", removalObj.get(JSONConstants.FEATURE_CONFIGURATIONS), List.class);
+                        @SuppressWarnings("unchecked")
+                        final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_CONFIGURATIONS);
+                        for(final Object val : list) {
+                            checkType("Include removal configuration", val, String.class);
+                            include.getConfigurationRemovals().add(val.toString());
                         }
-                        if ( removalObj.containsKey(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES) ) {
-                            checkType("Include removal framework properties", removalObj.get(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES), List.class);
-                            @SuppressWarnings("unchecked")
-                            final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES);
-                            for(final Object val : list) {
-                                checkType("Include removal framework properties", val, String.class);
-                                include.getFrameworkPropertiesRemovals().add(val.toString());
-                            }
+                    }
+                    if ( removalObj.containsKey(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES) ) {
+                        checkType("Include removal framework properties", removalObj.get(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES), List.class);
+                        @SuppressWarnings("unchecked")
+                        final List<Object> list = (List<Object>)removalObj.get(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES);
+                        for(final Object val : list) {
+                            checkType("Include removal framework properties", val, String.class);
+                            include.getFrameworkPropertiesRemovals().add(val.toString());
                         }
-                        if ( removalObj.containsKey(JSONConstants.INCLUDE_EXTENSION_REMOVALS) ) {
-                            checkType("Include removal extensions", removalObj.get(JSONConstants.INCLUDE_EXTENSION_REMOVALS), List.class);
-                            @SuppressWarnings("unchecked")
-                            final List<Object> list = (List<Object>)removalObj.get(JSONConstants.INCLUDE_EXTENSION_REMOVALS);
-                            for(final Object val : list) {
-                                checkType("Include removal extension", val, String.class, Map.class);
-                                if ( val instanceof String ) {
-                                    if ( val.toString().startsWith("#")) {
-                                        continue;
-                                    }
-                                    include.getExtensionRemovals().add(val.toString());
-                                } else {
+                    }
+                    if ( removalObj.containsKey(JSONConstants.INCLUDE_EXTENSION_REMOVALS) ) {
+                        checkType("Include removal extensions", removalObj.get(JSONConstants.INCLUDE_EXTENSION_REMOVALS), List.class);
+                        @SuppressWarnings("unchecked")
+                        final List<Object> list = (List<Object>)removalObj.get(JSONConstants.INCLUDE_EXTENSION_REMOVALS);
+                        for(final Object val : list) {
+                            checkType("Include removal extension", val, String.class, Map.class);
+                            if ( val instanceof String ) {
+                                if ( val.toString().startsWith("#")) {
+                                    continue;
+                                }
+                                include.getExtensionRemovals().add(val.toString());
+                            } else {
+                                @SuppressWarnings("unchecked")
+                                final Map<String, Object> removalMap = (Map<String, Object>)val;
+                                final Object nameObj = removalMap.get("name");
+                                checkType("Include removal extension", nameObj, String.class);
+                                if ( removalMap.containsKey("artifacts") ) {
+                                    checkType("Include removal extension artifacts", removalMap.get("artifacts"), List.class);
                                     @SuppressWarnings("unchecked")
-                                    final Map<String, Object> removalMap = (Map<String, Object>)val;
-                                    final Object nameObj = removalMap.get("name");
-                                    checkType("Include removal extension", nameObj, String.class);
-                                    if ( removalMap.containsKey("artifacts") ) {
-                                        checkType("Include removal extension artifacts", removalMap.get("artifacts"), List.class);
-                                        @SuppressWarnings("unchecked")
-                                        final List<Object> artifactList = (List<Object>)removalMap.get("artifacts");
-                                        final List<ArtifactId> ids = new ArrayList<>();
-                                        for(final Object aid : artifactList) {
-                                            checkType("Include removal extension artifact", aid, String.class);
-                                            ids.add(ArtifactId.parse(aid.toString()));
-                                        }
-                                        include.getArtifactExtensionRemovals().put(nameObj.toString(), ids);
-                                    } else {
-                                        include.getExtensionRemovals().add(nameObj.toString());
+                                    final List<Object> artifactList = (List<Object>)removalMap.get("artifacts");
+                                    final List<ArtifactId> ids = new ArrayList<>();
+                                    for(final Object aid : artifactList) {
+                                        checkType("Include removal extension artifact", aid, String.class);
+                                        ids.add(ArtifactId.parse(aid.toString()));
                                     }
+                                    include.getArtifactExtensionRemovals().put(nameObj.toString(), ids);
+                                } else {
+                                    include.getExtensionRemovals().add(nameObj.toString());
                                 }
                             }
                         }
-
-                    }
-                }
-                for(final Include i : feature.getIncludes()) {
-                    if ( i.getId().equals(include.getId()) ) {
-                        throw new IOException(exceptionPrefix + "Duplicate include of " + include.getId());
                     }
+
                 }
-                feature.getIncludes().add(include);
             }
+            feature.setInclude(include);
         }
     }
 
diff --git a/src/main/java/org/apache/sling/feature/io/json/FeatureJSONWriter.java b/src/main/java/org/apache/sling/feature/io/json/FeatureJSONWriter.java
index 6d1776b..0f400ee 100644
--- a/src/main/java/org/apache/sling/feature/io/json/FeatureJSONWriter.java
+++ b/src/main/java/org/apache/sling/feature/io/json/FeatureJSONWriter.java
@@ -76,63 +76,61 @@ public class FeatureJSONWriter extends JSONWriterBase {
         // variables
         writeVariables(ob, feature.getVariables());
 
-        // includes
-        if ( !feature.getIncludes().isEmpty() ) {
-            JsonArrayBuilder incArray = Json.createArrayBuilder();
-            for(final Include inc : feature.getIncludes()) {
-                if ( inc.getArtifactExtensionRemovals().isEmpty()
-                     && inc.getBundleRemovals().isEmpty()
-                     && inc.getConfigurationRemovals().isEmpty()
-                     && inc.getFrameworkPropertiesRemovals().isEmpty() ) {
-                    incArray.add(inc.getId().toMvnId());
-                } else {
-                    JsonObjectBuilder includeObj = Json.createObjectBuilder();
-                    includeObj.add(JSONConstants.ARTIFACT_ID, inc.getId().toMvnId());
-
-                    JsonObjectBuilder removalsObj = Json.createObjectBuilder();
-                    if ( !inc.getArtifactExtensionRemovals().isEmpty()
-                         || inc.getExtensionRemovals().isEmpty() ) {
-                        JsonArrayBuilder extRemovals = Json.createArrayBuilder();
-                        for(final String id : inc.getExtensionRemovals()) {
-                            extRemovals.add(id);
-                        }
-                        for(final Map.Entry<String, List<ArtifactId>> entry : inc.getArtifactExtensionRemovals().entrySet()) {
-                            JsonArrayBuilder ab = Json.createArrayBuilder();
-                            for(final ArtifactId id : entry.getValue()) {
-                                ab.add(id.toMvnId());
-                            }
-                            extRemovals.add(Json.createObjectBuilder().add(entry.getKey(),
-                                    ab.build()).build());
-                        }
-                        removalsObj.add(JSONConstants.INCLUDE_EXTENSION_REMOVALS, extRemovals.build());
+        // include
+        if ( feature.getInclude() != null ) {
+            final Include inc = feature.getInclude();
+            if ( inc.getArtifactExtensionRemovals().isEmpty()
+                 && inc.getBundleRemovals().isEmpty()
+                 && inc.getConfigurationRemovals().isEmpty()
+                 && inc.getFrameworkPropertiesRemovals().isEmpty() ) {
+
+                ob.add(JSONConstants.FEATURE_INCLUDE, inc.getId().toMvnId());
+            } else {
+                JsonObjectBuilder includeObj = Json.createObjectBuilder();
+                includeObj.add(JSONConstants.ARTIFACT_ID, inc.getId().toMvnId());
+
+                JsonObjectBuilder removalsObj = Json.createObjectBuilder();
+                if ( !inc.getArtifactExtensionRemovals().isEmpty()
+                     || inc.getExtensionRemovals().isEmpty() ) {
+                    JsonArrayBuilder extRemovals = Json.createArrayBuilder();
+                    for(final String id : inc.getExtensionRemovals()) {
+                        extRemovals.add(id);
                     }
-                    if ( !inc.getConfigurationRemovals().isEmpty() ) {
-                        JsonArrayBuilder cfgRemovals = Json.createArrayBuilder();
-                        for(final String val : inc.getConfigurationRemovals()) {
-                            cfgRemovals.add(val);
+                    for(final Map.Entry<String, List<ArtifactId>> entry : inc.getArtifactExtensionRemovals().entrySet()) {
+                        JsonArrayBuilder ab = Json.createArrayBuilder();
+                        for(final ArtifactId id : entry.getValue()) {
+                            ab.add(id.toMvnId());
                         }
-                        removalsObj.add(JSONConstants.FEATURE_CONFIGURATIONS, cfgRemovals.build());
+                        extRemovals.add(Json.createObjectBuilder().add(entry.getKey(),
+                                ab.build()).build());
                     }
-                    if ( !inc.getBundleRemovals().isEmpty() ) {
-                        JsonArrayBuilder bundleRemovals = Json.createArrayBuilder();
-                        for(final ArtifactId val : inc.getBundleRemovals()) {
-                            bundleRemovals.add(val.toMvnId());
-                        }
-                        removalsObj.add(JSONConstants.FEATURE_BUNDLES, bundleRemovals.build());
+                    removalsObj.add(JSONConstants.INCLUDE_EXTENSION_REMOVALS, extRemovals.build());
+                }
+                if ( !inc.getConfigurationRemovals().isEmpty() ) {
+                    JsonArrayBuilder cfgRemovals = Json.createArrayBuilder();
+                    for(final String val : inc.getConfigurationRemovals()) {
+                        cfgRemovals.add(val);
                     }
-                    if ( !inc.getFrameworkPropertiesRemovals().isEmpty() ) {
-                        JsonArrayBuilder propRemovals = Json.createArrayBuilder();
-                        for(final String val : inc.getFrameworkPropertiesRemovals()) {
-                            propRemovals.add(val);
-                        }
-                        removalsObj.add(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES, propRemovals.build());
+                    removalsObj.add(JSONConstants.FEATURE_CONFIGURATIONS, cfgRemovals.build());
+                }
+                if ( !inc.getBundleRemovals().isEmpty() ) {
+                    JsonArrayBuilder bundleRemovals = Json.createArrayBuilder();
+                    for(final ArtifactId val : inc.getBundleRemovals()) {
+                        bundleRemovals.add(val.toMvnId());
                     }
-                    includeObj.add(JSONConstants.INCLUDE_REMOVALS, removalsObj.build());
-
-                    incArray.add(includeObj.build());
+                    removalsObj.add(JSONConstants.FEATURE_BUNDLES, bundleRemovals.build());
+                }
+                if ( !inc.getFrameworkPropertiesRemovals().isEmpty() ) {
+                    JsonArrayBuilder propRemovals = Json.createArrayBuilder();
+                    for(final String val : inc.getFrameworkPropertiesRemovals()) {
+                        propRemovals.add(val);
+                    }
+                    removalsObj.add(JSONConstants.FEATURE_FRAMEWORK_PROPERTIES, propRemovals.build());
                 }
+                includeObj.add(JSONConstants.INCLUDE_REMOVALS, removalsObj.build());
+
+
             }
-            ob.add(JSONConstants.FEATURE_INCLUDES, incArray.build());
         }
 
         // requirements
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONConstants.java b/src/main/java/org/apache/sling/feature/io/json/JSONConstants.java
index 6aeef1a..01ab0e0 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONConstants.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONConstants.java
@@ -33,7 +33,7 @@ public abstract class JSONConstants {
 
     static final String FEATURE_CONFIGURATIONS = "configurations";
 
-    static final String FEATURE_INCLUDES = "includes";
+    static final String FEATURE_INCLUDE = "include";
 
     static final String FEATURE_REQUIREMENTS = "requirements";
 
@@ -55,7 +55,7 @@ public abstract class JSONConstants {
             FEATURE_BUNDLES,
             FEATURE_FRAMEWORK_PROPERTIES,
             FEATURE_CONFIGURATIONS,
-            FEATURE_INCLUDES,
+        FEATURE_INCLUDE,
             FEATURE_REQUIREMENTS,
             FEATURE_CAPABILITIES,
             FEATURE_TITLE,
diff --git a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONWriterTest.java b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONWriterTest.java
index 3cf8618..314925a 100644
--- a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONWriterTest.java
+++ b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONWriterTest.java
@@ -24,6 +24,7 @@ import java.io.StringWriter;
 import java.util.Arrays;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class FeatureJSONWriterTest {
 
@@ -71,4 +72,18 @@ public class FeatureJSONWriterTest {
         ArtifactsExtensions.testReadArtifactsExtensions(rf);
     }
 
+    @Test public void testIncludeWriteRead() throws Exception {
+        final Feature f = U.readFeature("test");
+        assertNotNull(f.getInclude());
+
+        final Feature rf;
+        try ( final StringWriter writer = new StringWriter() ) {
+            FeatureJSONWriter.write(writer, f);
+            try ( final StringReader reader = new StringReader(writer.toString()) ) {
+                rf = FeatureJSONReader.read(reader, null);
+            }
+        }
+        assertEquals(f.getInclude().getId(), rf.getInclude().getId());
+    }
+
 }
diff --git a/src/test/resources/features/test.json b/src/test/resources/features/test.json
index 8ae346c..d5d10df 100644
--- a/src/test/resources/features/test.json
+++ b/src/test/resources/features/test.json
@@ -2,7 +2,7 @@
     "id" : "org.apache.sling/test-feature/1.1",
     "description": "The feature description",
 
-    "includes" : [
+    "include" :
          {
              "id" : "org.apache.sling/sling/9",
              "removals" : {
@@ -14,7 +14,7 @@
                  ]
              }
          }
-    ],
+    ,
     "requirements" : [
           {
               "namespace" : "osgi.contract",