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