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 2021/09/04 17:10:20 UTC

[felix-dev] branch master updated: FELIX-6459 : Support escaping of directive separator

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new bd9259f  FELIX-6459 : Support escaping of directive separator
bd9259f is described below

commit bd9259f1178d815da914b50ce7cd1512320baa8b
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Sat Sep 4 19:10:11 2021 +0200

    FELIX-6459 : Support escaping of directive separator
---
 .../plugin/interpolation/Interpolator.java         | 52 ++++++++++++++++------
 .../plugin/interpolation/InterpolatorTest.java     | 16 +++++++
 2 files changed, 55 insertions(+), 13 deletions(-)

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 a479a8a..a1b0618 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
@@ -135,20 +135,12 @@ public class Interpolator {
             final int dirPos = postfix.indexOf(';');
             final Map<String, String> directives;
             final String name;
-            if (dirPos == -1) {
-                name = postfix;
-                directives = Collections.emptyMap();
-            } else {
+            if (dirPos != -1) {
+                directives = parseDirectives(postfix.substring(dirPos + 1));
                 name = postfix.substring(0, dirPos);
-                directives = new HashMap<>();
-
-                for (String dir : postfix.substring(dirPos + 1).split(";")) {
-                    String[] kv = dir.split("=", 2);
-                    if (kv.length > 0) {
-                        final String directiveValue = kv.length == 2 ? kv[1] : "";
-                        directives.put(kv[0], directiveValue);
-                    }
-                }
+            } else {
+                directives = Collections.emptyMap();
+                name = postfix;
             }
 
             // recursive replacement
@@ -169,4 +161,38 @@ public class Interpolator {
         }
         return result;
     }
+
+    public static Map<String,String> parseDirectives(String value) {
+        final Map<String,String> directives = new HashMap<>();
+        int index = 0;
+        while ( index <= value.length()) {
+            boolean split = false;
+            if ( index == value.length() ) {
+                split = true;
+            } else  if ( value.charAt(index) == ';' ) {
+                if ( index > 0 && value.charAt(index - 1) == ESCAPE && (index == 1 || value.charAt(index - 2) != ESCAPE) ) {
+                    // escape
+                    value = value.substring(0, index - 1).concat(value.substring(index));
+                    index--;
+                } else {
+                    split = true;
+                }
+            }
+            if ( split ) {
+                final String[] kv = value.substring(0, index).split("=", 2);
+                if (kv.length > 0) {
+                    final String directiveValue = kv.length == 2 ? kv[1] : "";
+                    directives.put(kv[0], directiveValue);
+                }
+                if ( index == value.length() ) {
+                    break;
+                }
+                value = value.substring(index + 1);
+                index = -1;         
+            }
+            index++;
+        }
+
+        return directives;
+    }
 }
\ No newline at end of file
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 90fb1b2..74c892c 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,6 +18,7 @@ package org.apache.felix.configadmin.plugin.interpolation;
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.felix.configadmin.plugin.interpolation.Interpolator.Provider;
@@ -74,4 +75,19 @@ public class InterpolatorTest {
         };
         assertEquals("$[no:replacement]", Interpolator.replace("\\$[no:replacement]", p));
     }
+
+    @Test
+    public void testParseDirectives() {
+        final Map<String, String> directives = Interpolator.parseDirectives("a=1;b=2");
+        assertEquals(2, directives.size());
+        assertEquals("1", directives.get("a"));
+        assertEquals("2", directives.get("b"));
+    }
+
+    @Test
+    public void testParseDirectivesWithEscaping() {
+        final Map<String, String> directives = Interpolator.parseDirectives("a=1\\;b=2");
+        assertEquals(1, directives.size());
+        assertEquals("1;b=2", directives.get("a"));
+    }
 }