SLING-10100 : Internal configuration properties are not handled correctly
diff --git a/src/main/java/org/apache/sling/feature/Configuration.java b/src/main/java/org/apache/sling/feature/Configuration.java
index 1ec54eb..f8fbe80 100644
--- a/src/main/java/org/apache/sling/feature/Configuration.java
+++ b/src/main/java/org/apache/sling/feature/Configuration.java
@@ -49,7 +49,7 @@
/**
* Prefix for special properties which are not configuration properties.
*/
- public static final String PROP_PREFIX = CONFIGURATOR_PREFIX + "feature:";
+ public static final String PROP_PREFIX = CONFIGURATOR_PREFIX + "feature-";
/**
* This optional configuration property stores the artifact id (mvn id) of the
diff --git a/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONReader.java b/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONReader.java
index 4ab0db8..ace7a36 100644
--- a/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONReader.java
+++ b/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONReader.java
@@ -22,6 +22,7 @@
import java.util.Map;
import org.apache.felix.cm.json.ConfigurationReader;
+import org.apache.felix.cm.json.ConfigurationReader.ConfiguratorPropertyHandler;
import org.apache.felix.cm.json.ConfigurationResource;
import org.apache.sling.feature.Configuration;
import org.apache.sling.feature.Configurations;
@@ -57,14 +58,29 @@
.buildReader()
.withIdentifier(location)
.verifyAsBundleResource(true)
- .build(reader);
+ .withConfiguratorPropertyHandler(new ConfiguratorPropertyHandler() {
+
+ @Override
+ public void handleConfiguratorProperty(final String pid, final String property, final Object value) {
+ Configuration cfg = result.getConfiguration(pid);
+ if ( cfg == null ) {
+ cfg = new Configuration(pid);
+ result.add(cfg);
+ }
+ cfg.getProperties().put(Configuration.CONFIGURATOR_PREFIX.concat(property), value);
+ }
+ })
+ .build(reader);
final ConfigurationResource rsrc = cfgReader.readConfigurationResource();
for(Map.Entry<String, Hashtable<String, Object>> entry : rsrc.getConfigurations().entrySet() ) {
- final Configuration cf = new Configuration(entry.getKey());
+ Configuration cf = result.getConfiguration(entry.getKey());
+ if ( cf == null ) {
+ cf = new Configuration(entry.getKey());
+ result.add(cf);
+ }
for(final Map.Entry<String, Object> prop : entry.getValue().entrySet()) {
cf.getProperties().put(prop.getKey(), prop.getValue());
}
- result.add(cf);
}
return result;
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 2d3339b..6eb0421 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
@@ -37,6 +37,7 @@
import javax.json.JsonValue.ValueType;
import org.apache.felix.cm.json.ConfigurationReader;
+import org.apache.felix.cm.json.ConfigurationReader.ConfiguratorPropertyHandler;
import org.apache.felix.cm.json.ConfigurationResource;
import org.apache.felix.utils.resource.CapabilityImpl;
import org.apache.felix.utils.resource.RequirementImpl;
@@ -227,6 +228,18 @@
final ConfigurationReader reader = org.apache.felix.cm.json.Configurations.buildReader()
.verifyAsBundleResource(true)
.withIdentifier(this.location)
+ .withConfiguratorPropertyHandler(new ConfiguratorPropertyHandler(){
+
+ @Override
+ public void handleConfiguratorProperty(final String pid, final String property, final Object value) {
+ Configuration cfg = container.getConfiguration(pid);
+ if ( cfg == null ) {
+ cfg = new Configuration(pid);
+ container.add(cfg);
+ }
+ cfg.getProperties().put(Configuration.CONFIGURATOR_PREFIX.concat(property), value);
+ }
+ })
.build(json);
final ConfigurationResource rsrc = reader.readConfigurationResource();
if ( !reader.getIgnoredErrors().isEmpty() ) {
@@ -240,7 +253,11 @@
}
for(final Map.Entry<String, Hashtable<String, Object>> c : rsrc.getConfigurations().entrySet()) {
- final Configuration config = new Configuration(c.getKey());
+ Configuration config = container.getConfiguration(c.getKey());
+ if ( config == null ) {
+ config = new Configuration(c.getKey());
+ container.add(config);
+ }
for(final Map.Entry<String, Object> prop : c.getValue().entrySet()) {
config.getProperties().put(prop.getKey(), prop.getValue());
@@ -251,12 +268,6 @@
if ( artifact != null ) {
config.getProperties().put(Configuration.PROP_ARTIFACT_ID, artifact.getId().toMvnId());
}
- for(final Configuration current : container) {
- if ( current.equals(config) ) {
- throw new IOException(exceptionPrefix.concat("Duplicate configuration ").concat(config.getPid()));
- }
- }
- container.add(config);
}
}
diff --git a/src/main/java/org/apache/sling/feature/package-info.java b/src/main/java/org/apache/sling/feature/package-info.java
index 4ac3d3a..2eb78b4 100644
--- a/src/main/java/org/apache/sling/feature/package-info.java
+++ b/src/main/java/org/apache/sling/feature/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("1.7.0")
+@org.osgi.annotation.versioning.Version("1.7.1")
package org.apache.sling.feature;
diff --git a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
index e461970..b4dc7c2 100644
--- a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
+++ b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.sling.feature.io.json;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -24,6 +25,7 @@
import java.io.IOException;
import java.util.Arrays;
+import java.util.List;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Bundles;
@@ -138,4 +140,22 @@
// This is expected to throw an exception since the same key is defined twice
U.readFeature("test4");
}
+
+ @Test
+ public void testInternalConfigurationProperties() throws Exception {
+ final Feature f = U.readFeature("internal-prop");
+ final Configuration c = f.getConfigurations().get(0);
+ assertEquals(1, c.getConfigurationProperties().size());
+ assertEquals(5L, c.getConfigurationProperties().get("foo"));
+
+ assertEquals(3, c.getProperties().size());
+ assertEquals(5L, c.getProperties().get("foo"));
+ assertEquals(7L, c.getProperties().get(Configuration.PROP_PREFIX.concat("number")));
+ assertArrayEquals(new String[] {"org.apache.sling/test-feature/1.1"},
+ (String[])c.getProperties().get(Configuration.PROP_FEATURE_ORIGINS));
+
+ final List<ArtifactId> origins = c.getFeatureOrigins();
+ assertEquals(1, origins.size());
+ assertEquals(ArtifactId.parse("org.apache.sling/test-feature/1.1"), origins.get(0));
+ }
}
diff --git a/src/test/resources/features/internal-prop.json b/src/test/resources/features/internal-prop.json
new file mode 100644
index 0000000..a901a18
--- /dev/null
+++ b/src/test/resources/features/internal-prop.json
@@ -0,0 +1,11 @@
+{
+ "id" : "org.apache.sling/test-feature/1.1",
+
+ "configurations" : {
+ "my.pid" : {
+ "foo" : 5,
+ ":configurator:feature-origins" : ["org.apache.sling/test-feature/1.1"],
+ ":configurator:feature-number" : 7
+ }
+ }
+}
\ No newline at end of file