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