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]);
+    }
 }