Author: davidb Date: Sat Nov 9 14:56:24 2019 New Revision: 1869603 URL: http://svn.apache.org/viewvc?rev=1869603&view=rev Log: FELIX-6192 Support default values and type conversion
Support for default values 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=1869603&r1=1869602&r2=1869603&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 Sat Nov 9 14:56:24 2019 @@ -25,8 +25,11 @@ import org.slf4j.Logger; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.util.Collections; import java.util.Dictionary; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -83,10 +86,10 @@ class InterpolationConfigurationPlugin i newVal = replaceVariablesFromProperties(key, sv, pid); } - if (newVal != null) + if (newVal != null && !newVal.equals(sv)) { properties.put(key, newVal); - - getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid); + getLog().info("Replaced value of configuration property '{}' for PID {}", key, pid); + } } } } @@ -140,13 +143,44 @@ class InterpolationConfigurationPlugin i final String var = m.group(); final int len = var.length(); - final String varName = var.substring(prefix.length(), len - SUFFIX.length()); + final int idx = var.indexOf(';'); + + final Map<String, String> directives; + final int endIdx; + if (idx >= 0) { + endIdx = idx; + directives = parseDirectives(var.substring(idx, len - SUFFIX.length())); + } else { + endIdx = len - SUFFIX.length(); + directives = Collections.emptyMap(); + } + + final String varName = var.substring(prefix.length(), endIdx); String replacement = valueSource.apply(varName); - if (replacement != null) + if (replacement != null) { m.appendReplacement(sb, Matcher.quoteReplacement(replacement)); + } else { + String defVal = directives.get("default"); + if (defVal != null) { + m.appendReplacement(sb, Matcher.quoteReplacement(defVal)); + } + } } m.appendTail(sb); return sb.toString(); } + + private Map<String, String> parseDirectives(String dirString) { + Map<String, String> dirs = new HashMap<>(); + + for (String dir : dirString.split(";")) { + String[] kv = dir.split("="); + if (kv.length == 2) { + dirs.put(kv[0], kv[1]); + } + } + + return dirs; + } } 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=1869603&r1=1869602&r2=1869603&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 Sat Nov 9 14:56:24 2019 @@ -48,14 +48,16 @@ public class InterpolationConfigurationP Dictionary<String, Object> dict = new Hashtable<>(); dict.put("foo", "bar"); dict.put("replaced", "$[secret:testfile]"); + dict.put("defaulted", "$[secret:not_there;default=defval123]"); dict.put("cur.user", "$[env:" + userVar + "]"); dict.put("intval", 999); dict.put(Constants.SERVICE_PID, "my.service"); plugin.modifyConfiguration(null, dict); - assertEquals(5, dict.size()); + assertEquals(6, dict.size()); assertEquals("bar", dict.get("foo")); assertEquals("line1\nline2", dict.get("replaced")); + assertEquals("defval123", dict.get("defaulted")); assertEquals(envUser, dict.get("cur.user")); assertEquals("my.service", dict.get(Constants.SERVICE_PID)); assertEquals(999, dict.get("intval")); @@ -128,4 +130,16 @@ public class InterpolationConfigurationP assertEquals("foo", plugin.replaceVariablesFromFile("akey", "foo", "apid")); } + + @Test + public void testDefault() throws IOException { + InterpolationConfigurationPlugin plugin = new InterpolationConfigurationPlugin(null, null); + + Dictionary<String, Object> dict = new Hashtable<>(); + dict.put("defaulted", "$[env:notset;default=foo]"); + + plugin.modifyConfiguration(null, dict); + + assertEquals("foo", dict.get("defaulted")); + } }