diff options
Diffstat (limited to 'qpid/java/common/src/main')
| -rw-r--r-- | qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java | 94 |
1 files changed, 84 insertions, 10 deletions
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java b/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java index 5b544014a3..b7b9bf8c6e 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java @@ -22,8 +22,11 @@ package org.apache.qpid.util; import java.io.UnsupportedEncodingException; import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -122,14 +125,14 @@ public final class Strings public static interface Resolver { - String resolve(String variable); + String resolve(String variable, final Resolver resolver); } private static final Resolver NULL_RESOLVER = new Resolver() { @Override - public String resolve(final String variable) + public String resolve(final String variable, final Resolver resolver) { return null; } @@ -145,7 +148,7 @@ public final class Strings this.map = map; } - public String resolve(String variable) + public String resolve(String variable, final Resolver resolver) { return map.get(variable); } @@ -161,7 +164,7 @@ public final class Strings this.properties = properties; } - public String resolve(String variable) + public String resolve(String variable, final Resolver resolver) { return properties.getProperty(variable); } @@ -178,12 +181,12 @@ public final class Strings this.secondary = secondary; } - public String resolve(String variable) + public String resolve(String variable, final Resolver resolver) { - String result = primary.resolve(variable); + String result = primary.resolve(variable, resolver); if (result == null) { - result = secondary.resolve(variable); + result = secondary.resolve(variable, resolver); } return result; } @@ -192,7 +195,7 @@ public final class Strings public static final Resolver ENV_VARS_RESOLVER = new Resolver() { @Override - public String resolve(final String variable) + public String resolve(final String variable, final Resolver resolver) { return System.getenv(variable); } @@ -202,7 +205,7 @@ public final class Strings public static final Resolver JAVA_SYS_PROPS_RESOLVER = new Resolver() { @Override - public String resolve(final String variable) + public String resolve(final String variable, final Resolver resolver) { return System.getProperty(variable); } @@ -269,7 +272,7 @@ public final class Strings stack)); } - String result = resolver.resolve(var); + String result = resolver.resolve(var, resolver); if (result == null) { if(failOnUnresolved) @@ -329,4 +332,75 @@ public final class Strings return sb.toString(); } + + public static Resolver createSubstitutionResolver(String prefix, LinkedHashMap<String,String> substitutions) + { + return new StringSubstitutionResolver(prefix, substitutions); + } + + private static class StringSubstitutionResolver implements Resolver + { + + private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>(); + + private final LinkedHashMap<String, String> _substitutions; + private final String _prefix; + + private StringSubstitutionResolver(String prefix, LinkedHashMap<String, String> substitutions) + { + _prefix = prefix; + _substitutions = substitutions; + } + + @Override + public String resolve(final String variable, final Resolver resolver) + { + boolean clearStack = false; + Set<String> currentStack = _stack.get(); + if(currentStack == null) + { + currentStack = new HashSet<>(); + _stack.set(currentStack); + clearStack = true; + } + + try + { + if(currentStack.contains(variable)) + { + throw new IllegalArgumentException("The value of attribute " + variable + " is defined recursively"); + + } + + + if (variable.startsWith(_prefix)) + { + currentStack.add(variable); + String expanded = resolver.resolve(variable.substring(_prefix.length()), resolver); + currentStack.remove(variable); + if(expanded != null) + { + for(Map.Entry<String,String> entry : _substitutions.entrySet()) + { + expanded = expanded.replace(entry.getKey(), entry.getValue()); + } + } + return expanded; + } + else + { + return null; + } + + } + finally + { + + if(clearStack) + { + _stack.remove(); + } + } + } + } } |
