package org.nutz.mapl;
import java.io.Reader;
import java.lang.reflect.Type;
import java.util.List;
import org.nutz.mapl.impl.MaplMerge;
import org.nutz.mapl.impl.MaplRebuild;
import org.nutz.mapl.impl.compile.ObjCompileImpl;
import org.nutz.mapl.impl.convert.FilterConvertImpl;
import org.nutz.mapl.impl.convert.ObjConvertImpl;
import org.nutz.mapl.impl.convert.StructureConvert;
/**
* 集合了对象转换合并等高级操作
*
* @author juqkai(juqkai@gmail.com)
*
*/
public class Mapl {
/**
* 这个实现, 主要将 List, Map 的对象结构转换成真实的对象.
* <p>
* 规则:
* <ul>
* <li>对象以Map存储, key为属性名, value为属性值
* <li>数组以List存储
* <li>Map直接存储为Map
* <li>List直接存储为List
* <li>只要不是List, Map 存储的, 都认为是可以直接写入对象的. TODO 这点可以调整一下.
* </ul>
*/
public static Object maplistToObj(Object maplist, Type type) {
return new ObjConvertImpl(type).convert(maplist);
}
//------------------------------------------------------------------
/**
* 访问MAP, List结构的数据, 通过 uers[2].name 这种形式.
* @param maplist
* @param path 路径
*/
public static Object cell(Object maplist, String path){
MaplRebuild mr = new MaplRebuild(maplist);
return mr.cell(path);
}
// ------------------------------------------------------------------
/**
* 转换器中间对象合并器<br/>
* 合并 {@link Mapl} 中定义的中间结构.<br/>
* 规则:<br>
* <ul>
* <li>普通对象, 保存为List, 但是要去掉重复.
* <li>合并 map , 如果 key 值相同, 那么后一个值覆盖前面的值.递归合并
* <li>list不做递归合并, 只做简单的合并, 清除重复的操作.
* </ul>
*/
public static Object merge(Object... maplists) {
return MaplMerge.merge(maplists);
}
// ------------------------------------------------------------------
/**
* 包含MapList过滤器, 详情参见: {@link FilterConvertImpl}
*
* @param maplist
* maplist结构的对象
* @param paths
* 过滤列表
*/
public static Object includeFilter(Object maplist, List<String> paths) {
FilterConvertImpl filter = new FilterConvertImpl(paths);
filter.useIncludeModel();
return filter.convert(maplist);
}
/**
* 排除MapList过滤器, 详情参见: {@link FilterConvertImpl}
*
* @param maplist
* maplist结构的对象
* @param paths
* 过滤列表
*/
public static Object excludeFilter(Object maplist, List<String> paths) {
FilterConvertImpl filter = new FilterConvertImpl(paths);
filter.useExcludeModel();
return filter.convert(maplist);
}
// ------------------------------------------------------------------
/**
* 结构转换, 详情参见: {@link StructureConvert}
*
* @param maplist
* maplist结构的对象
* @param model
* 转换模板, 一个JSON格式的reader
*/
public static Object convert(Object maplist, Reader model) {
StructureConvert convert = new StructureConvert(model);
return convert.convert(maplist);
}
/**
* 结构转换, 详情参见: {@link StructureConvert}
*
* @param maplist
* maplist结构的对象
* @param model
* 转换模板, 也是一个规定格式的maplist结构
*/
public static Object convert(Object maplist, Object model) {
StructureConvert convert = new StructureConvert(model);
return convert.convert(maplist);
}
// ------------------------------------------------------------------
/**
* 将对象转换成Maplist结构
*
* @param obj
* 待转换的对象
*/
public static Object toMaplist(Object obj) {
ObjCompileImpl convert = new ObjCompileImpl();
return convert.parse(obj);
}
/**
* 添加新的结点
*
* @param obj
* 原始的MapList
* @param path
* 路径
* @param val
* 值
*/
public static void put(Object obj, String path, Object val) {
Object mapList = Mapl.toMaplist(val);
MaplRebuild rebuild = new MaplRebuild(obj);
rebuild.put(path, mapList);
}
/**
* 删除一个结点
*
* @param obj
* 原始的Maplist
* @param path
* 路径
*/
public static void del(Object obj, String path) {
MaplRebuild rebuild = new MaplRebuild(obj);
rebuild.remove(path);
}
/**
* 更新
*
* @param obj
* 原始的Maplist
* @param path
* 路径
* @param val
* 新的值
*/
public static void update(Object obj, String path, Object val) {
put(obj, path, val);
}
}