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 <[email protected]>
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.
*/
[email protected]("1.7.0")
[email protected]("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