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 9958526  SLING-9248 : Feature model variables are not resolved for 
array elements
9958526 is described below

commit 9958526ed2b81f0a7fe7b5156903f6d86e936d16
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed Jul 1 09:14:16 2020 +0200

    SLING-9248 : Feature model variables are not resolved for array elements
---
 .../apache/sling/feature/builder/FeatureBuilder.java | 20 ++++++++++++--------
 .../sling/feature/builder/FeatureBuilderTest.java    | 15 +++++++++++++++
 2 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java 
b/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
index d84481e..56012d0 100644
--- a/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
+++ b/src/main/java/org/apache/sling/feature/builder/FeatureBuilder.java
@@ -231,12 +231,20 @@ public abstract class FeatureBuilder {
                final Set<String> keys = new 
HashSet<>(Collections.list(cfg.getProperties().keys()));
                for(final String key : keys) {
                 final Object value = cfg.getProperties().get(key);
-                cfg.getProperties().put(key, replaceVariables(value, 
additionalVariables, feature));
+                if ( value instanceof String ) {
+                    cfg.getProperties().put(key, 
replaceVariables((String)value, additionalVariables, feature));
+                } else if ( value instanceof String[]) {
+                    final String[] values = (String[]) value;
+                    for(int i=0;i<values.length;i++) {
+                        values[i] = replaceVariables(values[i], 
additionalVariables, feature);
+                    }
+                    cfg.getProperties().put(key, values);
+                }
             }
         }
         for(final Map.Entry<String, String> entry : 
feature.getFrameworkProperties().entrySet()) {
             // the  value is always a string
-            entry.setValue((String)replaceVariables(entry.getValue(), 
additionalVariables, feature));
+            entry.setValue(replaceVariables(entry.getValue(), 
additionalVariables, feature));
         }
     }
 
@@ -252,12 +260,8 @@ public abstract class FeatureBuilder {
      * @param feature The feature containing variables
      * @return The value with the variables substituted.
      */
-    static Object replaceVariables(final Object value, final 
Map<String,String> additionalVariables, final Feature feature) {
-        if (!(value instanceof String)) {
-            return value;
-        }
-
-        final String textWithVars = (String) value;
+    static String replaceVariables(final String value, final 
Map<String,String> additionalVariables, final Feature feature) {
+        final String textWithVars = value;
 
         final Matcher m = VARIABLE_PATTERN.matcher(textWithVars.toString());
         final StringBuffer sb = new StringBuffer();
diff --git 
a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java 
b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
index 4d0e5bd..11ab945 100644
--- a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
+++ b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
@@ -1112,6 +1112,21 @@ public class FeatureBuilderTest {
         assertEquals("line2\nline3", 
f.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT).getText());
     }
 
+    @Test public void testReplaceVarInArray() {
+        final Feature f = new Feature(ArtifactId.parse("g/a/1"));
+        f.getVariables().put("key", "hello");
+        final Configuration c = new Configuration("pid");
+        c.getProperties().put("prop", new String[] {"${key}", "world"});
+        f.getConfigurations().add(c);
+
+        FeatureBuilder.resolveVariables(f, null);
+
+        String[] result = (String[]) c.getProperties().get("prop");
+        assertEquals(2, result.length);
+        assertEquals("hello", result[0]);
+        assertEquals("world", result[1]);
+    }
+
     private static class MatchingRequirementImpl extends RequirementImpl 
implements MatchingRequirement {
 
         public MatchingRequirementImpl(Resource res, String ns, Map<String, 
String> dirs, Map<String, Object> attrs) {

Reply via email to