package com.erdaoya.springcloud.comx.schema;
import com.erdaoya.springcloud.comx.context.Context;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by xue on 12/20/16.
* 在不使用反射的情况下做到比较不方便
* TODO 优化
* 现在的做法是,令vars 以及之后每一层都 imlements Map;
* fastjson JSONPath 或可以考虑
* 或者使用 其他正则
* 下次将此修正为类 静态方法,不需要Object;
* TODO 另外,是否全部可以URLEncode 还是只有部分需要 URLEncode
*/
public class TinyTemplate {
public static String ENCODING = "UTF-8";
protected String tpl;
public TinyTemplate(String tpl) {
this.tpl = tpl;
}
// TODO 影响效率且不好调试,需要变更 java regex 库
public String render(HashMap vars, Context context, Boolean enableUrlEncode) {
String ps = "\\{(.*?)\\}";
Pattern p = Pattern.compile(ps);
Matcher m = p.matcher(tpl);
StringBuffer sb = new StringBuffer();
while (m.find()){
MatchResult mr = m.toMatchResult();
String oldTpl = tpl.substring(mr.start(1), mr.end(1));
String newTpl = replace(oldTpl, vars, enableUrlEncode, context);
m.appendReplacement(sb, newTpl);
}
m.appendTail(sb);
context.getLogger().trace("Tiny template end:" + sb);
return sb.toString();
}
private String replace(String matched, HashMap vars, Boolean enableUrlEncode, Context context) {
context.getLogger().trace("Tiny template replacing:" + matched);
String[] varSections = matched.split("\\.");
Object matchedValue = vars;
for (String key: varSections) {
if (null == matchedValue) {
context.getLogger().warn("Tiny template failed: matched null, varSection:" + key);
return "";
}
if (matchedValue instanceof Map) {
matchedValue = ((Map)matchedValue).get(key);
} else {
context.getLogger().warn("Tiny template failed: matched" + matchedValue + " varSection:" + key);
return "";
}
}
if (null != matchedValue) {
context.getLogger().trace("Tiny template got:" + matchedValue.toString());
try {
return enableUrlEncode ? URLEncoder.encode(matchedValue.toString(), ENCODING) : matchedValue.toString();
} catch (UnsupportedEncodingException ex) {
context.getLogger().warn("Tiny template UnsupportedEncodingException:"+ ex.getMessage()+ " got:" + matchedValue.toString());
return "";
}
}
return "";
}
}