public static Object convertValue()

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;
    }