FELIX-6560 : Interpolation of embedded arrays does not work
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 f2e7b67..30435f4 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 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 @@
}
} 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 4fdeab0..1e99664 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 @@
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 74c892c..05132a9 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 @@
import static org.junit.Assert.assertEquals;
-import java.util.HashMap;
import java.util.Map;
import org.apache.felix.configadmin.plugin.interpolation.Interpolator.Provider;