You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2022/08/09 09:47:12 UTC

[felix-dev] branch master updated: FELIX-6560 : Interpolation of embedded arrays does not work

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/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new 6603d69977 FELIX-6560 : Interpolation of embedded arrays does not work
6603d69977 is described below

commit 6603d69977f4cea8b9b9dd2faf5d320906b43368
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Tue Aug 9 11:47:05 2022 +0200

    FELIX-6560 : Interpolation of embedded arrays does not work
---
 .../InterpolationConfigurationPlugin.java          | 22 +++++++++++++++++-----
 .../InterpolationConfigurationPluginTest.java      | 14 ++++++++++++++
 .../plugin/interpolation/InterpolatorTest.java     |  1 -
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java b/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java
index f2e7b67372..30435f407a 100644
--- a/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java
+++ b/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java
@@ -20,6 +20,7 @@ import static java.util.stream.Collectors.toList;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Array;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.util.ArrayList;
@@ -136,19 +137,30 @@ class InterpolationConfigurationPlugin implements ConfigurationPlugin {
                 }
             } else if (val instanceof String[]) {
                 String[] array = (String[]) val;
-                String[] newArray = null;
+                List<String> newArray = null;
                 for (int i = 0; i < array.length; i++) {
                     Object newVal = getNewValue(key, array[i], pid, properties);
                     if (newVal != null && !newVal.equals(array[i])) {
                         if (newArray == null) {
-                            newArray = new String[array.length];
-                            System.arraycopy(array, 0, newArray, 0, array.length);
+                            newArray = new ArrayList<>();
+                            for(int m=0;m<i;m++) {
+                                newArray.add(array[m]);
+                            }
                         }
-                        newArray[i] = newVal.toString();
+                        if ( newVal.getClass().isArray() ) {
+                            for(int m=0;m<Array.getLength(newVal);m++ ) {
+                                newArray.add(Array.get(newVal, m).toString());
+                            }
+                        } else {
+                            newArray.add(newVal.toString());
+                        }
+                    } else if ( newArray != null ) {
+                        newArray.add(array[i]);
                     }
                 }
                 if (newArray != null) {
-                    properties.put(key, newArray);
+                    final String[] update = newArray.toArray(new String[newArray.size()]);
+                    properties.put(key, update);
                     getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid);
                 }
             }
diff --git a/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java b/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java
index 4fdeab038d..1e996647c3 100644
--- a/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java
+++ b/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java
@@ -306,4 +306,18 @@ public class InterpolationConfigurationPluginTest {
         obj = plugin.convertType("String", "a,b", ",");
         assertEquals("a,b", obj);
     }
+
+    @Test
+    public void testModifyConfigurationWithArrayInArray() throws Exception {
+        BundleContext bc = Mockito.mock(BundleContext.class);
+        Mockito.when(bc.getProperty("foo")).thenReturn("2000,3000");
+        InterpolationConfigurationPlugin plugin = new InterpolationConfigurationPlugin(bc::getProperty, null, null);
+
+        Dictionary<String, Object> dict = new Hashtable<>();
+        dict.put("array", new String[] {"1000", "$[prop:foo;type=String[];delimiter=,]", "4000"});
+        plugin.modifyConfiguration(null, dict);
+
+        assertEquals(1, dict.size());
+        assertArrayEquals(new String[] {"1000", "2000", "3000", "4000"}, (String[])dict.get("array"));
+    }
 }
diff --git a/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolatorTest.java b/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolatorTest.java
index 74c892c973..05132a9167 100755
--- a/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolatorTest.java
+++ b/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolatorTest.java
@@ -18,7 +18,6 @@ package org.apache.felix.configadmin.plugin.interpolation;
 
 import static org.junit.Assert.assertEquals;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.felix.configadmin.plugin.interpolation.Interpolator.Provider;