You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2021/01/29 13:38:53 UTC
[sling-org-apache-sling-feature] branch master updated: SLING-10100
: Internal configuration properties are not handled correctly
This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git
The following commit(s) were added to refs/heads/master by this push:
new a42dd5c SLING-10100 : Internal configuration properties are not handled correctly
a42dd5c is described below
commit a42dd5c09650cf9261c8063671325a7de625aa06
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Jan 29 14:38:40 2021 +0100
SLING-10100 : Internal configuration properties are not handled correctly
---
.../org/apache/sling/feature/Configuration.java | 2 +-
.../feature/io/json/ConfigurationJSONReader.java | 22 ++++++++++++++++---
.../sling/feature/io/json/FeatureJSONReader.java | 25 ++++++++++++++++------
.../org/apache/sling/feature/package-info.java | 2 +-
.../feature/io/json/FeatureJSONReaderTest.java | 20 +++++++++++++++++
src/test/resources/features/internal-prop.json | 11 ++++++++++
6 files changed, 70 insertions(+), 12 deletions(-)
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 @@ public class Configuration
/**
* 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.Hashtable;
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 @@ public class ConfigurationJSONReader {
.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;
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 @@ public class FeatureJSONReader {
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 @@ public class FeatureJSONReader {
}
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 @@ public class FeatureJSONReader {
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 static org.junit.Assert.assertTrue;
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 @@ public class FeatureJSONReaderTest {
// 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