package com.jarvis.cache.script; import java.lang.reflect.Method; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.jarvis.cache.CacheUtil; import ognl.Ognl; import ognl.OgnlContext; /** * 解析JavaScript表达式 * @author jiayu.qiu */ public class OgnlParser extends AbstractScriptParser { // private static final Logger logger=Logger.getLogger(OgnlParser.class); private final ConcurrentHashMap<String, Object> expCache=new ConcurrentHashMap<String, Object>(); private final ConcurrentHashMap<String, Class<?>> funcs=new ConcurrentHashMap<String, Class<?>>(64); public OgnlParser() { } @Override public void addFunction(String name, Method method) { funcs.put(name, method.getDeclaringClass()); } @SuppressWarnings("unchecked") @Override public <T> T getElValue(String exp, Object[] arguments, Object retVal, boolean hasRetVal, Class<T> valueType) throws Exception { Object object=expCache.get(exp); if(null == object) { String className=CacheUtil.class.getName(); String exp2=exp.replaceAll("@@" + HASH + "\\(", "@" + className + "@getUniqueHashStr("); exp2=exp2.replaceAll("@@" + EMPTY + "\\(", "@" + className + "@isEmpty("); Iterator<Map.Entry<String, Class<?>>> it=funcs.entrySet().iterator(); while(it.hasNext()) { Map.Entry<String, Class<?>> entry=it.next(); className=entry.getValue().getName(); exp2=exp2.replaceAll("@@" + entry.getKey() + "\\(", "@" + className + "@" + entry.getKey() + "("); } object=Ognl.parseExpression(exp2); expCache.put(exp, object); } OgnlContext context=new OgnlContext(); context.put(ARGS, arguments); if(hasRetVal) { context.put(RET_VAL, retVal); } context.setRoot(arguments); Object res=Ognl.getValue(object, context, context.getRoot(), valueType); return (T)res; } }