in modules/jaxws/src/org/apache/axis2/jaxws/utility/ConvertUtils.java [178:375]
public static Object convert(Object arg, Class destClass) throws WebServiceException {
if (destClass == null) {
return arg;
}
if (arg != null && destClass.isAssignableFrom(arg.getClass())) {
return arg;
}
if (log.isDebugEnabled()) {
String clsName = "null";
if (arg != null) clsName = arg.getClass().getName();
log.debug("Converting an object of type " + clsName + " to an object of type " +
destClass.getName());
}
// Convert between Calendar and Date
if (arg instanceof Calendar && destClass == Date.class) {
return ((Calendar)arg).getTime();
}
// Convert between HashMap and Hashtable
if (arg instanceof HashMap && destClass == Hashtable.class) {
return new Hashtable((HashMap)arg);
}
if (arg instanceof InputStream && destClass == byte[].class) {
try {
InputStream is = (InputStream) arg;
return getBytesFromStream(is);
} catch (IOException e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
if (arg instanceof Source && destClass == byte[].class) {
try {
if (arg instanceof StreamSource) {
InputStream is = ((StreamSource) arg).getInputStream();
if (is != null) {
return getBytesFromStream(is);
}
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
Result result = new StreamResult(out);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform((Source) arg, result);
byte[] bytes = out.toByteArray();
return bytes;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
if (arg instanceof DataHandler) {
try {
InputStream is = ((DataHandler) arg).getInputStream();
if (destClass == Image.class) {
return ImageIO.read(is);
} else if (destClass == Source.class) {
return new StreamSource(is);
}
byte[] bytes = getBytesFromStream(is);
return convert(bytes, destClass);
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
if (arg instanceof byte[] && destClass == String.class) {
return new String((byte[]) arg);
}
// If the destination is an array and the source
// is a suitable component, return an array with
// the single item.
/* REVIEW do we need to support atomic to array conversion ?
if (arg != null &&
destClass.isArray() &&
!destClass.getComponentType().equals(Object.class) &&
destClass.getComponentType().isAssignableFrom(arg.getClass())) {
Object array =
Array.newInstance(destClass.getComponentType(), 1);
Array.set(array, 0, arg);
return array;
}
*/
// Return if no conversion is available
if (!(arg instanceof Collection ||
(arg != null && arg.getClass().isArray()))) {
return arg;
}
if (arg == null) {
return null;
}
// The arg may be an array or List
Object destValue = null;
int length = 0;
if (arg.getClass().isArray()) {
length = Array.getLength(arg);
} else {
length = ((Collection)arg).size();
}
try {
if (destClass.isArray()) {
if (destClass.getComponentType().isPrimitive()) {
Object array = Array.newInstance(destClass.getComponentType(),
length);
// Assign array elements
if (arg.getClass().isArray()) {
for (int i = 0; i < length; i++) {
Array.set(array, i, Array.get(arg, i));
}
} else {
int idx = 0;
for (Iterator i = ((Collection)arg).iterator();
i.hasNext();) {
Array.set(array, idx++, i.next());
}
}
destValue = array;
} else {
Object [] array;
try {
array = (Object [])Array.newInstance(destClass.getComponentType(),
length);
} catch (Exception e) {
return arg;
}
// Use convert to assign array elements.
if (arg.getClass().isArray()) {
for (int i = 0; i < length; i++) {
array[i] = convert(Array.get(arg, i),
destClass.getComponentType());
}
} else {
int idx = 0;
for (Iterator i = ((Collection)arg).iterator();
i.hasNext();) {
array[idx++] = convert(i.next(),
destClass.getComponentType());
}
}
destValue = array;
}
} else if (Collection.class.isAssignableFrom(destClass)) {
Collection newList = null;
try {
// if we are trying to create an interface, build something
// that implements the interface
if (destClass == Collection.class || destClass == List.class) {
newList = new ArrayList();
} else if (destClass == Set.class) {
newList = new HashSet();
} else {
newList = (Collection)destClass.newInstance();
}
} catch (Exception e) {
// No FFDC code needed
// Couldn't build one for some reason... so forget it.
return arg;
}
if (arg.getClass().isArray()) {
for (int j = 0; j < length; j++) {
newList.add(Array.get(arg, j));
}
} else {
for (Iterator j = ((Collection)arg).iterator();
j.hasNext();) {
newList.add(j.next());
}
}
destValue = newList;
} else {
destValue = arg;
}
} catch (Throwable t) {
throw ExceptionFactory.
makeWebServiceException(
Messages.getMessage("convertUtils",
arg.getClass().toString(),
destClass.toString()),
t);
}
return destValue;
}