KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > Aspects


1 /*
2  * Nanning Aspects
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  * (C) 2003 Jon Tirsen
7  */

8 package com.tirsen.nanning;
9
10 import java.lang.reflect.Method JavaDoc;
11 import java.lang.reflect.Proxy JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.List JavaDoc;
14 import java.util.Set JavaDoc;
15 import java.util.ArrayList JavaDoc;
16
17 /**
18  * Utility for accessing and modifying aspected object.
19  *
20  * <!-- $Id: Aspects.java,v 1.23 2003/06/20 11:53:58 tirsen Exp $ -->
21  *
22  * @author $Author: tirsen $
23  * @version $Revision: 1.23 $
24  */

25 public class Aspects {
26     private static ThreadLocal JavaDoc contextAspectRepository = new InheritableThreadLocal JavaDoc();
27     private static ThreadLocal JavaDoc currentThis = new InheritableThreadLocal JavaDoc();
28
29     /**
30      * Gets the interceptors that belongs to the proxy.
31      *
32      * @param proxy
33      * @return the interceptors.
34      */

35     public static List JavaDoc getInterceptors(Object JavaDoc proxy) {
36         Set JavaDoc interceptors = getAspectInstance(proxy).getAllInterceptors();
37         return new ArrayList JavaDoc(interceptors);
38     }
39
40     /**
41      * What interceptors does the aspected object have for the given interface.
42      *
43      * @param proxy
44      * @param interfaceClass
45      * @return the interceptors.
46      */

47     public static Interceptor[] getInterceptors(Object JavaDoc proxy, Class JavaDoc interfaceClass) {
48         Set JavaDoc interceptors = getAspectInstance(proxy).getInterceptors(interfaceClass);
49         return (Interceptor[]) interceptors.toArray(new Interceptor[interceptors.size()]);
50     }
51
52     /**
53      * What is the target-object for the given interface.
54      *
55      * @param proxy
56      * @param interfaceClass
57      * @return the target-object.
58      */

59     public static Object JavaDoc getTarget(Object JavaDoc proxy, Class JavaDoc interfaceClass) {
60         return getAspectInstance(proxy).getTarget(interfaceClass);
61     }
62
63     /**
64      * Gets the AspectInstance of the given aspected object.
65      * @param proxy
66      * @return
67      */

68     public static AspectInstance getAspectInstance(Object JavaDoc proxy) {
69         AspectInstance aspectInstance = (AspectInstance) Proxy.getInvocationHandler(proxy);
70         assert aspectInstance != null;
71         return aspectInstance;
72     }
73
74     /**
75      * Sets the target of the mixin with the specified interface.
76      * @param proxy
77      * @param interfaceClass
78      * @param target
79      */

80     public static void setTarget(Object JavaDoc proxy, Class JavaDoc interfaceClass, Object JavaDoc target) {
81         getAspectInstance(proxy).setTarget(interfaceClass, target);
82     }
83
84     /**
85      * Gets the currently executing aspected object, aspected objects should use this method
86      * instead of <code>this</code>.
87      * @return
88      */

89     public static Object JavaDoc getThis() {
90         return currentThis.get();
91     }
92
93     public static boolean isAspectObject(Object JavaDoc o) {
94         return o == null ? false : Proxy.isProxyClass(o.getClass());
95     }
96
97     public static Object JavaDoc[] getTargets(Object JavaDoc object) {
98         return object == null ? null : Aspects.getAspectInstance(object).getTargets();
99     }
100
101     public static Interceptor findFirstInterceptorWithClass(Object JavaDoc proxy, Class JavaDoc interceptorClass) {
102         Set JavaDoc allInterceptors = getAspectInstance(proxy).getAllInterceptors();
103         for (Iterator JavaDoc iterator = allInterceptors.iterator(); iterator.hasNext();) {
104             Interceptor interceptor = (Interceptor) iterator.next();
105             if (interceptorClass.isInstance(interceptor)) {
106                 return interceptor;
107             }
108         }
109         return null;
110     }
111
112     public static AspectFactory getCurrentAspectFactory() {
113         if (getThis() != null) {
114             return getAspectInstance(getThis()).getAspectFactory();
115         } else {
116             return (AspectFactory) contextAspectRepository.get();
117         }
118     }
119
120     public static void setContextAspectFactory(AspectFactory factory) {
121         contextAspectRepository.set(factory);
122     }
123
124     public static MethodInterceptor[] getInterceptors(Object JavaDoc proxy, Method JavaDoc method) {
125         List JavaDoc interceptors = getAspectInstance(proxy).getInterceptorsForMethod(method);
126         return (MethodInterceptor[]) interceptors.toArray(new MethodInterceptor[interceptors.size()]);
127     }
128
129     /**
130      * Given a proxy-class returns the first real interface it implements.
131      *
132      * @param proxyClass proxyClass to inspect.
133      * @return first real interface implemented by proxyClass.
134      */

135     public static Class JavaDoc getRealClass(Class JavaDoc proxyClass) {
136         if (!Proxy.isProxyClass(proxyClass)) {
137             return proxyClass;
138         }
139         Class JavaDoc[] interfaces = proxyClass.getInterfaces();
140         for (int i = 0; i < interfaces.length; i++) {
141             Class JavaDoc anInterface = interfaces[i];
142             Class JavaDoc realClass = getRealClass(anInterface);
143             if (realClass != null) {
144                 return realClass;
145             }
146         }
147         return null;
148     }
149
150     static void setThis(Object JavaDoc proxy) {
151         Aspects.currentThis.set(proxy);
152     }
153 }
154
Popular Tags