1 22 package org.jboss.aop.advice; 23 24 import org.jboss.aop.Advised; 25 import org.jboss.aop.Advisor; 26 import org.jboss.aop.InstanceAdvisor; 27 import org.jboss.aop.joinpoint.CallerInvocation; 28 import org.jboss.aop.joinpoint.ConstructorCalledByMethodInvocation; 29 import org.jboss.aop.joinpoint.Invocation; 30 import org.jboss.aop.joinpoint.MethodCalledByMethodInvocation; 31 import org.jboss.aop.proxy.container.ClassProxyContainer; 32 import org.jboss.aop.proxy.container.ContainerProxyMethodInvocation; 33 34 40 public class PerInstanceInterceptor implements Interceptor 41 { 42 AspectDefinition aspectDefinition; 43 44 public PerInstanceInterceptor(AspectDefinition a, Advisor advisor) 45 { 46 aspectDefinition = a; 47 advisor.addPerInstanceAspect(a); 48 } 49 50 public String getName() 51 { 52 return aspectDefinition.getName(); 53 } 54 55 public Object invoke(Invocation invocation) throws Throwable 56 { 57 if (invocation instanceof CallerInvocation) 58 { 59 Object callingObject = null; 62 63 if (invocation instanceof ConstructorCalledByMethodInvocation) 64 { 65 callingObject = ((ConstructorCalledByMethodInvocation)invocation).getCallingObject(); 66 } 67 else if (invocation instanceof MethodCalledByMethodInvocation) 68 { 69 callingObject = ((MethodCalledByMethodInvocation)invocation).getCallingObject(); 70 } 71 72 if (callingObject == null) return invocation.invokeNext(); 74 Advised advised = (Advised) callingObject; 75 InstanceAdvisor advisor = advised._getInstanceAdvisor(); 76 Interceptor interceptor = (Interceptor) advisor.getPerInstanceAspect(aspectDefinition); 77 return interceptor.invoke(invocation); 78 79 } 80 else 81 { 82 Object targetObject = invocation.getTargetObject(); 83 if (targetObject == null) return invocation.invokeNext(); 85 InstanceAdvisor instanceAdvisor = null; 86 if (targetObject instanceof Advised) 87 { 88 Advised advised = (Advised) targetObject; 89 instanceAdvisor = advised._getInstanceAdvisor(); 90 } 91 else 92 { 93 Advisor advisor = invocation.getAdvisor(); 94 if (advisor == null) 95 { 96 return invocation.invokeNext(); 97 } 98 99 if (advisor instanceof InstanceAdvisor) 100 { 101 instanceAdvisor = (InstanceAdvisor) advisor; 102 } 103 else 104 { 105 if (advisor instanceof ClassProxyContainer && invocation instanceof ContainerProxyMethodInvocation) 106 { 107 ContainerProxyMethodInvocation pi = (ContainerProxyMethodInvocation)invocation; 108 instanceAdvisor = pi.getProxy().getInstanceAdvisor(); 109 } 110 else 111 { 112 return invocation.invokeNext(); 113 } 114 } 115 } 116 Interceptor interceptor = (Interceptor) instanceAdvisor.getPerInstanceAspect(aspectDefinition); 117 return interceptor.invoke(invocation); 118 } 119 } 120 121 } 122 | Popular Tags |