|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2013 the original author or authors. |
|
|
|
* Copyright 2002-2014 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -62,8 +62,8 @@ public class PropertyPlaceholderHelper { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix. |
|
|
|
* Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix. |
|
|
|
* Unresolvable placeholders are ignored. |
|
|
|
* Unresolvable placeholders are ignored. |
|
|
|
* @param placeholderPrefix the prefix that denotes the start of a placeholder. |
|
|
|
* @param placeholderPrefix the prefix that denotes the start of a placeholder |
|
|
|
* @param placeholderSuffix the suffix that denotes the end of a placeholder. |
|
|
|
* @param placeholderSuffix the suffix that denotes the end of a placeholder |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix) { |
|
|
|
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix) { |
|
|
|
this(placeholderPrefix, placeholderSuffix, null, true); |
|
|
|
this(placeholderPrefix, placeholderSuffix, null, true); |
|
|
|
@ -75,14 +75,14 @@ public class PropertyPlaceholderHelper { |
|
|
|
* @param placeholderSuffix the suffix that denotes the end of a placeholder |
|
|
|
* @param placeholderSuffix the suffix that denotes the end of a placeholder |
|
|
|
* @param valueSeparator the separating character between the placeholder variable |
|
|
|
* @param valueSeparator the separating character between the placeholder variable |
|
|
|
* and the associated default value, if any |
|
|
|
* and the associated default value, if any |
|
|
|
* @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should be ignored |
|
|
|
* @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should |
|
|
|
* ({@code true}) or cause an exception ({@code false}). |
|
|
|
* be ignored ({@code true}) or cause an exception ({@code false}) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, |
|
|
|
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, |
|
|
|
String valueSeparator, boolean ignoreUnresolvablePlaceholders) { |
|
|
|
String valueSeparator, boolean ignoreUnresolvablePlaceholders) { |
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(placeholderPrefix, "placeholderPrefix must not be null"); |
|
|
|
Assert.notNull(placeholderPrefix, "'placeholderPrefix' must not be null"); |
|
|
|
Assert.notNull(placeholderSuffix, "placeholderSuffix must not be null"); |
|
|
|
Assert.notNull(placeholderSuffix, "'placeholderSuffix' must not be null"); |
|
|
|
this.placeholderPrefix = placeholderPrefix; |
|
|
|
this.placeholderPrefix = placeholderPrefix; |
|
|
|
this.placeholderSuffix = placeholderSuffix; |
|
|
|
this.placeholderSuffix = placeholderSuffix; |
|
|
|
String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix); |
|
|
|
String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix); |
|
|
|
@ -100,12 +100,12 @@ public class PropertyPlaceholderHelper { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Replaces all placeholders of format {@code ${name}} with the corresponding |
|
|
|
* Replaces all placeholders of format {@code ${name}} with the corresponding |
|
|
|
* property from the supplied {@link Properties}. |
|
|
|
* property from the supplied {@link Properties}. |
|
|
|
* @param value the value containing the placeholders to be replaced. |
|
|
|
* @param value the value containing the placeholders to be replaced |
|
|
|
* @param properties the {@code Properties} to use for replacement. |
|
|
|
* @param properties the {@code Properties} to use for replacement |
|
|
|
* @return the supplied value with placeholders replaced inline. |
|
|
|
* @return the supplied value with placeholders replaced inline |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public String replacePlaceholders(String value, final Properties properties) { |
|
|
|
public String replacePlaceholders(String value, final Properties properties) { |
|
|
|
Assert.notNull(properties, "Argument 'properties' must not be null."); |
|
|
|
Assert.notNull(properties, "'properties' must not be null"); |
|
|
|
return replacePlaceholders(value, new PlaceholderResolver() { |
|
|
|
return replacePlaceholders(value, new PlaceholderResolver() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public String resolvePlaceholder(String placeholderName) { |
|
|
|
public String resolvePlaceholder(String placeholderName) { |
|
|
|
@ -117,25 +117,25 @@ public class PropertyPlaceholderHelper { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Replaces all placeholders of format {@code ${name}} with the value returned |
|
|
|
* Replaces all placeholders of format {@code ${name}} with the value returned |
|
|
|
* from the supplied {@link PlaceholderResolver}. |
|
|
|
* from the supplied {@link PlaceholderResolver}. |
|
|
|
* @param value the value containing the placeholders to be replaced. |
|
|
|
* @param value the value containing the placeholders to be replaced |
|
|
|
* @param placeholderResolver the {@code PlaceholderResolver} to use for replacement. |
|
|
|
* @param placeholderResolver the {@code PlaceholderResolver} to use for replacement |
|
|
|
* @return the supplied value with placeholders replaced inline. |
|
|
|
* @return the supplied value with placeholders replaced inline |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { |
|
|
|
public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { |
|
|
|
Assert.notNull(value, "Argument 'value' must not be null."); |
|
|
|
Assert.notNull(value, "'value' must not be null"); |
|
|
|
return parseStringValue(value, placeholderResolver, new HashSet<String>()); |
|
|
|
return parseStringValue(value, placeholderResolver, new HashSet<String>()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected String parseStringValue( |
|
|
|
protected String parseStringValue( |
|
|
|
String strVal, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) { |
|
|
|
String strVal, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) { |
|
|
|
|
|
|
|
|
|
|
|
StringBuilder buf = new StringBuilder(strVal); |
|
|
|
StringBuilder result = new StringBuilder(strVal); |
|
|
|
|
|
|
|
|
|
|
|
int startIndex = strVal.indexOf(this.placeholderPrefix); |
|
|
|
int startIndex = strVal.indexOf(this.placeholderPrefix); |
|
|
|
while (startIndex != -1) { |
|
|
|
while (startIndex != -1) { |
|
|
|
int endIndex = findPlaceholderEndIndex(buf, startIndex); |
|
|
|
int endIndex = findPlaceholderEndIndex(result, startIndex); |
|
|
|
if (endIndex != -1) { |
|
|
|
if (endIndex != -1) { |
|
|
|
String placeholder = buf.substring(startIndex + this.placeholderPrefix.length(), endIndex); |
|
|
|
String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex); |
|
|
|
String originalPlaceholder = placeholder; |
|
|
|
String originalPlaceholder = placeholder; |
|
|
|
if (!visitedPlaceholders.add(originalPlaceholder)) { |
|
|
|
if (!visitedPlaceholders.add(originalPlaceholder)) { |
|
|
|
throw new IllegalArgumentException( |
|
|
|
throw new IllegalArgumentException( |
|
|
|
@ -160,15 +160,15 @@ public class PropertyPlaceholderHelper { |
|
|
|
// Recursive invocation, parsing placeholders contained in the
|
|
|
|
// Recursive invocation, parsing placeholders contained in the
|
|
|
|
// previously resolved placeholder value.
|
|
|
|
// previously resolved placeholder value.
|
|
|
|
propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders); |
|
|
|
propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders); |
|
|
|
buf.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal); |
|
|
|
result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal); |
|
|
|
if (logger.isTraceEnabled()) { |
|
|
|
if (logger.isTraceEnabled()) { |
|
|
|
logger.trace("Resolved placeholder '" + placeholder + "'"); |
|
|
|
logger.trace("Resolved placeholder '" + placeholder + "'"); |
|
|
|
} |
|
|
|
} |
|
|
|
startIndex = buf.indexOf(this.placeholderPrefix, startIndex + propVal.length()); |
|
|
|
startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length()); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (this.ignoreUnresolvablePlaceholders) { |
|
|
|
else if (this.ignoreUnresolvablePlaceholders) { |
|
|
|
// Proceed with unprocessed value.
|
|
|
|
// Proceed with unprocessed value.
|
|
|
|
startIndex = buf.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length()); |
|
|
|
startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length()); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
throw new IllegalArgumentException("Could not resolve placeholder '" + |
|
|
|
throw new IllegalArgumentException("Could not resolve placeholder '" + |
|
|
|
@ -181,7 +181,7 @@ public class PropertyPlaceholderHelper { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return buf.toString(); |
|
|
|
return result.toString(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private int findPlaceholderEndIndex(CharSequence buf, int startIndex) { |
|
|
|
private int findPlaceholderEndIndex(CharSequence buf, int startIndex) { |
|
|
|
@ -211,14 +211,13 @@ public class PropertyPlaceholderHelper { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Strategy interface used to resolve replacement values for placeholders contained in Strings. |
|
|
|
* Strategy interface used to resolve replacement values for placeholders contained in Strings. |
|
|
|
* @see PropertyPlaceholderHelper |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static interface PlaceholderResolver { |
|
|
|
public static interface PlaceholderResolver { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Resolves the supplied placeholder name into the replacement value. |
|
|
|
* Resolve the supplied placeholder name to the replacement value. |
|
|
|
* @param placeholderName the name of the placeholder to resolve |
|
|
|
* @param placeholderName the name of the placeholder to resolve |
|
|
|
* @return the replacement value or {@code null} if no replacement is to be made |
|
|
|
* @return the replacement value, or {@code null} if no replacement is to be made |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
String resolvePlaceholder(String placeholderName); |
|
|
|
String resolvePlaceholder(String placeholderName); |
|
|
|
} |
|
|
|
} |
|
|
|
|