in modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/DataConverter.java [65:157]
public static boolean isConvertable(Object obj, Class dest) {
Class src = null;
if (obj != null) {
if (obj instanceof Class) {
src = (Class)obj;
} else {
src = obj.getClass();
}
}
if (dest == null) {
return false;
}
if (src == null) {
return true;
}
// If we're directly assignable, we're good.
if (dest.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())) {
// TODO this should consider the component types instead of returning true.
return true;
}
// Allow mapping of HashMaps to Hashtables
if (src == HashMap.class && dest == Hashtable.class)
return true;
// Allow mapping of Calendar to Date
if (Calendar.class.isAssignableFrom(src) && dest == Date.class) {
return true;
}
if (src.isPrimitive()) {
return isConvertable(getWrapperClass(src), dest);
}
if (InputStream.class.isAssignableFrom(src) && dest == byte[].class) {
return true;
}
if (Source.class.isAssignableFrom(src) && dest == byte[].class) {
return true;
}
if (DataHandler.class.isAssignableFrom(src) && isConvertable(byte[].class, dest)) {
return true;
}
if (DataHandler.class.isAssignableFrom(src) && dest == Image.class) {
return true;
}
if (DataHandler.class.isAssignableFrom(src) && dest == Source.class) {
return true;
}
if (byte[].class.isAssignableFrom(src) && dest == String.class) {
return true;
}
// If it's a MIME type mapping and we want a DataHandler,
// then we're good.
// REVIEW Do we want to support this
/*
if (dest.getName().equals("javax.activation.DataHandler")) {
String name = src.getName();
if (src == String.class
|| src == java.awt.Image.class
|| name.equals("javax.mail.internet.MimeMultipart")
|| name.equals("javax.xml.transform.Source"))
return true;
}
*/
return false;
}