in maven-project/src/main/java/org/apache/maven/project/interpolation/StringSearchModelInterpolator.java [147:330]
private void traverseObjectWithParents( Class<?> cls, Object target )
throws ModelInterpolationException
{
if ( cls == null )
{
return;
}
if ( cls.isArray() )
{
evaluateArray( target );
}
else if ( isQualifiedForInterpolation( cls ) )
{
Field[] fields = (Field[]) fieldsByClass.get( cls );
if ( fields == null )
{
fields = cls.getDeclaredFields();
fieldsByClass.put( cls, fields );
}
for ( int i = 0; i < fields.length; i++ )
{
Class<?> type = fields[i].getType();
if ( isQualifiedForInterpolation( fields[i], type ) )
{
boolean isAccessible = fields[i].isAccessible();
fields[i].setAccessible( true );
try
{
try
{
if ( String.class == type )
{
String value = (String) fields[i].get( target );
if ( value != null )
{
String interpolated = modelInterpolator.interpolateInternal( value, valueSources, postProcessors, debugEnabled );
if ( !interpolated.equals( value ) )
{
fields[i].set( target, interpolated );
}
}
}
else if ( Collection.class.isAssignableFrom( type ) )
{
Collection<Object> c = (Collection<Object>) fields[i].get( target );
if ( c != null && !c.isEmpty() )
{
List<Object> originalValues = new ArrayList<Object>( c );
try
{
c.clear();
}
catch( UnsupportedOperationException e )
{
if ( debugEnabled && logger != null )
{
logger.debug( "Skipping interpolation of field: " + fields[i] + " in: " + cls.getName() + "; it is an unmodifiable collection." );
}
continue;
}
for ( Object value : originalValues )
{
if ( value != null )
{
if( String.class == value.getClass() )
{
String interpolated = modelInterpolator.interpolateInternal( (String) value, valueSources, postProcessors, debugEnabled );
if ( !interpolated.equals( value ) )
{
c.add( interpolated );
}
else
{
c.add( value );
}
}
else
{
c.add( value );
if ( value.getClass().isArray() )
{
evaluateArray( value );
}
else
{
interpolationTargets.add( value );
}
}
}
else
{
// add the null back in...not sure what else to do...
c.add( value );
}
}
}
}
else if ( Map.class.isAssignableFrom( type ) )
{
Map<Object, Object> m = (Map<Object, Object>) fields[i].get( target );
if ( m != null && !m.isEmpty() )
{
for ( Map.Entry<Object, Object> entry : m.entrySet() )
{
Object value = entry.getValue();
if ( value != null )
{
if( String.class == value.getClass() )
{
String interpolated = modelInterpolator.interpolateInternal( (String) value, valueSources, postProcessors, debugEnabled );
if ( !interpolated.equals( value ) )
{
try
{
entry.setValue( interpolated );
}
catch( UnsupportedOperationException e )
{
if ( debugEnabled && logger != null )
{
logger.debug( "Skipping interpolation of field: " + fields[i] + " (key: " + entry.getKey() + ") in: " + cls.getName() + "; it is an unmodifiable collection." );
}
continue;
}
}
}
else
{
if ( value.getClass().isArray() )
{
evaluateArray( value );
}
else
{
interpolationTargets.add( value );
}
}
}
}
}
}
else
{
Object value = fields[i].get( target );
if ( value != null )
{
if ( fields[i].getType().isArray() )
{
evaluateArray( value );
}
else
{
interpolationTargets.add( value );
}
}
}
}
catch ( IllegalArgumentException e )
{
throw new ModelInterpolationException( "Failed to interpolate field: " + fields[i] + " on class: " + cls.getName(), e );
}
catch ( IllegalAccessException e )
{
throw new ModelInterpolationException( "Failed to interpolate field: " + fields[i] + " on class: " + cls.getName(), e );
}
}
finally
{
fields[i].setAccessible( isAccessible );
}
}
}
traverseObjectWithParents( cls.getSuperclass(), target );
}
}