Class StringSubstitutor
- java.lang.Object
-
- com.intergral.deep.agent.api.utils.string.StringSubstitutor
-
public class StringSubstitutor extends Object
Substitutes variables within a string by values.This class takes a piece of text and substitutes all the variables within it. The default definition of a variable is
${variableName}
. The prefix and suffix can be changed via constructors and set methods.Variable values are typically resolved from a map, but could also be resolved from system properties, or by supplying a custom variable resolver.
The simplest example is to use this class to replace Java System properties. For example:
StrSubstitutor .replaceSystemProperties("You are running with java.version = ${java.version} and os.name = ${os.name}.");
Typical usage of this class follows the following pattern: First an instance is created and initialized with the map that contains the values for the available variables. If a prefix and/or suffix for variables should be used other than the default ones, the appropriate settings can be performed. After that the
replace()
method can be called passing in the source text for interpolation. In the returned text all variable references (as long as their values are known) will be resolved. The following example demonstrates this:Map valuesMap = HashMap(); valuesMap.put("animal", "quick brown fox"); valuesMap.put("target", "lazy dog"); String templateString = "The ${animal} jumped over the ${target}."; StrSubstitutor sub = new StrSubstitutor(valuesMap); String resolvedString = sub.replace(templateString);
yielding:
The quick brown fox jumped over the lazy dog.
Also, this class allows to set a default value for unresolved variables. The default value for a variable can be appended to the variable name after the variable default value delimiter. The default value of the variable default value delimiter is ':-', as in bash and other *nix shells, as those are arguably where the default ${} delimiter set originated. The variable default value delimiter can be manually set by calling
setValueDelimiterMatcher(StringMatcher)
,setValueDelimiter(char)
orsetValueDelimiter(String)
. The following shows an example with variable default value settings:Map valuesMap = HashMap(); valuesMap.put("animal", "quick brown fox"); valuesMap.put("target", "lazy dog"); String templateString = "The ${animal} jumped over the ${target}. ${undefined.number:-1234567890}."; StrSubstitutor sub = new StrSubstitutor(valuesMap); String resolvedString = sub.replace(templateString);
yielding:
The quick brown fox jumped over the lazy dog. 1234567890.
In addition to this usage pattern there are some static convenience methods that cover the most common use cases. These methods can be used without the need of manually creating an instance. However if multiple replace operations are to be performed, creating and reusing an instance of this class will be more efficient.
Variable replacement works in a recursive way. Thus, if a variable value contains a variable then that variable will also be replaced. Cyclic replacements are detected and will cause an exception to be thrown.
Sometimes the interpolation's result must contain a variable prefix. As an example take the following source text:
The variable ${${name}} must be used.
Here only the variable's name referred to in the text should be replaced resulting in the text (assuming that the value of the
name
variable isx
):The variable ${x} must be used.
To achieve this effect there are two possibilities: Either set a different prefix and suffix for variables which do not conflict with the result text you want to produce. The other possibility is to use the escape character, by default '$'. If this character is placed before a variable reference, this reference is ignored and won't be replaced. For example:
The variable $${${name}} must be used.
In some complex scenarios you might even want to perform substitution in the names of variables, for instance
${jre-${java.specification.version}}
StrSubstitutor
supports this recursive substitution in variable names, but it has to be enabled explicitly by setting theenableSubstitutionInVariables
property to true.This class is not thread safe.
- Since:
- 1.3
-
-
Field Summary
Fields Modifier and Type Field Description static char
DEFAULT_ESCAPE
Constant for the default escape character.static StringMatcher
DEFAULT_PREFIX
Constant for the default variable prefix.static StringMatcher
DEFAULT_SUFFIX
Constant for the default variable suffix.static StringMatcher
DEFAULT_VALUE_DELIMITER
Constant for the default value delimiter of a variable.
-
Constructor Summary
Constructors Constructor Description StringSubstitutor(StringLookup variableResolver)
Creates a new instance and initializes it.StringSubstitutor(StringLookup variableResolver, StringMatcher prefixMatcher, StringMatcher suffixMatcher, char escape, StringMatcher valueDelimiterMatcher)
Creates a new instance and initializes it.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description char
getEscapeChar()
Returns the escape character.StringLookup
getStringLookup()
Gets the StringLookup that is used to lookup variables.StringMatcher
getValueDelimiterMatcher()
Gets the variable default value delimiter matcher currently in use.StringMatcher
getVariablePrefixMatcher()
Gets the variable prefix matcher currently in use.StringMatcher
getVariableSuffixMatcher()
Gets the variable suffix matcher currently in use.boolean
isDisableSubstitutionInValues()
Returns a flag whether substitution is disabled in variable values.If set to true, the values of variables can contain other variables will not be processed and substituted original variable is evaluated, e.g.boolean
isEnableSubstitutionInVariables()
Returns a flag whether substitution is done in variable names.boolean
isPreserveEscapes()
Returns the flag controlling whether escapes are preserved during substitution.String
replace(char[] source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source array as a template.String
replace(char[] source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source array as a template.String
replace(TextStringBuilder source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source builder as a template.String
replace(TextStringBuilder source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source builder as a template.String
replace(CharSequence source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source as a template.String
replace(CharSequence source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source as a template.String
replace(Object source)
Replaces all the occurrences of variables in the given source object with their matching values from the resolver.String
replace(String source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source string as a template.String
replace(StringBuffer source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source buffer as a template.String
replace(StringBuffer source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source buffer as a template.String
replace(String source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source string as a template.boolean
replaceIn(TextStringBuilder source)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.boolean
replaceIn(TextStringBuilder source, int offset, int length)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.boolean
replaceIn(StringBuffer source)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver.boolean
replaceIn(StringBuffer source, int offset, int length)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver.boolean
replaceIn(StringBuilder source)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver.boolean
replaceIn(StringBuilder source, int offset, int length)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.protected String
resolveVariable(String variableName, TextStringBuilder buf, int startPos, int endPos)
Internal method that resolves the value of a variable.StringSubstitutor
setDisableSubstitutionInValues(boolean disableSubstitutionInValues)
Sets a flag whether substitution is done in variable values (recursive).StringSubstitutor
setEnableSubstitutionInVariables(boolean enableSubstitutionInVariables)
Sets a flag whether substitution is done in variable names.StringSubstitutor
setEscapeChar(char escapeCharacter)
Sets the escape character.StringSubstitutor
setPreserveEscapes(boolean preserveEscapes)
Sets a flag controlling whether escapes are preserved during substitution.StringSubstitutor
setValueDelimiter(char valueDelimiter)
Sets the variable default value delimiter to use.StringSubstitutor
setValueDelimiter(String valueDelimiter)
Sets the variable default value delimiter to use.StringSubstitutor
setValueDelimiterMatcher(StringMatcher valueDelimiterMatcher)
Sets the variable default value delimiter matcher to use.StringSubstitutor
setVariablePrefix(char prefix)
Sets the variable prefix to use.StringSubstitutor
setVariablePrefix(String prefix)
Sets the variable prefix to use.StringSubstitutor
setVariablePrefixMatcher(StringMatcher prefixMatcher)
Sets the variable prefix matcher currently in use.StringSubstitutor
setVariableResolver(StringLookup variableResolver)
Sets the VariableResolver that is used to lookup variables.StringSubstitutor
setVariableSuffix(char suffix)
Sets the variable suffix to use.StringSubstitutor
setVariableSuffix(String suffix)
Sets the variable suffix to use.StringSubstitutor
setVariableSuffixMatcher(StringMatcher suffixMatcher)
Sets the variable suffix matcher currently in use.protected boolean
substitute(TextStringBuilder buf, int offset, int length)
Internal method that substitutes the variables.
-
-
-
Field Detail
-
DEFAULT_ESCAPE
public static final char DEFAULT_ESCAPE
Constant for the default escape character.- See Also:
- Constant Field Values
-
DEFAULT_PREFIX
public static final StringMatcher DEFAULT_PREFIX
Constant for the default variable prefix.
-
DEFAULT_SUFFIX
public static final StringMatcher DEFAULT_SUFFIX
Constant for the default variable suffix.
-
DEFAULT_VALUE_DELIMITER
public static final StringMatcher DEFAULT_VALUE_DELIMITER
Constant for the default value delimiter of a variable.
-
-
Constructor Detail
-
StringSubstitutor
public StringSubstitutor(StringLookup variableResolver)
Creates a new instance and initializes it.- Parameters:
variableResolver
- the variable resolver, may be null
-
StringSubstitutor
public StringSubstitutor(StringLookup variableResolver, StringMatcher prefixMatcher, StringMatcher suffixMatcher, char escape, StringMatcher valueDelimiterMatcher)
Creates a new instance and initializes it.- Parameters:
variableResolver
- the variable resolver, may be nullprefixMatcher
- the prefix for variables, not nullsuffixMatcher
- the suffix for variables, not nullescape
- the escape charactervalueDelimiterMatcher
- the variable default value delimiter matcher, may be null- Throws:
IllegalArgumentException
- if the prefix or suffix is null
-
-
Method Detail
-
getEscapeChar
public char getEscapeChar()
Returns the escape character.- Returns:
- the character used for escaping variable references
-
setEscapeChar
public StringSubstitutor setEscapeChar(char escapeCharacter)
Sets the escape character. If this character is placed before a variable reference in the source text, this variable will be ignored.- Parameters:
escapeCharacter
- the escape character (0 for disabling escaping)- Returns:
- this, to enable chaining
-
getStringLookup
public StringLookup getStringLookup()
Gets the StringLookup that is used to lookup variables.- Returns:
- the StringLookup
-
getValueDelimiterMatcher
public StringMatcher getValueDelimiterMatcher()
Gets the variable default value delimiter matcher currently in use.The variable default value delimiter is the character or characters that delimite the variable name and the variable default value. This delimiter is expressed in terms of a matcher allowing advanced variable default value delimiter matches.
If it returns null, then the variable default value resolution is disabled.
- Returns:
- the variable default value delimiter matcher in use, may be null
-
setValueDelimiterMatcher
public StringSubstitutor setValueDelimiterMatcher(StringMatcher valueDelimiterMatcher)
Sets the variable default value delimiter matcher to use.The variable default value delimiter is the character or characters that delimite the variable name and the variable default value. This delimiter is expressed in terms of a matcher allowing advanced variable default value delimiter matches.
If the
valueDelimiterMatcher
is null, then the variable default value resolution becomes disabled.- Parameters:
valueDelimiterMatcher
- variable default value delimiter matcher to use, may be null- Returns:
- this, to enable chaining
-
getVariablePrefixMatcher
public StringMatcher getVariablePrefixMatcher()
Gets the variable prefix matcher currently in use.The variable prefix is the character or characters that identify the start of a variable. This prefix is expressed in terms of a matcher allowing advanced prefix matches.
- Returns:
- the prefix matcher in use
-
setVariablePrefixMatcher
public StringSubstitutor setVariablePrefixMatcher(StringMatcher prefixMatcher)
Sets the variable prefix matcher currently in use.The variable prefix is the character or characters that identify the start of a variable. This prefix is expressed in terms of a matcher allowing advanced prefix matches.
- Parameters:
prefixMatcher
- the prefix matcher to use, null ignored- Returns:
- this, to enable chaining
- Throws:
IllegalArgumentException
- if the prefix matcher is null
-
getVariableSuffixMatcher
public StringMatcher getVariableSuffixMatcher()
Gets the variable suffix matcher currently in use.The variable suffix is the character or characters that identify the end of a variable. This suffix is expressed in terms of a matcher allowing advanced suffix matches.
- Returns:
- the suffix matcher in use
-
setVariableSuffixMatcher
public StringSubstitutor setVariableSuffixMatcher(StringMatcher suffixMatcher)
Sets the variable suffix matcher currently in use.The variable suffix is the character or characters that identify the end of a variable. This suffix is expressed in terms of a matcher allowing advanced suffix matches.
- Parameters:
suffixMatcher
- the suffix matcher to use, null ignored- Returns:
- this, to enable chaining
- Throws:
IllegalArgumentException
- if the suffix matcher is null
-
isDisableSubstitutionInValues
public boolean isDisableSubstitutionInValues()
Returns a flag whether substitution is disabled in variable values.If set to true, the values of variables can contain other variables will not be processed and substituted original variable is evaluated, e.g.Map valuesMap = HashMap(); valuesMap.put("name", "Douglas ${surname}"); valuesMap.put("surname", "Crockford"); String templateString = "Hi ${name}"; StrSubstitutor sub = new StrSubstitutor(valuesMap); String resolvedString = sub.replace(templateString);
yielding:
Hi Douglas ${surname}
- Returns:
- the substitution in variable values flag
-
setDisableSubstitutionInValues
public StringSubstitutor setDisableSubstitutionInValues(boolean disableSubstitutionInValues)
Sets a flag whether substitution is done in variable values (recursive).- Parameters:
disableSubstitutionInValues
- true if substitution in variable value are disabled- Returns:
- this, to enable chaining
-
isEnableSubstitutionInVariables
public boolean isEnableSubstitutionInVariables()
Returns a flag whether substitution is done in variable names.- Returns:
- the substitution in variable names flag
-
setEnableSubstitutionInVariables
public StringSubstitutor setEnableSubstitutionInVariables(boolean enableSubstitutionInVariables)
Sets a flag whether substitution is done in variable names. If set to true, the names of variables can contain other variables which are processed first before the original variable is evaluated, e.g.${jre-${java.version}}
. The default value is false.- Parameters:
enableSubstitutionInVariables
- the new value of the flag- Returns:
- this, to enable chaining
-
isPreserveEscapes
public boolean isPreserveEscapes()
Returns the flag controlling whether escapes are preserved during substitution.- Returns:
- the preserve escape flag
-
setPreserveEscapes
public StringSubstitutor setPreserveEscapes(boolean preserveEscapes)
Sets a flag controlling whether escapes are preserved during substitution. If set to true, the escape character is retained during substitution (e.g.$${this-is-escaped}
remains$${this-is-escaped}
). If set to false, the escape character is removed during substitution (e.g.$${this-is-escaped}
becomes${this-is-escaped}
). The default value is false- Parameters:
preserveEscapes
- true if escapes are to be preserved- Returns:
- this, to enable chaining
-
replace
public String replace(char[] source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source array as a template. The array is not altered by this method.- Parameters:
source
- the character array to replace in, not altered, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(char[] source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source array as a template. The array is not altered by this method.Only the specified portion of the array will be processed. The rest of the array is not processed, and is not returned.
- Parameters:
source
- the character array to replace in, not altered, null returns nulloffset
- the start offset within the array, must be validlength
- the length within the array to be processed, must be valid- Returns:
- the result of the replace operation
-
replace
public String replace(CharSequence source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source as a template. The source is not altered by this method.- Parameters:
source
- the buffer to use as a template, not changed, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(CharSequence source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source as a template. The source is not altered by this method.Only the specified portion of the buffer will be processed. The rest of the buffer is not processed, and is not returned.
- Parameters:
source
- the buffer to use as a template, not changed, null returns nulloffset
- the start offset within the array, must be validlength
- the length within the array to be processed, must be valid- Returns:
- the result of the replace operation
-
replace
public String replace(Object source)
Replaces all the occurrences of variables in the given source object with their matching values from the resolver. The input source object is converted to a string usingtoString
and is not altered.- Parameters:
source
- the source to replace in, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(TextStringBuilder source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source builder as a template. The builder is not altered by this method.- Parameters:
source
- the builder to use as a template, not changed, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(TextStringBuilder source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source builder as a template. The builder is not altered by this method.Only the specified portion of the builder will be processed. The rest of the builder is not processed, and is not returned.
- Parameters:
source
- the builder to use as a template, not changed, null returns nulloffset
- the start offset within the array, must be validlength
- the length within the array to be processed, must be valid- Returns:
- the result of the replace operation
-
replace
public String replace(String source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source string as a template.- Parameters:
source
- the string to replace in, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(String source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source string as a template.Only the specified portion of the string will be processed. The rest of the string is not processed, and is not returned.
- Parameters:
source
- the string to replace in, null returns nulloffset
- the start offset within the array, must be validlength
- the length within the array to be processed, must be valid- Returns:
- the result of the replace operation
-
replace
public String replace(StringBuffer source)
Replaces all the occurrences of variables with their matching values from the resolver using the given source buffer as a template. The buffer is not altered by this method.- Parameters:
source
- the buffer to use as a template, not changed, null returns null- Returns:
- the result of the replace operation
-
replace
public String replace(StringBuffer source, int offset, int length)
Replaces all the occurrences of variables with their matching values from the resolver using the given source buffer as a template. The buffer is not altered by this method.Only the specified portion of the buffer will be processed. The rest of the buffer is not processed, and is not returned.
- Parameters:
source
- the buffer to use as a template, not changed, null returns nulloffset
- the start offset within the array, must be validlength
- the length within the array to be processed, must be valid- Returns:
- the result of the replace operation
-
replaceIn
public boolean replaceIn(TextStringBuilder source)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.- Parameters:
source
- the builder to replace in, updated, null returns zero- Returns:
- true if altered
-
replaceIn
public boolean replaceIn(TextStringBuilder source, int offset, int length)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.Only the specified portion of the builder will be processed. The rest of the builder is not processed, but it is not deleted.
- Parameters:
source
- the builder to replace in, null returns zerooffset
- the start offset within the array, must be validlength
- the length within the builder to be processed, must be valid- Returns:
- true if altered
-
replaceIn
public boolean replaceIn(StringBuffer source)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver. The buffer is updated with the result.- Parameters:
source
- the buffer to replace in, updated, null returns zero- Returns:
- true if altered
-
replaceIn
public boolean replaceIn(StringBuffer source, int offset, int length)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver. The buffer is updated with the result.Only the specified portion of the buffer will be processed. The rest of the buffer is not processed, but it is not deleted.
- Parameters:
source
- the buffer to replace in, updated, null returns zerooffset
- the start offset within the array, must be validlength
- the length within the buffer to be processed, must be valid- Returns:
- true if altered
-
replaceIn
public boolean replaceIn(StringBuilder source)
Replaces all the occurrences of variables within the given source buffer with their matching values from the resolver. The buffer is updated with the result.- Parameters:
source
- the buffer to replace in, updated, null returns zero- Returns:
- true if altered
-
replaceIn
public boolean replaceIn(StringBuilder source, int offset, int length)
Replaces all the occurrences of variables within the given source builder with their matching values from the resolver. The builder is updated with the result.Only the specified portion of the buffer will be processed. The rest of the buffer is not processed, but it is not deleted.
- Parameters:
source
- the buffer to replace in, updated, null returns zerooffset
- the start offset within the array, must be validlength
- the length within the buffer to be processed, must be valid- Returns:
- true if altered
-
resolveVariable
protected String resolveVariable(String variableName, TextStringBuilder buf, int startPos, int endPos)
Internal method that resolves the value of a variable.Most users of this class do not need to call this method. This method is called automatically by the substitution process.
Writers of subclasses can override this method if they need to alter how each substitution occurs. The method is passed the variable's name and must return the corresponding value. This implementation uses the
getStringLookup()
with the variable's name as the key.- Parameters:
variableName
- the name of the variable, not nullbuf
- the buffer where the substitution is occurring, not nullstartPos
- the start position of the variable including the prefix, validendPos
- the end position of the variable including the suffix, valid- Returns:
- the variable's value or null if the variable is unknown
-
setValueDelimiter
public StringSubstitutor setValueDelimiter(char valueDelimiter)
Sets the variable default value delimiter to use.The variable default value delimiter is the character or characters that delimite the variable name and the variable default value. This method allows a single character variable default value delimiter to be easily set.
- Parameters:
valueDelimiter
- the variable default value delimiter character to use- Returns:
- this, to enable chaining
-
setValueDelimiter
public StringSubstitutor setValueDelimiter(String valueDelimiter)
Sets the variable default value delimiter to use.The variable default value delimiter is the character or characters that delimite the variable name and the variable default value. This method allows a string variable default value delimiter to be easily set.
If the
valueDelimiter
is null or empty string, then the variable default value resolution becomes disabled.- Parameters:
valueDelimiter
- the variable default value delimiter string to use, may be null or empty- Returns:
- this, to enable chaining
-
setVariablePrefix
public StringSubstitutor setVariablePrefix(char prefix)
Sets the variable prefix to use.The variable prefix is the character or characters that identify the start of a variable. This method allows a single character prefix to be easily set.
- Parameters:
prefix
- the prefix character to use- Returns:
- this, to enable chaining
-
setVariablePrefix
public StringSubstitutor setVariablePrefix(String prefix)
Sets the variable prefix to use.The variable prefix is the character or characters that identify the start of a variable. This method allows a string prefix to be easily set.
- Parameters:
prefix
- the prefix for variables, not null- Returns:
- this, to enable chaining
- Throws:
IllegalArgumentException
- if the prefix is null
-
setVariableResolver
public StringSubstitutor setVariableResolver(StringLookup variableResolver)
Sets the VariableResolver that is used to lookup variables.- Parameters:
variableResolver
- the VariableResolver- Returns:
- this, to enable chaining
-
setVariableSuffix
public StringSubstitutor setVariableSuffix(char suffix)
Sets the variable suffix to use.The variable suffix is the character or characters that identify the end of a variable. This method allows a single character suffix to be easily set.
- Parameters:
suffix
- the suffix character to use- Returns:
- this, to enable chaining
-
setVariableSuffix
public StringSubstitutor setVariableSuffix(String suffix)
Sets the variable suffix to use.The variable suffix is the character or characters that identify the end of a variable. This method allows a string suffix to be easily set.
- Parameters:
suffix
- the suffix for variables, not null- Returns:
- this, to enable chaining
- Throws:
IllegalArgumentException
- if the suffix is null
-
substitute
protected boolean substitute(TextStringBuilder buf, int offset, int length)
Internal method that substitutes the variables.Most users of this class do not need to call this method. This method will be called automatically by another (public) method.
Writers of subclasses can override this method if they need access to the substitution process at the start or end.
- Parameters:
buf
- the string builder to substitute into, not nulloffset
- the start offset within the builder, must be validlength
- the length within the builder to be processed, must be valid- Returns:
- true if altered
-
-