package com.github.ompc.greys.core.util; import com.github.ompc.greys.core.exception.ExpressException; import ognl.DefaultMemberAccess; import ognl.Ognl; import ognl.OgnlContext; /** * 表达式 * Created by oldmanpushcart@gmail.com on 15/5/20. */ public interface Express { /** * 根据表达式获取值 * * @param express 表达式 * @return 表达式运算后的值 * @throws ExpressException 表达式运算出错 */ Object get(String express) throws ExpressException; /** * 根据表达式判断是与否 * * @param express 表达式 * @return 表达式运算后的布尔值 * @throws ExpressException 表达式运算出错 */ boolean is(String express) throws ExpressException; /** * 绑定对象 * * @param object 待绑定对象 * @return this */ Express bind(Object object); /** * 绑定变量 * * @param name 变量名 * @param value 变量值 * @return this */ Express bind(String name, Object value); /** * 重置整个表达式 * * @return this */ Express reset(); /** * 表达式工厂类 */ class ExpressFactory { private static final ThreadLocal<Express> expressRef = new ThreadLocal<Express>() { @Override protected Express initialValue() { return new OgnlExpress(); } }; /** * 构造表达式执行类 * * @param object 执行对象 * @return 返回表达式实现 */ public static Express newExpress(Object object) { return expressRef.get().reset().bind(object); // return new OgnlExpress().bind(object); } } class OgnlExpress implements Express { private Object bindObject; private final OgnlContext context = new OgnlContext(); @Override public Object get(String express) throws ExpressException { try { context.setMemberAccess(new DefaultMemberAccess(true)); return Ognl.getValue(express, context, bindObject); } catch (Exception e) { throw new ExpressException(express, e); } } @Override public boolean is(String express) throws ExpressException { try { final Object ret = get(express); return null != ret && ret instanceof Boolean && (Boolean) ret; } catch (Throwable t) { return false; } } @Override public Express bind(Object object) { this.bindObject = object; return this; } @Override public Express bind(String name, Object value) { context.put(name, value); return this; } @Override public Express reset() { context.clear(); return this; } } }