content: /**
   * 
   */
  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);
  			}
  		}
  	}
  }
  