package com.vci.server.common; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import freemarker.core.TemplateElement; import freemarker.template.Configuration; import freemarker.template.Template; public class FreeMarkerCommon { /** * 根据模板属性配置的规则获取解析后的值 *

Description:

* @author ligang * @time 2012-11-27 * @param rootMap 属性值的组合 * @param ruleInfo 规则 * @return * @throws Exception * @throws IOException */ static String CLASS_NAME=""; static String METHOD_NAME =""; static String PARAMATER_VALUE = ""; private final static String PACKAGENAME= "com.vci.freemaker"; public final static String SPLIT_PARAMERS="&"; public static final String SPLIT_TODO = "#"; /** * ${attrName}-${attrName?className&methodName¶m1,param2....} * ${身份证号}-${学历列表}-${加工方法#className&methodName&车,铣} */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static String getValueByTempRule(Map rootMap,String attrRule) { List keys = getFreemarkExpressionKey(attrRule); Map map = constructExpressionMap(keys); for (String key : keys) { if (map.keySet().contains(key)) { attrRule = attrRule.replaceAll(key, map.get(key)); } } map.keySet(); String formateAttrRule = checkDataParamers(rootMap,attrRule); if(formateAttrRule.length()= 0 && end < len){ key = field.substring(begin + 2, end); if (key == null || key.trim().equals("")) { return false; } field = field.substring(end + 1); begin = field.indexOf("${"); end = field.indexOf("}"); len = field.length(); res = true; } if (key == null || key.trim().equals("")) { return false; } return res; } catch (Exception e) { return false; } } public static List getFreemarkExpressionKey(String expression) { List list = new ArrayList(); try { String field = expression; int begin = field.indexOf("${"); int end = field.indexOf("}"); int len = field.length(); String key = null; while(!"".equals(field) && begin >= 0 && end < len){ key = field.substring(begin + 2, end); if (key != null && !key.trim().equals("")) { list.add(key); } field = field.substring(end + 1); begin = field.indexOf("${"); end = field.indexOf("}"); len = field.length(); } } catch (Exception e) { e.printStackTrace(); } return list; } public static Map constructExpressionMap(List list) { Map map = new HashMap(); for (String key : list) { if (key.indexOf(".") < 0) { continue; } map.put(key.replace(".", "_"), key); map.put(key, key.replace(".", "_")); } return map; } public static Map convertValueMapToFPOMap(Map map){ Map rootMap = new LinkedHashMap(); Iterator it = map.keySet().iterator(); while(it.hasNext()){ String key = it.next(); String value = map.get(key); if(value == null){ value = ""; } String newKey = key.replace(".", "_"); FreemarkerParamObject fpo = new FreemarkerParamObject(newKey, value); rootMap.put(newKey, fpo); } return rootMap; } public String getValByRule(Template t,Map rootMap,String attrRule,Configuration cfg) { Writer out = new StringWriter(); try { t = new Template("name", new StringReader(attrRule),cfg); t.process(rootMap, out); } catch(Exception ex){ out = new StringWriter(); ((StringWriter)out).write(attrRule); //((StringWriter)out).write(""); ex.printStackTrace(); } return out.toString(); } private void checkAllKeyInMap(Map rootMap,String attrRule){ String field = attrRule; int begin = field.indexOf("${"); int end = field.indexOf("}"); int len = field.length(); String key = ""; while(!"".equals(field) && begin >= 0 && end < len){ key = field.substring(begin + 2, end); if(!rootMap.containsKey(key)){ rootMap.put(key, new FreemarkerParamObject(key, "${"+key+"}")); //rootMap.put(key, new FreemarkerParamObject(key, "")); } field = field.substring(end + 1); begin = field.indexOf("${"); end = field.indexOf("}"); len = field.length(); } } public String getRusultByTempRule(Map rootMap,String attrRule) { checkAllKeyInMap(rootMap, attrRule); Configuration cfg = new Configuration(); Template t; String ruleVal = ""; try { String result = "";//组合规则的结果 t = new Template("name", new StringReader(attrRule),cfg); TemplateElement templateElement = t.getRootTreeNode(); String[] elementValue = new String[templateElement.getChildCount()];//组合规则中各元素的值 int index = 0; String a = ""; Map connMap = new HashMap();//存储连接符的对象 for (@SuppressWarnings("rawtypes") Enumeration children = templateElement.children(); children.hasMoreElements();) { Object object = children.nextElement(); String realVal = object.toString(); String str = getValByRule(t,rootMap, realVal,cfg);//获取组合规则对应的值 if (str.equals("")) { a = "str"; } //如果是模板属性规则 if(realVal.contains("${")) { result += str; elementValue[index] = str; } else {//连接符的处理 if (a.equals("")) { result += realVal; elementValue[index] = realVal; connMap.put(index, realVal); }else { a = ""; result += realVal; elementValue[index] = realVal; connMap.put(index, realVal); } } index++; } if(elementValue.length <= 0) { result = getValByRule(t,rootMap, attrRule,cfg);//获取组合规则对应的值 return result; } ruleVal = getResult(elementValue,result,connMap); } catch (IOException e) { e.printStackTrace(); } return ruleVal; } private String getResult(String[] elementValue,String result,Map connMap) { //获取需要过滤掉的关键字 String filetVal = "";//ConfigUtils.getConfigValue("Special.data.filter"); String ruleVal = ""; //对根据组合规则获取的值进行处理,过滤掉值为无的数据 for(int k = 0;k < elementValue.length;k++) { if(k == 0 && !elementValue[k].equals("") && filetVal.contains(elementValue[k])) { result = connMap.containsKey(k+1) ? result.replaceFirst(elementValue[k], "").replaceFirst(connMap.get(k+1), "") : result.replaceFirst(elementValue[k], ""); } else if(k != elementValue.length - 1 && !elementValue[k].equals("") && filetVal.contains(elementValue[k])) { int index = result.indexOf(elementValue[k]); String newResult = result.replaceFirst(elementValue[k], ""); if(index == 0 && connMap.containsKey(k-1)) {//如果为0,标示第一个节点是无 index = connMap.get(k-1).length(); } result = newResult.length() > 0 && connMap.containsKey(k-1) ? newResult.substring(0,index - connMap.get(k-1).length()) + newResult.substring(index) :newResult ; } else if(k == elementValue.length - 1 && !elementValue[k].equals("") && filetVal.contains(elementValue[k])) { result = result.replaceFirst(elementValue[k], ""); result = result.length() > 0 && connMap.containsKey(k-1) ? result.substring(0,result.length() - (connMap.get(k-1).length())) :result.replaceFirst(elementValue[k], "") ; } } ruleVal = result; return ruleVal; } /** * 检查是否存在需要被特殊处理的属性信息 *

Description:

* @time 2013-7-17 * @param attrRuleParamers:纯文本组合: ${attrName}-${attrName#className&methodName¶m1,param2....} * 取子串处理:${attrName}-${attrName?subString(0,1)#className&methodName¶m1,param2....} * @return 组合规则信息 */ private static String checkDataParamers(Map rootMap,String attrRuleParamers){ StringBuilder result = new StringBuilder(); StringBuilder atrrValue= new StringBuilder(); String[] attrArrays = attrRuleParamers.split("-"); for(int i = 0 ; i1){ String attrAllName = ontAttrArray[0]; int start = attrAllName.indexOf("${"); int end = attrAllName.length(); if(attrAllName.contains("?")){ end = attrAllName.lastIndexOf("?"); } String attrName = attrAllName.substring(start+2,end); String[] classMthodPara = ontAttrArray[1].split("&"); if(classMthodPara.length>2){// 包含类,方法,参数信息 CLASS_NAME = classMthodPara[0]; METHOD_NAME = classMthodPara[1]; String[] attrVal = classMthodPara[2].split("}"); boolean isShowSubString = true; atrrValue.append(attrName).append("=").append(attrVal[0]); //处理含有截取子串的规则中,如果输入的数据值在该属性不需要显示的属性值范围内,则是组合规则编程纯文本的组合方式 if(attrAllName.contains("?")){ String attrValInput = rootMap.get(attrName).getValue(); String[] methodParams = attrVal[0].split(","); for(String notShowAttr:methodParams){ if(attrValInput.equals(notShowAttr) ||attrValInput.equals("")){ String rightAttr = attrAllName.substring(0, attrAllName.lastIndexOf("?")); isShowSubString = false; attrArrays[i] = rightAttr+"}"; break; } } } if(isShowSubString){ attrArrays[i] = attrAllName+"}"; } atrrValue.append("&"); } } result.append(attrArrays[i]).append("-"); } if(atrrValue.length()>1){ PARAMATER_VALUE = atrrValue.substring(0,atrrValue.lastIndexOf("&")); } if(result.length()>1){ return result.substring(0,result.lastIndexOf("-")); } return ""; } private static Object getDateDetail(Map rootMap){ Object result = new Object(); try { Class className = Class.forName(PACKAGENAME+"."+CLASS_NAME); Object object = className.newInstance(); Method method = getMethod(className); if(method != null){ result = method.invoke(object, rootMap,PARAMATER_VALUE); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return result; } private static Method getMethod(Class className){ Method method = null; ArrayList> paramerClass = new ArrayList>(); paramerClass.add(Map.class); paramerClass.add(String.class); try { method = className.getMethod(METHOD_NAME, paramerClass.toArray(new Class[]{})); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return method; } public static void main(String[] args){ // Map rootMap = new HashMap(); // rootMap.put("a", new FreemarkerParamObject("a","a")); // rootMap.put("b", new FreemarkerParamObject("b","b")); // rootMap.put("c", new FreemarkerParamObject("c","c")); // rootMap.put("d", new FreemarkerParamObject("d","d")); // rootMap.put("a.b.c.d", new FreemarkerParamObject("a.b.c.d","a.b.c.dval")); // String rule = "${a} ${b} ${c} ${d} ${e} ${x.y.z} xxx ${a.b.c.d}"; // String res = new FreeMarkerCommon().getRusultByTempRule(rootMap, rule); // System.out.println("rule:" + rule); // System.out.println(" res:" + res); String abc = "${t_oid_a}(${t_oid_b})${c}"; Map map = new HashMap(); map.put("t_oid.a", "eddie"); map.put("t_oid.b", "1972"); map.put("c", "c"); boolean is = FreeMarkerCommon.isFreemarkExpression(abc); if (is) { Map ff = FreeMarkerCommon.convertValueMapToFPOMap(map); String value = FreeMarkerCommon.getValueByTempRule(ff, abc); //System.out.println(value); } } }