Merge pull request #69 from kwin/feature/support-empty-default-values

FELIX-6384 support empty directive values
diff --git a/configadmin-plugins/interpolation/README.md b/configadmin-plugins/interpolation/README.md
index d1a7f10..868ea0f 100644
--- a/configadmin-plugins/interpolation/README.md
+++ b/configadmin-plugins/interpolation/README.md
@@ -61,10 +61,13 @@
 
 ```
 "port" : "$[env:PORT;default=8080]"
+"label" : "$[env:LABEL;default=]"
 ```
 
 Without a default, the placeholder is left in the value if no value can be found. With a default, the default is used instead.
 
+The default value may contain all alphanumeric and punctuation characters and space except for a `;`. It may even be left out which leads to replacing the placeholder with the empty string.
+
 ## Type Support
 
 A placeholder can contain additional information like the type the value should be converted to.
diff --git a/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/Interpolator.java b/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/Interpolator.java
index cb98fd6..ceddb92 100755
--- a/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/Interpolator.java
+++ b/configadmin-plugins/interpolation/src/main/java/org/apache/felix/configadmin/plugin/interpolation/Interpolator.java
@@ -114,9 +114,10 @@
                 directives = new HashMap<>();
 
                 for (String dir : postfix.substring(dirPos + 1).split(";")) {
-                    String[] kv = dir.split("=");
-                    if (kv.length == 2) {
-                        directives.put(kv[0], kv[1]);
+                    String[] kv = dir.split("=", 2);
+                    if (kv.length > 0) {
+                        final String directiveValue = kv.length == 2 ? kv[1] : "";
+                        directives.put(kv[0], directiveValue);
                     }
                 }
             }
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 bdbf173..7a38573 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
@@ -138,10 +138,19 @@
 
         Dictionary<String, Object> dict = new Hashtable<>();
         dict.put("defaulted", "$[env:notset;default=foo]");
-
+        dict.put("defaulted2", "$[env:notset;default=]");
+        dict.put("defaulted3", "$[env:notset;default=foo=bar]");
+        dict.put("defaulted4", "$[env:notset;default=foo;=bar]");
+        dict.put("defaulted5", "$[env:notset;default= ]");
+        dict.put("defaulted6", "$[env:notset;default");
         plugin.modifyConfiguration(null, dict);
 
         assertEquals("foo", dict.get("defaulted"));
+        assertEquals("", dict.get("defaulted2"));
+        assertEquals("foo=bar", dict.get("defaulted3"));
+        assertEquals("foo", dict.get("defaulted4")); // semicolon is not supported in values
+        assertEquals(" ", dict.get("defaulted5"));
+        assertEquals("$[env:notset;default", dict.get("defaulted6"));
     }
 
     @Test