/**
* $Id: MapConverter.java 2 2008-10-01 10:04:26Z azeckoski $
* $URL: http://reflectutils.googlecode.com/svn/trunk/src/main/java/org/azeckoski/reflectutils/converters/MapConverter.java $
* MapConverter.java - genericdao - Sep 9, 2008 2:04:53 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.FieldUtils;
import org.azeckoski.reflectutils.ClassFields.FieldsFilter;
import org.azeckoski.reflectutils.converters.api.InterfaceConverter;
import org.azeckoski.reflectutils.map.ArrayOrderedMap;
/**
* Map converter to handle converting things into maps,
* Can handle simple cases by stuffing them into the map with the key "data"
*
* @author Aaron Zeckoski (azeckoski @ gmail.com)
*/
@SuppressWarnings("unchecked")
public class MapConverter implements InterfaceConverter<Map> {
public Map convert(Object value) {
return convertInterface(value, ArrayOrderedMap.class);
}
protected ConstructorUtils getConstructorUtils() {
return ConstructorUtils.getInstance();
}
protected FieldUtils getFieldUtils() {
return FieldUtils.getInstance();
}
public Map convertInterface(Object value, Class<? extends Map> implementationType) {
Map convert = null;
Class<?> fromType = value.getClass();
Object toConvert = value;
if (implementationType == null || implementationType.isInterface()) {
implementationType = ArrayOrderedMap.class;
}
convert = (Map<String, Object>) getConstructorUtils().constructClass(implementationType);
if ( ConstructorUtils.isClassArray(fromType) ) {
// from array
int length = Array.getLength(toConvert);
for (int i = 0; i < length; i++) {
Object aVal = Array.get(toConvert, i);
convert.put(i+"", aVal);
}
} else if ( ConstructorUtils.isClassCollection(fromType) ) {
// from collection
int i = 0;
for (Object object : (Collection) value) {
convert.put(i+"", object);
i++;
}
} else if ( ConstructorUtils.isClassMap(fromType) ) {
// from map - this is a case where we are going from one map type to another
convert.putAll((Map)value);
} else {
// from scalar
if (ConstructorUtils.isClassSimple(fromType)) {
convert.put("data", toConvert);
} else {
// convert bean to map
convert = getFieldUtils().getFieldValues(value, FieldsFilter.COMPLETE, false);
}
}
return convert;
}
}