package org.nutz.mapl.impl;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 递归MapList结构, 将路径与相应的值传递给子类进行处理.
* @author juqkai(juqkai@gmail.com)
*/
public abstract class MaplEach {
//路径
protected LinkedList<String> paths = new LinkedList<String>();
protected LinkedList<Integer> arrayIndex = new LinkedList<Integer>();
/**
* 转换对象
* @param obj
*/
protected void each(Object obj) {
if(obj instanceof Map){
convertMap((Map<?, ?>) obj);
} else if(obj instanceof List){
convertList((List<?>) obj);
}
}
/**
* 转换map
* @param obj
*/
private void convertMap(Map<?, ?> obj) {
for(Object key : obj.keySet()){
paths.addLast(key.toString());
DLR(fetchPath(), obj.get(key));
each(obj.get(key));
LRD(fetchPath(), obj.get(key));
paths.removeLast();
}
}
/**
* 提取路径
* @return
*/
private String fetchPath(){
StringBuffer sb = new StringBuffer();
boolean first = true;
for(String path : paths){
if(!first){
sb.append(".");
}
sb.append(path);
first = false;
}
return sb.toString();
}
/**
* 转换LIST
* @param val
*/
private void convertList(List<?> val){
if(paths.size() <= 0){
paths.add("[]");
}else{
paths.addLast(paths.removeLast() + "[]");
}
for(int i = 0; i < val.size(); i++){
arrayIndex.addLast(i);
each(val.get(i));
arrayIndex.removeLast();
}
}
/**
* 前序
* @param path
* @param item
*/
protected abstract void DLR(String path, Object item);
/**
* 后序
* @param path
* @param item
*/
protected abstract void LRD(String path, Object item);
}