/** * */ package com.trendrr.oss.casting; import java.lang.reflect.Method; import java.util.Map; import java.util.logging.Logger; import com.trendrr.json.simple.JSONValue; import com.trendrr.oss.DynMap; import com.trendrr.oss.DynMapConvertable; /** * @author Dustin Norlander * @created Dec 29, 2010 * */ public class DynMapCaster extends TypeCaster<DynMap> { private static Logger log = Logger.getLogger(DynMapCaster.class.getCanonicalName()); /* (non-Javadoc) * @see com.trendrr.oss.casting.TypeCaster#doCast(java.lang.Class, java.lang.Object) */ @Override protected DynMap doCast(Class clss, Object object) { if (object instanceof Map) { return toDynMap((Map)object); } if (object instanceof DynMapConvertable) { return ((DynMapConvertable)object).toDynMap(); } if (object instanceof byte[]) { try { object = new String((byte[])object, "utf8"); } catch (Exception x) { } } if (object instanceof String) { //try the json simple here. try { Object obj = JSONValue.parseWithException((String)object); if (obj instanceof Map){ return toDynMap((Map)obj); } } catch (Exception x) { // log.info("Unable to parse string: " + object + " into a DynMap (" + x.getMessage() + ")"); } return null; } Class cls = object.getClass(); try { Method toMap = cls.getMethod("toMap"); Map mp = (Map)toMap.invoke(object); return toDynMap((Map)mp); } catch (NoSuchMethodException x) { //do nothing. } catch (Exception x) { log.info("toMap method didn't work for " + object + " into a DynMap (" + x.getMessage() + ")"); } return null; } private DynMap toDynMap(Map map) { if (map instanceof DynMap) { return (DynMap)map; } DynMap mp = new DynMap(); for (Object key : map.keySet()) { mp.put(key.toString(), map.get(key)); } return mp; } }