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 <[email protected]> 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",
