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 2019/12/18 12:34:36 UTC
svn commit: r1871742 - in /felix/trunk/configadmin-plugins/interpolation/src:
main/java/org/apache/felix/configadmin/plugin/interpolation/
test/java/org/apache/felix/configadmin/plugin/interpolation/
Author: cziegeler
Date: Wed Dec 18 12:34:35 2019
New Revision: 1871742
URL: http://svn.apache.org/viewvc?rev=1871742&view=rev
Log:
FELIX-6209 : Support replacement in string arrays
Modified:
felix/trunk/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java
felix/trunk/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java
Modified: felix/trunk/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java?rev=1871742&r1=1871741&r2=1871742&view=diff
==============================================================================
--- felix/trunk/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java (original)
+++ felix/trunk/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPlugin.java Wed Dec 18 12:34:35 2019
@@ -16,13 +16,6 @@
*/
package org.apache.felix.configadmin.plugin.interpolation;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.ConfigurationPlugin;
-import org.osgi.util.converter.Converters;
-import org.slf4j.Logger;
-
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@@ -35,6 +28,13 @@ import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationPlugin;
+import org.osgi.util.converter.Converters;
+import org.slf4j.Logger;
+
class InterpolationConfigurationPlugin implements ConfigurationPlugin {
private static final String PREFIX = "$[";
private static final String SUFFIX = "]";
@@ -109,39 +109,61 @@ class InterpolationConfigurationPlugin i
@Override
public void modifyConfiguration(ServiceReference<?> reference, Dictionary<String, Object> properties) {
+ final Object pid = properties.get(Constants.SERVICE_PID);
for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements(); ) {
String key = keys.nextElement();
Object val = properties.get(key);
if (val instanceof String) {
- String sv = (String) val;
- int idx = sv.indexOf(PREFIX);
- if (idx != -1) {
- String varStart = sv.substring(idx);
- Object pid = properties.get(Constants.SERVICE_PID);
- Object newVal = null;
- if (varStart.startsWith(SECRET_PREFIX)) {
- newVal = replaceVariablesFromFile(key, sv, pid);
- } else if (varStart.startsWith(ENV_PREFIX)) {
- newVal = replaceVariablesFromEnvironment(key, sv, pid);
- } else if (varStart.startsWith(PROP_PREFIX)) {
- newVal = replaceVariablesFromProperties(key, sv, pid);
- }
-
- if (newVal != null && !newVal.equals(sv)) {
- properties.put(key, newVal);
- getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid);
+ Object newVal = replace(key, pid, (String) val);
+ if (newVal != null && !newVal.equals(val)) {
+ properties.put(key, newVal);
+ getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid);
+ }
+ } else if (val instanceof String[]) {
+ String[] array = (String[]) val;
+ String[] newArray = null;
+ for (int i = 0; i < array.length; i++) {
+ Object newVal = replace(key, pid, array[i]);
+ if (newVal != null && !newVal.equals(array[i])) {
+ if (newArray == null) {
+ newArray = new String[array.length];
+ System.arraycopy(array, 0, newArray, 0, array.length);
+ }
+ newArray[i] = newVal.toString();
}
}
+ if (newArray != null) {
+ properties.put(key, newArray);
+ getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid);
+ }
}
}
}
- Object replaceVariablesFromEnvironment(final String key, final String value, final Object pid) {
- return replaceVariables(ENV_PREFIX, ENV_PATTERN, key, value, pid, n -> System.getenv(n));
+ private Object replace(final String key, Object pid, String sv) {
+ int idx = sv.indexOf(PREFIX);
+ if (idx != -1) {
+ String varStart = sv.substring(idx);
+ Object newVal = null;
+ if (varStart.startsWith(SECRET_PREFIX)) {
+ newVal = replaceVariablesFromFile(key, sv, pid);
+ } else if (varStart.startsWith(ENV_PREFIX)) {
+ newVal = replaceVariablesFromEnvironment(sv);
+ } else if (varStart.startsWith(PROP_PREFIX)) {
+ newVal = replaceVariablesFromProperties(sv);
+ }
+
+ return newVal;
+ }
+ return null;
+ }
+
+ Object replaceVariablesFromEnvironment(final String value) {
+ return replaceVariables(ENV_PREFIX, ENV_PATTERN, value, n -> System.getenv(n));
}
- Object replaceVariablesFromProperties(final String key, final String value, final Object pid) {
- return replaceVariables(PROP_PREFIX, PROP_PATTERN, key, value, pid, n -> context.getProperty(n));
+ Object replaceVariablesFromProperties(final String value) {
+ return replaceVariables(PROP_PREFIX, PROP_PATTERN, value, n -> context.getProperty(n));
}
Object replaceVariablesFromFile(final String key, final String value, final Object pid) {
@@ -151,7 +173,7 @@ class InterpolationConfigurationPlugin i
return null;
}
- return replaceVariables(SECRET_PREFIX, SECRET_PATTERN, key, value, pid, n -> {
+ return replaceVariables(SECRET_PREFIX, SECRET_PATTERN, value, n -> {
if (n.contains("..")) {
getLog().error("Illegal secret location: " + n + " Going up in the directory structure is not allowed");
return null;
@@ -176,7 +198,7 @@ class InterpolationConfigurationPlugin i
}
Object replaceVariables(final String prefix, final Pattern pattern,
- final String key, final String value, final Object pid,
+ final String value,
final Function<String, String> valueSource) {
final Matcher m = pattern.matcher(value);
final StringBuffer sb = new StringBuffer();
Modified: felix/trunk/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java?rev=1871742&r1=1871741&r2=1871742&view=diff
==============================================================================
--- felix/trunk/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java (original)
+++ felix/trunk/configadmin-plugins/interpolation/src/test/java/org/apache/felix/configadmin/plugin/interpolation/InterpolationConfigurationPluginTest.java Wed Dec 18 12:34:35 2019
@@ -16,17 +16,17 @@
*/
package org.apache.felix.configadmin.plugin.interpolation;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
+import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
public class InterpolationConfigurationPluginTest {
@Test
@@ -154,4 +154,22 @@ public class InterpolationConfigurationP
assertEquals(Integer.valueOf(123), dict.get("defaulted"));
}
+
+ @Test
+ public void testReplacementInStringArray() throws IOException {
+ BundleContext bc = Mockito.mock(BundleContext.class);
+ Mockito.when(bc.getProperty("foo.bar")).thenReturn("hello there");
+ InterpolationConfigurationPlugin plugin = new InterpolationConfigurationPlugin(bc, null);
+
+ Dictionary<String, Object> dict = new Hashtable<>();
+ dict.put("array", new String[] { "1", "$[prop:foo.bar]", "3" });
+
+ plugin.modifyConfiguration(null, dict);
+
+ String[] array = (String[]) dict.get("array");
+ assertEquals(3, array.length);
+ assertEquals("1", array[0]);
+ assertEquals("hello there", array[1]);
+ assertEquals("3", array[2]);
+ }
}