1 /*************************************************
2 * Copyright (c) Shen Li. All rights reserved. *
3 * http://joyaop.sourceforge.net *
4 * -------------------------------------------- *
5 * Distributable under LGPL license. *
6 * See terms of license at gnu.org. *
7 ************************************************/
8 package net.sf.joyaop.impl;
9
10 import net.sf.cglib.proxy.MethodInterceptor;
11 import net.sf.cglib.proxy.MethodProxy;
12 import net.sf.joyaop.AspectRuntimeException;
13
14 import java.io.Serializable;
15 import java.lang.reflect.Method;
16 import java.util.List;
17
18 /***
19 * @see net.sf.cglib.proxy.MethodInterceptor
20 *
21 * @author Shen Li
22 */
23 public class InvocationHandler implements MethodInterceptor, Serializable {
24 private static final long serialVersionUID = 0;
25 private List interceptorAspectInstances;
26 private RuntimeInstance targetInstance;
27
28 public InvocationHandler(List interceptorInstances) {
29 this.interceptorAspectInstances = interceptorInstances;
30 }
31
32 public InvocationHandler(List interceptorInstances, RuntimeInstance targetInstance) {
33 this.interceptorAspectInstances = interceptorInstances;
34 this.targetInstance = targetInstance;
35 }
36
37 public Object intercept(Object proxy, Method method, Object[] arguments, MethodProxy methodProxy) throws Throwable {
38 InvocationImpl invocation = InvocationImpl.getCurrentInvocation();
39 if (invocation == null) {
40 invocation = new InvocationImpl();
41 InvocationImpl.setCurrentInvocation(invocation);
42 } else if (invocation.isDirty()) {
43 if (method == invocation.getMethod()) {
44 if (!invocation.allowRecursion()) {
45 throw new AspectRuntimeException("You have recursively invoked the method "
46 + method.getName() + ", it will cause stack to be overflow.");
47 }
48 if (invocation.isOnInterceptor()) {
49 return invocation.proceed();
50 }
51 }
52 Object[] oldArguments = invocation.getArguments();
53 short oldInterceptorIndex = invocation.getCurrentInterceptorIndex();
54 Method oldMethod = invocation.getMethod();
55 MethodProxy oldMethodProxy = invocation.getMethodProxy();
56 Object oldProxy = invocation.getProxy();
57 List oldInterceptorAspectInstances = invocation.getInterceptorAspectInstances();
58 RuntimeInstance oldTargetAspectInstance = invocation.getTargetInstance();
59 invocation.setArguments(arguments);
60 invocation.resetCurrentInterceptorIndex();
61 invocation.setInterceptorAspectInstances(interceptorAspectInstances);
62 invocation.setMethod(method);
63 invocation.setMethodProxy(methodProxy);
64 invocation.setTargetInstance(targetInstance);
65 invocation.setProxy(proxy);
66
67 try {
68 return invocation.proceed();
69 } finally {
70 invocation.setArguments(oldArguments);
71 invocation.setCurrentInterceptorIndex(oldInterceptorIndex);
72 invocation.setInterceptorAspectInstances(oldInterceptorAspectInstances);
73 invocation.setMethod(oldMethod);
74 invocation.setMethodProxy(oldMethodProxy);
75 invocation.setTargetInstance(oldTargetAspectInstance);
76 invocation.setProxy(oldProxy);
77 }
78 }
79
80 invocation.setArguments(arguments);
81 invocation.resetCurrentInterceptorIndex();
82 invocation.setInterceptorAspectInstances(interceptorAspectInstances);
83 invocation.setMethod(method);
84 invocation.setMethodProxy(methodProxy);
85 invocation.setTargetInstance(targetInstance);
86 invocation.setProxy(proxy);
87 return invocation.proceed();
88 }
89 }