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