package org.nutz.el.opt.object; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Queue; import org.nutz.el.ElException; import org.nutz.el.Operator; import org.nutz.el.obj.MethodObj; import org.nutz.el.opt.RunMethod; import org.nutz.el.opt.TwoTernary; import org.nutz.el.opt.custom.CustomMake; /** * 方法体封装. * 主要是把方法的左括号做为边界 * @author juqkai(juqkai@gmail.com) * */ public class MethodOpt extends TwoTernary { private int size = 0; public void setSize(int size) { this.size = size; } public int getSize() { return size; } public int fetchPriority() { return 1; } public void wrap(Queue<Object> rpn) { if(getSize() <= 0){ left = rpn.poll(); } else { right = rpn.poll(); left = rpn.poll(); } } public Object calculate(){ return fetchMethod().run(fetchParam()); } private RunMethod fetchMethod(){ if(!(left instanceof AccessOpt)){ if (left instanceof MethodObj) { final Object val = ((MethodObj)left).fetchVal(); if (val != null) { if (val instanceof Method) { return new CustomMake.StaticMethodRunMethod((Method)val); } else if (val instanceof RunMethod) { return (RunMethod)val; } else { throw new ElException("must be Method or RunMethod, key="+left); } } } RunMethod run = CustomMake.me().make(left.toString()); if (run == null) throw new ElException("no such key="+left); return run; } return (AccessOpt) left; } /** * 取得方法执行的参数 * @return */ @SuppressWarnings("unchecked") private List<Object> fetchParam(){ List<Object> rvals = new ArrayList<Object>(); if(right != null){ if(right instanceof CommaOpt){ rvals = (List<Object>) ((CommaOpt) right).calculate(); } else { rvals.add(calculateItem(right)); } } if(!rvals.isEmpty()){ for(int i = 0; i < rvals.size(); i ++){ if(rvals.get(i) instanceof Operator){ rvals.set(i, ((Operator)rvals.get(i)).calculate()); } } } return rvals; } public String fetchSelf() { return "method"; } public String toString() { return super.toString() + "(" + size + ")"; } }