package li.aop;

import java.lang.reflect.Method;
import java.util.List;

import net.sf.cglib.proxy.MethodProxy;

/**
 * Aop方法执行链
 * 
 * @author li (limw@w.cn)
 * @version 0.1.1 (2012-09-20)
 */
public class AopChain {
	/**
	 * 目标对象
	 */
	private Object target;
	/**
	 * 方法对象
	 */
	private Method method;
	/**
	 * 参数数组
	 */
	private Object[] args;
	/**
	 * 方法返回值
	 */
	private Object result;
	/**
	 * AopFilter列表
	 */
	private List<AopFilter> filters;
	/**
	 * 方法代理
	 */
	private MethodProxy proxy;
	/**
	 * AopFilter索引
	 */
	private int index = 0;

	/**
	 * 返回被代理方法宿主对象
	 */
	public Object getTarget() {
		return this.target;
	}

	/**
	 * 返回被代理方法
	 */
	public Method getMethod() {
		return this.method;
	}

	/**
	 * 返回方法参数
	 */
	public Object[] getArgs() {
		return this.args;
	}

	/**
	 * 设置方法参数,在doChain之前才有效
	 */
	public AopChain setArgs(Object[] args) {
		this.args = args;
		return this;
	}

	/**
	 * 返回方法返回值,在方法执行后才有值
	 */
	public Object getResult() {
		return this.result;
	}

	/**
	 * 设置方法返回值,设置后不再doChain才有效
	 */
	public AopChain setResult(Object result) {
		this.result = result;
		return this;
	}

	/**
	 * 初始化一个AopChain
	 */
	public AopChain(Object target, Method method, Object[] args, List<AopFilter> filters, MethodProxy proxy) {
		this.target = target;
		this.method = method;
		this.args = args;
		this.filters = filters;
		this.proxy = proxy;
	}

	/**
	 * 执行AopChain,执行下一个AopFilter或者执行被代理方法
	 */
	public AopChain doFilter() {
		if (null == filters || index == filters.size()) {// 如果没有AopFilter或者已经经过全部AopFilter
			try {
				this.result = proxy.invokeSuper(target, args);// 则执行目标方法
			} catch (Throwable e) {
				throw new RuntimeException("May be because your AopFilter is not a Bean", e);
			}
		} else {// 还有AopFilter
			filters.get(index++).doFilter(this);// 执行第index个AopFilter然后index++
		}
		return this;
	}
}
@@ -1633,16 +1633,225 @@
 %0A%09%09%09
+invoke();// %E6%89%A7%E8%A1%8C%E7%9B%AE%E6%A0%87%E6%96%B9%E6%B3%95%0D%0A%09%09%7D else %7B// %E8%BF%98%E6%9C%89AopFilter%0D%0A%09%09%09filters.get(index++).doFilter(this);// %E6%89%A7%E8%A1%8C%E7%AC%ACindex%E4%B8%AAAopFilter%E7%84%B6%E5%90%8Eindex++%0D%0A%09%09%7D%0D%0A%09%09return this;%0D%0A%09%7D%0D%0A%0D%0A%09/**%0D%0A%09 * %E8%B7%B3%E8%BF%87%E6%89%80%E6%9C%89%E5%89%A9%E4%B8%8B%E7%9A%84%E6%8B%A6%E6%88%AA%E5%99%A8,%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E6%96%B9%E6%B3%95%0D%0A%09 */%0D%0A%09public AopChain invoke() %7B%0D%0A%09%09
 try %7B%0D%0A
-%09
 %09%09%09t
@@ -1909,17 +1909,16 @@
 %E7%9B%AE%E6%A0%87%E6%96%B9%E6%B3%95%0D%0A%09%09
-%09
 %7D catch 
@@ -1934,17 +1934,16 @@
 e e) %7B%0D%0A
-%09
 %09%09%09throw
@@ -2020,111 +2020,8 @@
 );%0D%0A
-%09%09%09%7D%0D%0A%09%09%7D else %7B// %E8%BF%98%E6%9C%89AopFilter%0D%0A%09%09%09filters.get(index++).doFilter(this);// %E6%89%A7%E8%A1%8C%E7%AC%ACindex%E4%B8%AAAopFilter%E7%84%B6%E5%90%8Eindex++%0D%0A
 %09%09%7D%0D

添加AopChain.invoke()方法