package net.ion.craken.node.crud.bean;
import java.util.Map;
import java.util.Map.Entry;
import net.ion.craken.node.ReadNode;
import net.ion.craken.node.convert.bean.ProxyBean;
import net.ion.craken.node.convert.bean.TypeStrategy;
import net.ion.framework.parse.gson.JsonParser;
import net.ion.framework.util.MapUtil;
public interface ToBeanStrategy {
public final static ToBeanStrategy EasyByJson = new JsonStrategy() ;
public final static ToBeanStrategy ProxyByCGLib = new ProxyByCGLib() ;
public <T> T toBean(ReadNode node, Class<T> clz) ;
}
class ProxyByCGLib implements ToBeanStrategy {
@Override
public <T> T toBean(ReadNode node, Class<T> clz) {
return ProxyBean.create(TypeStrategy.DEFAULT, node, clz) ;
}
}
class JsonStrategy implements ToBeanStrategy {
@Override
public <T> T toBean(ReadNode node, Class<T> clz) {
final Map<String, Object> map = removeKeyPrefix(node.toPropertyMap(1));
return JsonParser.fromObject(map).getAsJsonObject().getAsObject(clz) ;
}
private Map<String, Object> removeKeyPrefix(Map<String, Object> inner){
Map<String, Object> result = MapUtil.newMap() ;
for (Entry<String, Object> entry : inner.entrySet()) {
String modKey = (entry.getKey().startsWith("#") || entry.getKey().startsWith("@")) ? entry.getKey().substring(1) : entry.getKey() ;
result.put(modKey, (entry.getValue() instanceof Map) ? removeKeyPrefix((Map<String, Object>)entry.getValue()) : entry.getValue()) ;
}
return result ;
}
}