in src/main/java/org/apache/commons/ognl/OgnlOps.java [660:779]
public static <T> Object convertValue( Object value, Class<T> toType, boolean preventNulls )
{
Object result = null;
if ( value != null && toType.isAssignableFrom( value.getClass() ) )
{
return value;
}
if ( value != null )
{
/* If array -> array then convert components of array individually */
boolean classIsArray = value.getClass().isArray();
boolean toTypeIsArray = toType.isArray();
if ( classIsArray && toTypeIsArray)
{
Class<?> componentType = toType.getComponentType();
result = Array.newInstance( componentType, Array.getLength( value ) );
for ( int i = 0, icount = Array.getLength( value ); i < icount; i++ )
{
Array.set( result, i, convertValue( Array.get( value, i ), componentType ) );
}
}
else if ( classIsArray && !toTypeIsArray)
{
return convertValue( Array.get( value, 0 ), toType );
}
else if ( toTypeIsArray )
{
if ( toType.getComponentType() == Character.TYPE )
{
result = stringValue( value ).toCharArray();
}
else if ( toType.getComponentType() == Object.class )
{
return new Object[] { value };
}
}
else
{
if ( ( toType == Integer.class ) || ( toType == Integer.TYPE ) )
{
result = (int) longValue( value );
}
else if ( ( toType == Double.class ) || ( toType == Double.TYPE ) )
{
result = doubleValue( value );
}
else if ( ( toType == Boolean.class ) || ( toType == Boolean.TYPE ) )
{
result = booleanValue( value ) ? Boolean.TRUE : Boolean.FALSE;
}
else if ( ( toType == Byte.class ) || ( toType == Byte.TYPE ) )
{
result = (byte) longValue( value );
}
else if ( ( toType == Character.class ) || ( toType == Character.TYPE ) )
{
result = (char) longValue( value );
}
else if ( ( toType == Short.class ) || ( toType == Short.TYPE ) )
{
result = (short) longValue( value );
}
else if ( ( toType == Long.class ) || ( toType == Long.TYPE ) )
{
result = longValue( value );
}
else if ( ( toType == Float.class ) || ( toType == Float.TYPE ) )
{
result = new Float( doubleValue( value ) );
}
else if ( toType == BigInteger.class )
{
result = bigIntValue( value );
}
else if ( toType == BigDecimal.class )
{
result = bigDecValue( value );
}
else if ( toType == String.class )
{
result = stringValue( value );
}
}
}
else
{
if ( toType.isPrimitive() )
{
result = OgnlRuntime.getPrimitiveDefaultValue( toType );
}
else if ( preventNulls && toType == Boolean.class )
{
result = Boolean.FALSE;
}
else if ( preventNulls && Number.class.isAssignableFrom( toType ) )
{
result = OgnlRuntime.getNumericDefaultValue( toType );
}
}
if ( result == null && preventNulls )
{
return value;
}
if ( value != null && result == null )
{
throw new IllegalArgumentException( "Unable to convert type " + value.getClass().getName() + " of " + value
+ " to type of " + toType.getName() );
}
return result;
}