public class ConfigurationInterpolator extends Object
A class that handles interpolation (variable substitution) for configuration objects.
Each instance of AbstractConfiguration
is associated with an object
of this class. All interpolation tasks are delegated to this object.
ConfigurationInterpolator
internally uses the StringSubstitutor
class from Commons Text. Thus it
supports the same syntax of variable expressions.
The basic idea of this class is that it can maintain a set of primitive
Lookup
objects, each of which is identified by a special prefix. The
variables to be processed have the form ${prefix:name}
.
ConfigurationInterpolator
will extract the prefix and determine,
which primitive lookup object is registered for it. Then the name of the
variable is passed to this object to obtain the actual value. It is also
possible to define an arbitrary number of default lookup objects, which are
used for variables that do not have a prefix or that cannot be resolved by
their associated lookup object. When adding default lookup objects their
order matters; they are queried in this order, and the first non-null
variable value is used.
After an instance has been created it does not contain any Lookup
objects. The current set of lookup objects can be modified using the
registerLookup()
and deregisterLookup()
methods. Default
lookup objects (that are invoked for variables without a prefix) can be added
or removed with the addDefaultLookup()
and
removeDefaultLookup()
methods respectively. (When a
ConfigurationInterpolator
instance is created by a configuration
object, a default lookup object is added pointing to the configuration
itself, so that variables are resolved using the configuration's properties.)
The default usage scenario is that on a fully initialized instance the
interpolate()
method is called. It is passed an object value which
may contain variables. All these variables are substituted if they can be
resolved. The result is the passed in value with variables replaced.
Alternatively, the resolve()
method can be called to obtain the
values of specific variables without performing interpolation.
Implementation node: This class is thread-safe. Lookup objects can be added or removed at any time concurrent to interpolation operations.
Constructor and Description |
---|
ConfigurationInterpolator()
Creates a new instance of
ConfigurationInterpolator . |
Modifier and Type | Method and Description |
---|---|
void |
addDefaultLookup(Lookup defaultLookup)
Adds a default
Lookup object. |
void |
addDefaultLookups(Collection<? extends Lookup> lookups)
Adds all
Lookup objects in the given collection as default
lookups. |
boolean |
deregisterLookup(String prefix)
Deregisters the
Lookup object for the specified prefix at this
instance. |
protected Lookup |
fetchLookupForPrefix(String prefix)
Obtains the lookup object for the specified prefix.
|
static ConfigurationInterpolator |
fromSpecification(InterpolatorSpecification spec)
Creates a new
ConfigurationInterpolator instance based on the
passed in specification object. |
List<Lookup> |
getDefaultLookups()
Returns a collection with the default
Lookup objects
added to this ConfigurationInterpolator . |
static Map<String,Lookup> |
getDefaultPrefixLookups()
Returns a map containing the default prefix lookups.
|
Map<String,Lookup> |
getLookups()
Returns a map with the currently registered
Lookup objects and
their prefixes. |
ConfigurationInterpolator |
getParentInterpolator()
Returns the parent
ConfigurationInterpolator . |
Object |
interpolate(Object value)
Performs interpolation of the passed in value.
|
boolean |
isEnableSubstitutionInVariables()
Sets a flag that variable names can contain other variables.
|
static Lookup |
nullSafeLookup(Lookup lookup)
Utility method for obtaining a
Lookup object in a safe way. |
Set<String> |
prefixSet()
Returns an unmodifiable set with the prefixes, for which
Lookup
objects are registered at this instance. |
void |
registerLookup(String prefix,
Lookup lookup)
Registers the given
Lookup object for the specified prefix at
this instance. |
void |
registerLookups(Map<String,? extends Lookup> lookups)
Registers all
Lookup objects in the given map with their prefixes
at this ConfigurationInterpolator . |
boolean |
removeDefaultLookup(Lookup lookup)
Removes the specified
Lookup object from the list of default
Lookup s. |
Object |
resolve(String var)
Resolves the specified variable.
|
void |
setEnableSubstitutionInVariables(boolean f)
Sets the flag whether variable names can contain other variables.
|
void |
setParentInterpolator(ConfigurationInterpolator parentInterpolator)
Sets the parent
ConfigurationInterpolator . |
public ConfigurationInterpolator()
ConfigurationInterpolator
.public static ConfigurationInterpolator fromSpecification(InterpolatorSpecification spec)
ConfigurationInterpolator
instance based on the
passed in specification object. If the InterpolatorSpecification
already contains a ConfigurationInterpolator
object, it is used
directly. Otherwise, a new instance is created and initialized with the
properties stored in the specification.spec
- the InterpolatorSpecification
(must not be
null)ConfigurationInterpolator
obtained or created based
on the given specificationIllegalArgumentException
- if the specification is nullpublic static Map<String,Lookup> getDefaultPrefixLookups()
AbstractConfiguration
is by default
initialized with a ConfigurationInterpolator
containing these
Lookup
objects and their prefixes. The map cannot be modifiedLookup
objects and their
prefixespublic static Lookup nullSafeLookup(Lookup lookup)
Lookup
object in a safe way. This
method always returns a non-null Lookup
object. If the
passed in Lookup
is not null, it is directly returned.
Otherwise, result is a dummy Lookup
which does not provide any
values.lookup
- the Lookup
to checkLookup
objectpublic void addDefaultLookup(Lookup defaultLookup)
Lookup
object. Default Lookup
objects are
queried (in the order they were added) for all variables without a
special prefix. If no default Lookup
objects are present, such
variables won't be processed.defaultLookup
- the default Lookup
object to be added (must
not be null)IllegalArgumentException
- if the Lookup
object is
nullpublic void addDefaultLookups(Collection<? extends Lookup> lookups)
Lookup
objects in the given collection as default
lookups. The collection can be null, then this method has no
effect. It must not contain null entries.lookups
- the Lookup
objects to be added as default lookupsIllegalArgumentException
- if the collection contains a null
entrypublic boolean deregisterLookup(String prefix)
Lookup
object for the specified prefix at this
instance. It will be removed from this instance.prefix
- the variable prefixprotected Lookup fetchLookupForPrefix(String prefix)
lookup()
method. This implementation will check
whether a lookup object is registered for the given prefix. If not, a
null lookup object will be returned (never null).prefix
- the prefixpublic List<Lookup> getDefaultLookups()
Lookup
objects
added to this ConfigurationInterpolator
. These objects are not
associated with a variable prefix. The returned list is a snapshot copy
of the internal collection of default lookups; so manipulating it does
not affect this instance.public Map<String,Lookup> getLookups()
Lookup
objects and
their prefixes. This is a snapshot copy of the internally used map. So
modifications of this map do not effect this instance.Lookup
objectspublic ConfigurationInterpolator getParentInterpolator()
ConfigurationInterpolator
.ConfigurationInterpolator
(can be null)public Object interpolate(Object value)
value
- the value to be interpolatedpublic boolean isEnableSubstitutionInVariables()
public Set<String> prefixSet()
Lookup
objects are registered at this instance. This means that variables with
these prefixes can be processed.public void registerLookup(String prefix, Lookup lookup)
Lookup
object for the specified prefix at
this instance. From now on this lookup object will be used for variables
that have the specified prefix.prefix
- the variable prefix (must not be null)lookup
- the Lookup
object to be used for this prefix (must
not be null)IllegalArgumentException
- if either the prefix or the
Lookup
object is nullpublic void registerLookups(Map<String,? extends Lookup> lookups)
Lookup
objects in the given map with their prefixes
at this ConfigurationInterpolator
. Using this method multiple
Lookup
objects can be registered at once. If the passed in map is
null, this method does not have any effect.lookups
- the map with lookups to register (may be null)IllegalArgumentException
- if the map contains entriespublic boolean removeDefaultLookup(Lookup lookup)
Lookup
object from the list of default
Lookup
s.lookup
- the Lookup
object to be removedLookup
object actually existed and
was removedpublic Object resolve(String var)
ConfigurationInterpolator
is
available, this object is asked to resolve the variable.var
- the name of the variable whose value is to be looked up which may contain a prefix.public void setEnableSubstitutionInVariables(boolean f)
enableSubstitutionInVariables
property of
the underlying StringSubstitutor
object.f
- the new value of the flagpublic void setParentInterpolator(ConfigurationInterpolator parentInterpolator)
ConfigurationInterpolator
. This object is used if
the Lookup
objects registered at this object cannot resolve a
variable.parentInterpolator
- the parent ConfigurationInterpolator
object (can be null)Copyright © 2001–2020 The Apache Software Foundation. All rights reserved.