in org.eclipse.sisu.inject/src/org/eclipse/sisu/wire/PlaceholderBeanProvider.java [130:174]
private Object interpolate( final String template, final Class<?> clazz )
{
final StringBuilder buf;
if ( template.contains( "${" ) )
{
buf = new StringBuilder( template );
}
else if ( properties.containsKey( template ) )
{
// handle situations where someone missed out the main brackets
buf = new StringBuilder( "${" ).append( template ).append( '}' );
}
else
{
return template; // nothing to interpolate, maintain reference
}
int x = 0, y, expressionEnd = 0, expressionNum = 0;
while ( ( x = buf.indexOf( "${", x ) ) >= 0 && ( y = buf.indexOf( "}", x ) + 1 ) > 0 )
{
if ( y > expressionEnd ) // making progress
{
expressionNum = 0;
expressionEnd = y;
}
final String key = buf.substring( x + 2, y - 1 );
final int anchor = key.indexOf( ":-" );
Object value = properties.get( anchor < 0 ? key : key.substring( 0, anchor ) );
if ( value == null && anchor >= 0 )
{
value = key.substring( anchor + 2 );
}
if ( expressionNum++ >= EXPRESSION_RECURSION_LIMIT )
{
throw new ProvisionException( "Recursive configuration: " + template + " stopped at: " + buf );
}
final int len = buf.length();
if ( 0 == x && len == y && String.class != clazz && clazz.isInstance( value ) )
{
return value; // found compatible (non-String) instance in the properties!
}
buf.replace( x, y, String.valueOf( value ) );
expressionEnd += buf.length() - len;
}
return nullify( buf.toString() );
}