KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > definition > AspectClass


1 /*
2  * Nanning Aspects
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  */

7 package com.tirsen.nanning.definition;
8
9 import java.util.*;
10
11 import com.tirsen.nanning.AspectException;
12 import com.tirsen.nanning.AspectInstance;
13 import com.tirsen.nanning.MixinInstance;
14 import com.tirsen.nanning.ConstructionInterceptor;
15
16 /**
17  * The definition of an aspected object, specifies interfaces, interceptors and target-objects.
18  *
19  * <!-- $Id: AspectClass.java,v 1.10 2003/05/22 20:18:32 tirsen Exp $ -->
20  *
21  * @author $Author: tirsen $
22  * @version $Revision: 1.10 $
23  *
24  * @deprecated please use the new {@link com.tirsen.nanning.config.AspectSystem} framework instead.
25  */

26 public class AspectClass {
27     private final List aspectDefinitions = new ArrayList();
28     private Map interfacesToInstancesIndex = new HashMap();
29     private AspectRepository aspectRepository;
30
31     public AspectClass() {
32         aspectDefinitions.add(new AspectDefinition());
33     }
34
35     /**
36      * Instantiates an instance with the specified interfaces, interceptors and target-objects.
37      *
38      * @return a new aspected object.
39      *
40      * @throws com.tirsen.nanning.AspectException
41      */

42     public Object JavaDoc newInstance() {
43         return newInstance(null);
44     }
45
46     public Object JavaDoc newInstance(Object JavaDoc[] targets) {
47         AspectInstance aspectInstance = new AspectInstance(getAspectRepository(), getInterfaceClass());
48         try {
49             // iterate the rest of the definitions and addLink the interceptors of the first on to the rest
50
for (ListIterator iterator = aspectDefinitions.listIterator(); iterator.hasNext();) {
51                 AspectDefinition mixinDefinition = (AspectDefinition) iterator.next();
52                 MixinInstance mixinInstance;
53                 if (targets != null) {
54                     mixinInstance =
55                             mixinDefinition.newInstance(targets[iterator.previousIndex()]);
56                 } else {
57                     mixinInstance =
58                             mixinDefinition.createMixinInstance();
59                 }
60                 aspectInstance.addMixin(mixinInstance);
61             }
62         } catch (IllegalAccessException JavaDoc e) {
63             throw new AspectException(e);
64         } catch (InstantiationException JavaDoc e) {
65             throw new AspectException(e);
66         }
67
68         if (targets == null) {
69             for (Iterator iterator = aspectDefinitions.iterator(); iterator.hasNext();) {
70                 AspectDefinition mixinDefinition = (AspectDefinition) iterator.next();
71                 for (Iterator interceptorI = mixinDefinition.getConstructionInterceptors().iterator(); interceptorI.hasNext();) {
72                     ConstructionInterceptor constructionInterceptor = (ConstructionInterceptor) interceptorI.next();
73                     aspectInstance.addConstructionInterceptor(constructionInterceptor);
74                 }
75             }
76         }
77
78         Object JavaDoc proxy = aspectInstance.getProxy();
79
80         return proxy;
81     }
82
83     private AspectDefinition getClassAspectDefinition() {
84         return getAspectDefinition(0);
85     }
86
87     /**
88      * Adds a new interface specification, specifies interface, interceptors and target-object these are stacked
89      * "on the side" of this object.
90      *
91      * @param interfaceDefinition
92      */

93     public void addAspect(AspectDefinition interfaceDefinition) {
94         aspectDefinitions.add(interfaceDefinition);
95
96         reindexInterfacesToIndex();
97     }
98
99     private void reindexInterfacesToIndex() {
100         interfacesToInstancesIndex.clear();
101         for (ListIterator iterator = aspectDefinitions.listIterator(); iterator.hasNext();) {
102             AspectDefinition aspectDefinition = (AspectDefinition) iterator.next();
103             indexInterface(aspectDefinition.getInterfaceClass(), iterator.previousIndex());
104         }
105     }
106
107     public Class JavaDoc getInterfaceClass() {
108         return getClassAspectDefinition().getInterfaceClass();
109     }
110
111     private void indexInterface(Class JavaDoc interfaceClass, int instanceIndex) {
112         // when two side-aspects implement same interface the earlier one take precedence
113
// that is it already exists in the index
114
if (!interfacesToInstancesIndex.containsKey(interfaceClass)) {
115             interfacesToInstancesIndex.put(interfaceClass, new Integer JavaDoc(instanceIndex));
116         }
117         Class JavaDoc[] interfaces = interfaceClass.getInterfaces();
118         for (int i = 0; i < interfaces.length; i++) {
119             Class JavaDoc superInterface = interfaces[i];
120             indexInterface(superInterface, instanceIndex);
121         }
122     }
123
124     public void setInterface(Class JavaDoc interfaceClass) {
125         getAspectDefinition(0).setInterface(interfaceClass);
126         reindexInterfacesToIndex();
127     }
128
129     public void addInterceptor(Class JavaDoc aClass) {
130         getClassAspectDefinition().addInterceptor(aClass);
131     }
132
133     private AspectDefinition getAspectDefinition(int index) {
134         return (AspectDefinition) aspectDefinitions.get(index);
135     }
136
137     public void setTarget(Class JavaDoc aClass) {
138         getClassAspectDefinition().setTarget(aClass);
139     }
140
141     public void addInterceptor(InterceptorDefinition interceptorDefinition) {
142         getClassAspectDefinition().addInterceptor(interceptorDefinition);
143     }
144
145     public AspectRepository getAspectRepository() {
146         return aspectRepository;
147     }
148
149     public void setAspectRepository(AspectRepository aspectRepository) {
150         this.aspectRepository = aspectRepository;
151     }
152
153     public List getAspectDefinitions() {
154         return aspectDefinitions;
155     }
156 }
157
Popular Tags