in src/main/java/org/apache/commons/jxpath/util/BasicTypeConverter.java [311:423]
public Object convert(final Object object, final Class toType) {
if (object == null) {
return toType.isPrimitive() ? convertNullToPrimitive(toType) : null;
}
if (toType == Object.class) {
if (object instanceof NodeSet) {
return convert(((NodeSet) object).getValues(), toType);
}
if (object instanceof Pointer) {
return convert(((Pointer) object).getValue(), toType);
}
return object;
}
final Class useType = TypeUtils.wrapPrimitive(toType);
final Class fromType = object.getClass();
if (useType.isAssignableFrom(fromType)) {
return object;
}
if (fromType.isArray()) {
final int length = Array.getLength(object);
if (useType.isArray()) {
final Class cType = useType.getComponentType();
final Object array = Array.newInstance(cType, length);
for (int i = 0; i < length; i++) {
final Object value = Array.get(object, i);
Array.set(array, i, convert(value, cType));
}
return array;
}
if (Collection.class.isAssignableFrom(useType)) {
final Collection collection = allocateCollection(useType);
for (int i = 0; i < length; i++) {
collection.add(Array.get(object, i));
}
return unmodifiableCollection(collection);
}
if (length > 0) {
final Object value = Array.get(object, 0);
return convert(value, useType);
}
return convert("", useType);
}
if (object instanceof Collection) {
final int length = ((Collection) object).size();
if (useType.isArray()) {
final Class cType = useType.getComponentType();
final Object array = Array.newInstance(cType, length);
final Iterator it = ((Collection) object).iterator();
for (int i = 0; i < length; i++) {
final Object value = it.next();
Array.set(array, i, convert(value, cType));
}
return array;
}
if (Collection.class.isAssignableFrom(useType)) {
final Collection collection = allocateCollection(useType);
collection.addAll((Collection) object);
return unmodifiableCollection(collection);
}
if (length > 0) {
Object value;
if (object instanceof List) {
value = ((List) object).get(0);
} else {
final Iterator it = ((Collection) object).iterator();
value = it.next();
}
return convert(value, useType);
}
return convert("", useType);
}
if (object instanceof NodeSet) {
return convert(((NodeSet) object).getValues(), useType);
}
if (object instanceof Pointer) {
return convert(((Pointer) object).getValue(), useType);
}
if (useType == String.class) {
return object.toString();
}
if (object instanceof Boolean) {
if (Number.class.isAssignableFrom(useType)) {
return allocateNumber(useType, ((Boolean) object).booleanValue() ? 1 : 0);
}
if ("java.util.concurrent.atomic.AtomicBoolean".equals(useType.getName())) {
try {
return useType.getConstructor(new Class[] { boolean.class }).newInstance(object);
} catch (final Exception e) {
throw new JXPathTypeConversionException(useType.getName(), e);
}
}
}
if (object instanceof Number) {
final double value = ((Number) object).doubleValue();
if (useType == Boolean.class) {
return value == 0.0 ? Boolean.FALSE : Boolean.TRUE;
}
if (Number.class.isAssignableFrom(useType)) {
return allocateNumber(useType, value);
}
}
if (object instanceof String) {
final Object value = convertStringToPrimitive(object, useType);
if (value != null) {
return value;
}
}
final Converter converter = ConvertUtils.lookup(useType);
if (converter != null) {
return converter.convert(useType, object);
}
throw new JXPathTypeConversionException("Cannot convert " + object.getClass() + " to " + useType);
}