This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 13a2ced CAMEL-15781: camel-core - Optimize FilePathResolver to use simpler parser than regexp 13a2ced is described below commit 13a2ced1629d8dcd17fec49137f5c71a46423db1 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Nov 2 14:06:02 2020 +0100 CAMEL-15781: camel-core - Optimize FilePathResolver to use simpler parser than regexp --- .../apache/camel/util/FilePathResolverTest.java | 7 +++ .../org/apache/camel/util/FilePathResolver.java | 56 +++++++++++----------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/util/FilePathResolverTest.java b/core/camel-core/src/test/java/org/apache/camel/util/FilePathResolverTest.java index aa602d7..0672e0a 100644 --- a/core/camel-core/src/test/java/org/apache/camel/util/FilePathResolverTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/util/FilePathResolverTest.java @@ -26,10 +26,17 @@ public class FilePathResolverTest { public void testFilePathResolver() throws Exception { assertEquals("/foo/bar", FilePathResolver.resolvePath("/foo/bar")); + assertEquals("/foo/myserver/bar", FilePathResolver.resolvePath("/foo/${env.FOO_SERVICE_HOST}/bar")); + String tmp = System.getProperty("java.io.tmpdir"); assertEquals(tmp + "foo", FilePathResolver.resolvePath("${java.io.tmpdir}foo")); System.setProperty("beer", "Carlsberg"); assertEquals(tmp + "foo/Carlsberg", FilePathResolver.resolvePath("${java.io.tmpdir}foo/${beer}")); + + assertEquals("/myprefix/" + tmp + "bar/Carlsberg", + FilePathResolver.resolvePath("/myprefix/${java.io.tmpdir}bar/${beer}")); + + assertEquals("/foo/myserver/bar/Carlsberg", FilePathResolver.resolvePath("/foo/${env.FOO_SERVICE_HOST}/bar/${beer}")); } } diff --git a/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java b/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java index 836424d..adb14f5 100644 --- a/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java +++ b/core/camel-util/src/main/java/org/apache/camel/util/FilePathResolver.java @@ -16,18 +16,11 @@ */ package org.apache.camel.util; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * A resolver for file paths that supports resolving with system and environment properties. */ public final class FilePathResolver { - // must be non greedy patterns - private static final Pattern ENV_PATTERN = Pattern.compile("\\$\\{env:(.*?)\\}", Pattern.DOTALL); - private static final Pattern SYS_PATTERN = Pattern.compile("\\$\\{(.*?)\\}", Pattern.DOTALL); - private FilePathResolver() { } @@ -46,32 +39,37 @@ public final class FilePathResolver { * @throws IllegalArgumentException is thrown if system property / environment not found */ public static String resolvePath(String path) throws IllegalArgumentException { - Matcher matcher = ENV_PATTERN.matcher(path); - while (matcher.find()) { - String key = matcher.group(1); - String value = System.getenv(key); - if (ObjectHelper.isEmpty(value)) { - throw new IllegalArgumentException("Cannot find system environment with key: " + key); + int count = StringHelper.countChar(path, '}') + 1; + if (count <= 1) { + return path; + } + + String[] functions = StringHelper.splitOnCharacter(path, "}", count); + for (String fun : functions) { + int pos = fun.indexOf("${env."); + if (pos != -1) { + String key = fun.substring(pos + 6); + String value = System.getenv(key); + if (value != null) { + path = path.replace("${env." + key + "}", value); + } } - // must quote the replacement to have it work as literal replacement - value = Matcher.quoteReplacement(value); - path = matcher.replaceFirst(value); - // must match again as location is changed - matcher = ENV_PATTERN.matcher(path); } - matcher = SYS_PATTERN.matcher(path); - while (matcher.find()) { - String key = matcher.group(1); - String value = System.getProperty(key); - if (ObjectHelper.isEmpty(value)) { - throw new IllegalArgumentException("Cannot find JVM system property with key: " + key); + count = StringHelper.countChar(path, '}') + 1; + if (count <= 1) { + return path; + } + functions = StringHelper.splitOnCharacter(path, "}", count); + for (String fun : functions) { + int pos = fun.indexOf("${"); + if (pos != -1) { + String key = fun.substring(pos + 2); + String value = System.getProperty(key); + if (value != null) { + path = path.replace("${" + key + "}", value); + } } - // must quote the replacement to have it work as literal replacement - value = Matcher.quoteReplacement(value); - path = matcher.replaceFirst(value); - // must match again as location is changed - matcher = SYS_PATTERN.matcher(path); } return path;