diff options
| author | Rafael H. Schloming <rhs@apache.org> | 2009-06-18 21:03:12 +0000 |
|---|---|---|
| committer | Rafael H. Schloming <rhs@apache.org> | 2009-06-18 21:03:12 +0000 |
| commit | d3ba25a6c0ad0b8bce0482694152bcaed206af7b (patch) | |
| tree | 233f04f0ddc7be138529d863020bb8b5ecefd7de /java/common/src | |
| parent | df6defeb2e0499ac80b69e7b7fb8944175447a02 (diff) | |
| download | qpid-python-d3ba25a6c0ad0b8bce0482694152bcaed206af7b.tar.gz | |
made test ports configurable; this required adding variable expansion to PropertiesFileInitialContextFactory
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@786269 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/common/src')
| -rw-r--r-- | java/common/src/main/java/org/apache/qpid/util/Strings.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/java/common/src/main/java/org/apache/qpid/util/Strings.java b/java/common/src/main/java/org/apache/qpid/util/Strings.java index a0bbbb22de..04bf174ff0 100644 --- a/java/common/src/main/java/org/apache/qpid/util/Strings.java +++ b/java/common/src/main/java/org/apache/qpid/util/Strings.java @@ -22,6 +22,12 @@ package org.apache.qpid.util; import java.io.UnsupportedEncodingException; +import java.util.Map; +import java.util.Properties; +import java.util.Stack; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Strings @@ -91,4 +97,142 @@ public final class Strings } } + private static final Pattern VAR = Pattern.compile("(?:\\$\\{([^\\}]*)\\})|(?:\\$(\\$))"); + + public static interface Resolver + { + String resolve(String variable); + } + + public static class MapResolver implements Resolver + { + + private final Map<String,String> map; + + public MapResolver(Map<String,String> map) + { + this.map = map; + } + + public String resolve(String variable) + { + return map.get(variable); + } + } + + public static class PropertiesResolver implements Resolver + { + + private final Properties properties; + + public PropertiesResolver(Properties properties) + { + this.properties = properties; + } + + public String resolve(String variable) + { + return properties.getProperty(variable); + } + } + + public static class ChainedResolver implements Resolver + { + private final Resolver primary; + private final Resolver secondary; + + public ChainedResolver(Resolver primary, Resolver secondary) + { + this.primary = primary; + this.secondary = secondary; + } + + public String resolve(String variable) + { + String result = primary.resolve(variable); + if (result == null) + { + result = secondary.resolve(variable); + } + return result; + } + } + + public static final Resolver SYSTEM_RESOLVER = new Resolver() + { + public String resolve(String variable) + { + String result = System.getProperty(variable); + if (result == null) + { + result = System.getenv(variable); + } + return result; + } + }; + + public static final String expand(String input) + { + return expand(input, SYSTEM_RESOLVER); + } + + public static final String expand(String input, Resolver resolver) + { + return expand(input, resolver, new Stack()); + } + + private static final String expand(String input, Resolver resolver, Stack<String> stack) + { + Matcher m = VAR.matcher(input); + StringBuffer result = new StringBuffer(); + while (m.find()) + { + String var = m.group(1); + if (var == null) + { + String esc = m.group(2); + if ("$".equals(esc)) + { + m.appendReplacement(result, Matcher.quoteReplacement("$")); + } + else + { + throw new IllegalArgumentException(esc); + } + } + else + { + m.appendReplacement(result, Matcher.quoteReplacement(resolve(var, resolver, stack))); + } + } + m.appendTail(result); + return result.toString(); + } + + private static final String resolve(String var, Resolver resolver, Stack<String> stack) + { + if (stack.contains(var)) + { + throw new IllegalArgumentException + (String.format("recursively defined variable: %s stack=%s", var, + stack)); + } + + String result = resolver.resolve(var); + if (result == null) + { + throw new IllegalArgumentException("no such variable: " + var); + } + + stack.push(var); + try + { + return expand(result, resolver, stack); + } + finally + { + stack.pop(); + } + } + } |
