/**
* $Id: ArrayConverter.java 2 2008-10-01 10:04:26Z azeckoski $
* $URL: http://reflectutils.googlecode.com/svn/trunk/src/main/java/org/azeckoski/reflectutils/converters/ArrayConverter.java $
* ArrayConverter.java - genericdao - Sep 10, 2008 1:36:28 PM - azeckoski
**************************************************************************
* Copyright (c) 2008 Aaron Zeckoski
* Licensed under the Apache License, Version 2.0
*
* A copy of the Apache License has been included in this
* distribution and is available at: http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Aaron Zeckoski (azeckoski @ gmail.com) (aaronz @ vt.edu) (aaron @ caret.cam.ac.uk)
*/
package org.azeckoski.reflectutils.converters;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
import org.azeckoski.reflectutils.ConstructorUtils;
import org.azeckoski.reflectutils.ConversionUtils;
import org.azeckoski.reflectutils.converters.api.VariableConverter;
/**
* Handles conversions to arrays from various types (including other arrays),
* also handles the special case of a comma separated list of strings which
* it will attempt to convert into an array of strings or whatever was requested
*
* @author Aaron Zeckoski (azeckoski @ gmail.com)
*/
public class ArrayConverter implements VariableConverter {
/* (non-Javadoc)
* @see org.azeckoski.reflectutils.converters.api.VariableConverter#canConvert(java.lang.Object, java.lang.Class)
*/
public boolean canConvert(Object value, Class<?> toType) {
if ( ConstructorUtils.isClassArray(toType)) {
return true;
}
return false;
}
protected ConversionUtils getConversionUtils() {
return ConversionUtils.getInstance();
}
/* (non-Javadoc)
* @see org.azeckoski.reflectutils.converters.api.VariableConverter#convert(java.lang.Object, java.lang.Class)
*/
@SuppressWarnings("unchecked")
public <T> T convert(Object value, Class<T> toType) {
T convert = null;
Class<?> fromType = value.getClass();
Object toConvert = value;
Class<?> componentType = toType.getComponentType();
if ( ConstructorUtils.isClassArray(fromType) ) {
// from array - to different type of array
int length = Array.getLength(toConvert);
convert = (T) Array.newInstance(componentType, length);
for (int i = 0; i < length; i++) {
Object object = Array.get(toConvert, i);
object = getConversionUtils().convert(object, componentType); // convert each value
Array.set(convert, i, object);
}
} else if ( ConstructorUtils.isClassCollection(fromType) ) {
// from collection
Collection collection = (Collection) toConvert;
int length = collection.size();
convert = (T) Array.newInstance(componentType, length);
int i = 0;
for (Object object : collection) {
object = getConversionUtils().convert(object, componentType); // convert each value
Array.set(convert, i, object);
i++;
}
} else if ( ConstructorUtils.isClassMap(fromType) ) {
// from map
Map map = (Map) toConvert;
int length = map.size();
convert = (T) Array.newInstance(componentType, length);
int i = 0;
for (Object object : map.values()) {
object = getConversionUtils().convert(object, componentType); // convert each value
Array.set(convert, i, object);
i++;
}
} else {
// from scalar
String valueString = toConvert.toString();
if ("".equals(valueString)) {
// empty string becomes empty array
convert = (T) Array.newInstance(componentType, 0);
} else if (valueString.indexOf(',') > 0) {
// support comma separated string to array
String[] parts = valueString.split(",");
convert = (T) Array.newInstance(componentType, parts.length);
for (int i = 0; i < parts.length; i++) {
Object object = getConversionUtils().convert(parts[i].trim(), componentType); // convert each value
Array.set(convert, i, object);
}
} else {
// just put it in the array
convert = (T) Array.newInstance(componentType, 1);
Object object = getConversionUtils().convert(toConvert, componentType); // convert each value
Array.set(convert, 0, object);
}
}
return convert;
}
}