public static boolean isConvertable()

in axis-rt-core/src/main/java/org/apache/axis/utils/JavaUtils.java [536:670]


    public static boolean isConvertable(Object obj, Class dest, boolean isEncoded)
    {
        Class src = null;
        
        if (obj != null) {
            if (obj instanceof Class) {
                src = (Class)obj;
            } else {
                src = obj.getClass();
            }
        } else {
            if(!dest.isPrimitive())
                return true;
        }
        
        if (dest == null)
            return false;
        
        if (src != null) {
            // If we're directly assignable, we're good.
            if (dest.isAssignableFrom(src))
                return true;

            //Allow mapping of Map's to Map's
            if (java.util.Map.class.isAssignableFrom(dest) &&
                java.util.Map.class.isAssignableFrom(src)) {
                  return true;
            }

            // If it's a wrapping conversion, we're good.
            if (getWrapperClass(src) == dest)
                return true;
            if (getWrapperClass(dest) == src)
                return true;
            
            // If it's List -> Array or vice versa, we're good.
            if ((Collection.class.isAssignableFrom(src) || src.isArray()) &&
                (Collection.class.isAssignableFrom(dest) || dest.isArray()) &&
                (src.getComponentType() == Object.class || 
                 src.getComponentType() == null ||
                 dest.getComponentType() == Object.class ||
                 dest.getComponentType() == null ||
                 isConvertable(src.getComponentType(), dest.getComponentType())))
                    return true;
            
            // If destination is an array, and src is a component, we're good
            // if we're not encoded!
            if (!isEncoded && dest.isArray() &&
//                !dest.getComponentType().equals(Object.class) &&
                dest.getComponentType().isAssignableFrom(src)) 
                return true;

            if ((src == HexBinary.class && dest == byte[].class) ||
                (src == byte[].class && dest == HexBinary.class))
                return true;
            
            // Allow mapping of Calendar to Date
            if (Calendar.class.isAssignableFrom(src) && dest == Date.class)
                return true;

            // Allow mapping of Date to Calendar
            if (Date.class.isAssignableFrom(src) && dest == Calendar.class)
                return true;

            // Allow mapping of Calendar to java.sql.Date
            if (Calendar.class.isAssignableFrom(src) && dest == java.sql.Date.class)
                return true;
        }
        
        Class destHeld = JavaUtils.getHolderValueType(dest);
        // Can always convert a null to an empty holder
        if (src == null)
            return (destHeld != null);
        
        if (destHeld != null) {
            if (destHeld.isAssignableFrom(src) || isConvertable(src, destHeld))
                return true;
        }

        // If it's holder -> held or held -> holder, we're good
        Class srcHeld = JavaUtils.getHolderValueType(src);
        if (srcHeld != null) {
            if (dest.isAssignableFrom(srcHeld) || isConvertable(srcHeld, dest))
                return true;
        }

        // If it's a MIME type mapping and we want a DataHandler,
        // then we're good.
        if (dest.getName().equals("javax.activation.DataHandler")) {
            String name = src.getName();
            if (src == String.class
                    || src == java.awt.Image.class
                    || src == OctetStream.class
                    || name.equals("javax.mail.internet.MimeMultipart")
                    || name.equals("javax.xml.transform.Source"))
                return true;
        }

        if (src.getName().equals("javax.activation.DataHandler")) {
            if (dest ==  byte[].class)
                return true;
            if (dest.isArray() && dest.getComponentType() == byte[].class)
                return true;
        }

        if (dest.getName().equals("javax.activation.DataHandler")) {
            if (src ==  Object[].class)
                return true;
            if (src.isArray() && src.getComponentType() == Object[].class)
                return true;
        }

        if (obj instanceof java.io.InputStream) {
            if (dest ==  OctetStream.class)
                return true;
        }
        
        if (src.isPrimitive()) {
            return isConvertable(getWrapperClass(src),dest);
        }
        
        // ArrayOfT -> T[] ? 
        if (dest.isArray()) {        	
        	if (ArrayUtil.isConvertable(src, dest) == true)
        		return true;
        } 
        
        // T[] -> ArrayOfT ?
        if (src.isArray()) {
        	if (ArrayUtil.isConvertable(src, dest) == true)
        		return true;
        }
        
        return false;
    }