Merge pull request #3 from apache/issues/SLING-7829
SLING-7829: Change the includes to be include and from a list to a si…
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.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 @@
}
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);
+ 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_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.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_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 {
+ 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 @@
// 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());
+ // include
+ if ( feature.getInclude() != null ) {
+ final Include inc = feature.getInclude();
+ if ( inc.getArtifactExtensionRemovals().isEmpty()
+ && inc.getBundleRemovals().isEmpty()
+ && inc.getConfigurationRemovals().isEmpty()
+ && inc.getFrameworkPropertiesRemovals().isEmpty() ) {
- 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());
- }
- if ( !inc.getConfigurationRemovals().isEmpty() ) {
- JsonArrayBuilder cfgRemovals = Json.createArrayBuilder();
- for(final String val : inc.getConfigurationRemovals()) {
- cfgRemovals.add(val);
- }
- 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());
- }
- 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_INCLUDE, inc.getId().toMvnId());
+ } else {
+ JsonObjectBuilder includeObj = Json.createObjectBuilder();
+ includeObj.add(JSONConstants.ARTIFACT_ID, inc.getId().toMvnId());
- incArray.add(includeObj.build());
+ 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());
}
+ if ( !inc.getConfigurationRemovals().isEmpty() ) {
+ JsonArrayBuilder cfgRemovals = Json.createArrayBuilder();
+ for(final String val : inc.getConfigurationRemovals()) {
+ cfgRemovals.add(val);
+ }
+ 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());
+ }
+ 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 @@
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 @@
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.util.Arrays;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
public class FeatureJSONWriterTest {
@@ -71,4 +72,18 @@
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",