package com.aggrepoint.dao; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author Jiangming Yang (yangjm@gmail.com) */ public class Func { static Pattern P_FUNC = Pattern.compile(":(([\\w\\d]+)\\[(.*?)\\])"); String match; IFunc func; String[] params; protected Func(List<IFunc> funcs, Matcher m) throws FunctionNotFoundException { match = m.group(1); String funcName = m.group(2); for (IFunc f : funcs) if (f.getName().equals(funcName)) func = f; if (func == null) throw new FunctionNotFoundException(funcName); Vector<String> vec = new Vector<String>(); StringTokenizer st = new StringTokenizer(m.group(3), ","); while (st.hasMoreTokens()) vec.add(st.nextToken().trim()); params = vec.toArray(new String[vec.size()]); } public String exec(Method method, Object[] args, Annotation[][] anns) { return func.exec(method, params, args, anns); } public String getMatch() { return match; } public String getFuncName() { return func.getName(); } public static Func[] getFunctions(List<IFunc> funcs, String hql) throws FunctionNotFoundException { Vector<Func> vec = new Vector<Func>(); Matcher m = P_FUNC.matcher(hql); while (m.find()) { vec.add(new Func(funcs, m)); } if (vec.size() == 0) return null; return vec.toArray(new Func[vec.size()]); } }