/**
*
*/
package org.activejpa.util;
import static org.activejpa.util.PropertyUtil.getCollectionElementType;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author ganeshs
*
*/
public class BeanUtil {
private static final Logger logger = LoggerFactory.getLogger(BeanUtil.class);
/**
* <p>Utility method that will be used to load bean from a map output of json de-serialization</p>
*
* @param model
* @param attributes
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void load(Object model, Map<String, Object> attributes) {
for (Entry<String, Object> entry : attributes.entrySet()) {
try {
Method method = PropertyUtil.getReadMethod(model, entry.getKey());
if (method == null) {
continue;
}
Type propertyType = method.getGenericReturnType() != null ? method.getGenericReturnType() : method.getReturnType();
Object property = PropertyUtil.getProperty(model, entry.getKey());
if (PropertyUtil.isSimpleProperty(entry.getValue().getClass())) {
PropertyUtil.setProperty(model, entry.getKey(), entry.getValue());
} else if (PropertyUtil.isCollectionProperty(propertyType, false)) {
// TODO Need to figure out a way to populate collection
} else if (PropertyUtil.isMapProperty(propertyType)) {
if (property == null) {
property = new HashMap();
}
loadMap((Map)property, (Map)attributes.get(entry.getKey()), getCollectionElementType(propertyType));
PropertyUtil.setProperty(model, entry.getKey(), property);
} else {
if (property == null && propertyType instanceof Class) {
property = ((Class)propertyType).newInstance();
}
load(property, (Map<String, Object>) entry.getValue());
PropertyUtil.setProperty(model, entry.getKey(), property);
}
} catch (Exception e) {
logger.warn("Failed while loading the attributes to the bean", e);
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static void loadMap(Map map, Map attributes, Class<?> elementType) throws Exception {
for (Entry entry : (Set<Entry>) attributes.entrySet()) {
if (PropertyUtil.isSimpleValueType(elementType)) {
map.put(entry.getKey(), ConvertUtil.convert(entry.getValue(), elementType));
} else {
Object value = map.get(entry.getKey());
if (value == null) {
value = elementType.newInstance();
}
load(value, (Map)entry.getValue());
map.put(entry.getKey(), value);
}
}
}
}