KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > aop > GeneratedInstanceAdvisorMixin


1 /*
2   * JBoss, Home of Professional Open Source
3   * Copyright 2005, JBoss Inc., and individual contributors as indicated
4   * by the @authors tag. See the copyright.txt in the distribution for a
5   * full listing of individual contributors.
6   *
7   * This is free software; you can redistribute it and/or modify it
8   * under the terms of the GNU Lesser General Public License as
9   * published by the Free Software Foundation; either version 2.1 of
10   * the License, or (at your option) any later version.
11   *
12   * This software is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * Lesser General Public License for more details.
16   *
17   * You should have received a copy of the GNU Lesser General Public
18   * License along with this software; if not, write to the Free
19   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21   */

22 package org.jboss.aop;
23
24 import org.jboss.aop.advice.AdviceStack;
25 import org.jboss.aop.advice.AspectDefinition;
26 import org.jboss.aop.advice.Interceptor;
27 import org.jboss.aop.advice.InterceptorFactory;
28 import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
29 import org.jboss.aop.joinpoint.Joinpoint;
30 import org.jboss.aop.metadata.SimpleMetaData;
31
32 import java.util.ArrayList JavaDoc;
33 import java.util.Arrays JavaDoc;
34 import java.util.Iterator JavaDoc;
35
36 /**
37  * Adapts the old instance advisor api to the new generated advisor stuff.
38  * Old API calls on generated instance advisors will delegate to this class
39  *
40  * @author <a HREF="mailto:kabir@khan.org">Kabir Khan</a>
41  * @version $Revision$
42  */

43 public class GeneratedInstanceAdvisorMixin implements InstanceAdvisor, java.io.Serializable JavaDoc
44 {
45    static final long serialVersionUID = -3057976129116723527L;
46
47    protected ArrayList JavaDoc insertedInterceptors = null;
48    protected ArrayList JavaDoc appendedInterceptors = null;
49    protected Object JavaDoc instance;
50    public boolean hasInstanceAspects = false;
51    private InterceptorChainObserver interceptorChainObserver;
52    InstanceAdvisorDelegate delegate;
53    
54    public GeneratedInstanceAdvisorMixin()
55    {
56    }
57
58    public GeneratedInstanceAdvisorMixin(Object JavaDoc instance, GeneratedClassAdvisor genadvisor)
59    {
60       this.instance = instance;
61       delegate = new InstanceAdvisorDelegate(genadvisor, this);
62       delegate.initialize();
63       this.interceptorChainObserver = ((ClassAdvisor) genadvisor).getInterceptorChainObserver();
64    }
65
66    public boolean hasInterceptors()
67    {
68       return appendedInterceptors != null || insertedInterceptors != null;
69    }
70
71    public Object JavaDoc getPerInstanceAspect(String JavaDoc def)
72    {
73       return delegate.getPerInstanceAspect(def);
74    }
75
76    public Object JavaDoc getPerInstanceAspect(AspectDefinition def)
77    {
78       return delegate.getPerInstanceAspect(def);
79    }
80
81    public Object JavaDoc getPerInstanceJoinpointAspect(Joinpoint joinpoint, AspectDefinition def)
82    {
83       return delegate.getPerInstanceJoinpointAspect(joinpoint, def);
84    }
85
86    public SimpleMetaData getMetaData()
87    {
88       return delegate.getMetaData();
89    }
90
91    public Interceptor[] getInterceptors()
92    {
93       ArrayList JavaDoc newlist = new ArrayList JavaDoc();
94       if (insertedInterceptors != null)
95       {
96          for (Iterator JavaDoc it = insertedInterceptors.iterator() ; it.hasNext() ; )
97          {
98             newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null));
99          }
100       }
101       if (appendedInterceptors != null)
102       {
103          for (Iterator JavaDoc it = appendedInterceptors.iterator() ; it.hasNext() ; )
104          {
105             newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null));
106          }
107       }
108       return (Interceptor[]) newlist.toArray(new Interceptor[newlist.size()]);
109    }
110
111    /**
112     * Called by the advisor
113     */

114    public Interceptor[] getInterceptors(Interceptor[] advisorChain)
115    {
116       if (insertedInterceptors == null && appendedInterceptors == null) return advisorChain;
117       ArrayList JavaDoc newlist = new ArrayList JavaDoc();
118       if (insertedInterceptors != null)
119       {
120          for (Iterator JavaDoc it = insertedInterceptors.iterator() ; it.hasNext() ; )
121          {
122             newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null));
123          }
124       }
125       if (advisorChain != null)
126       {
127          newlist.addAll(Arrays.asList(advisorChain));
128       }
129       if (appendedInterceptors != null)
130       {
131          for (Iterator JavaDoc it = appendedInterceptors.iterator() ; it.hasNext() ; )
132          {
133             newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null));
134          }
135       }
136       return (Interceptor[]) newlist.toArray(new Interceptor[newlist.size()]);
137    }
138
139    public GeneratedAdvisorInterceptor[] getWrappers()
140    {
141       ArrayList JavaDoc newlist = new ArrayList JavaDoc();
142       if (insertedInterceptors != null) newlist.addAll(insertedInterceptors);
143       if (appendedInterceptors != null) newlist.addAll(appendedInterceptors);
144       return (GeneratedAdvisorInterceptor[]) newlist.toArray(new GeneratedAdvisorInterceptor[newlist.size()]);
145    }
146
147    /**
148     * Called by the advisor
149     * @param An array of GeneratedAdvisorInterceptor from the advisor's intereceptor chain for the joinpoint
150     * @return The advisor's original array along with extra GeneratedAdvisorInterceptors appended/prepended to this instance
151     */

152    public Interceptor[] getWrappers(Interceptor[] advisorChain)
153    {
154       if (insertedInterceptors == null && appendedInterceptors == null) return advisorChain;
155       ArrayList JavaDoc newlist = new ArrayList JavaDoc();
156       if (insertedInterceptors != null) newlist.addAll(insertedInterceptors);
157       if (advisorChain != null)
158       {
159          newlist.addAll(Arrays.asList(advisorChain));
160       }
161       if (appendedInterceptors != null) newlist.addAll(appendedInterceptors);
162       return (GeneratedAdvisorInterceptor[]) newlist.toArray(new GeneratedAdvisorInterceptor[newlist.size()]);
163    }
164
165    public void insertInterceptor(int index, Interceptor interceptor)
166    {
167       ArrayList JavaDoc newList = new ArrayList JavaDoc();
168       if (insertedInterceptors != null)
169       {
170          newList.addAll(insertedInterceptors);
171       }
172       newList.add(index, createWrapper(interceptor));
173       insertedInterceptors = newList;
174       hasInstanceAspects = true;
175       if (interceptorChainObserver != null)
176       {
177          interceptorChainObserver.instanceInterceptorAdded(this);
178       }
179    }
180
181    public void insertInterceptor(Interceptor interceptor)
182    {
183       ArrayList JavaDoc newList = new ArrayList JavaDoc();
184       if (insertedInterceptors != null)
185       {
186          newList.addAll(insertedInterceptors);
187       }
188       newList.add(createWrapper(interceptor));
189       insertedInterceptors = newList;
190       hasInstanceAspects = true;
191       if (interceptorChainObserver != null)
192       {
193          interceptorChainObserver.instanceInterceptorAdded(this);
194       }
195    }
196
197    public void appendInterceptor(Interceptor interceptor)
198    {
199       ArrayList JavaDoc newList = new ArrayList JavaDoc();
200       if (appendedInterceptors != null)
201       {
202          newList.addAll(appendedInterceptors);
203       }
204       newList.add(createWrapper(interceptor));
205       appendedInterceptors = newList;
206       hasInstanceAspects = true;
207       if (interceptorChainObserver != null)
208       {
209          interceptorChainObserver.instanceInterceptorAdded(this);
210       }
211    }
212
213    public void appendInterceptor(int index, Interceptor interceptor)
214    {
215       ArrayList JavaDoc newList = new ArrayList JavaDoc();
216       if (appendedInterceptors != null)
217       {
218          newList.addAll(appendedInterceptors);
219       }
220       newList.add(index, createWrapper(interceptor));
221       appendedInterceptors = newList;
222       hasInstanceAspects = true;
223       if (interceptorChainObserver != null)
224       {
225          interceptorChainObserver.instanceInterceptorAdded(this);
226       }
227    }
228
229    /**
230     * This will not remove interceptor pointcuts! You will have to do this through AspectManager
231     */

232    public void removeInterceptor(String JavaDoc name)
233    {
234       int interceptorsRemoved = internalRemoveInterceptor(name);
235       if (interceptorChainObserver != null)
236       {
237          interceptorChainObserver.instanceInterceptorsRemoved(this, interceptorsRemoved);
238       }
239    }
240
241    /**
242     * @param name
243     * @return
244     */

245    private int internalRemoveInterceptor(String JavaDoc name)
246    {
247       int interceptorsRemoved = 0;
248       if (insertedInterceptors != null)
249       {
250          for (int i = 0; i < insertedInterceptors.size(); i++)
251          {
252             GeneratedAdvisorInterceptor interceptor = (GeneratedAdvisorInterceptor) insertedInterceptors.get(i);
253             if (interceptor.getName().equals(name))
254             {
255                ArrayList JavaDoc newList = new ArrayList JavaDoc();
256                newList.addAll(insertedInterceptors);
257                newList.remove(i);
258                insertedInterceptors = newList;
259                interceptorsRemoved ++;
260             }
261          }
262       }
263       if (appendedInterceptors != null)
264       {
265          for (int i = 0; i < appendedInterceptors.size(); i++)
266          {
267             GeneratedAdvisorInterceptor interceptor = (GeneratedAdvisorInterceptor) appendedInterceptors.get(i);
268             if (interceptor.getName().equals(name))
269             {
270                ArrayList JavaDoc newList = new ArrayList JavaDoc();
271                newList.addAll(appendedInterceptors);
272                newList.remove(i);
273                appendedInterceptors = newList;
274                interceptorsRemoved ++;
275             }
276          }
277       }
278       hasInstanceAspects = ((insertedInterceptors != null && insertedInterceptors.size() > 0)
279       || (appendedInterceptors != null && appendedInterceptors.size() > 0));
280       return interceptorsRemoved;
281    }
282
283    public final boolean hasAspects()
284    {
285       return hasInstanceAspects;
286    }
287
288    public void insertInterceptorStack(String JavaDoc stackName)
289    {
290       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
291       if (stack == null) throw new RuntimeException JavaDoc("Stack " + stackName + " not found.");
292
293       ClassAdvisor classAdvisor = null;
294       if (instance instanceof Advised)
295       {
296          Advised advised = (Advised) instance;
297          classAdvisor = ((ClassAdvisor) advised._getAdvisor());
298       }
299       int interceptorsAdded = 0;
300       Iterator JavaDoc it = stack.getInterceptorFactories().iterator();
301       while (it.hasNext())
302       {
303          InterceptorFactory factory = (InterceptorFactory) it.next();
304          if (!factory.isDeployed()) continue;
305          Interceptor interceptor = factory.create(classAdvisor, null);
306          insertInterceptor(interceptor);
307          interceptorsAdded ++;
308       }
309       if (interceptorChainObserver != null)
310       {
311          this.interceptorChainObserver.instanceInterceptorsAdded(this, interceptorsAdded);
312       }
313    }
314
315    public void appendInterceptorStack(String JavaDoc stackName)
316    {
317       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
318       if (stack == null) throw new RuntimeException JavaDoc("Stack " + stackName + " not found.");
319
320       ClassAdvisor classAdvisor = null;
321       if (instance instanceof Advised)
322       {
323          Advised advised = (Advised) instance;
324          classAdvisor = ((ClassAdvisor) advised._getAdvisor());
325       }
326       int interceptorsAdded = 0;
327       Iterator JavaDoc it = stack.getInterceptorFactories().iterator();
328       while (it.hasNext())
329       {
330          InterceptorFactory factory = (InterceptorFactory) it.next();
331          if (!factory.isDeployed()) continue;
332          Interceptor interceptor = factory.create(classAdvisor, null);
333          appendInterceptor(interceptor);
334          interceptorsAdded ++;
335       }
336       if (interceptorChainObserver != null)
337       {
338          this.interceptorChainObserver.instanceInterceptorsAdded(this, interceptorsAdded);
339       }
340    }
341
342    public void removeInterceptorStack(String JavaDoc stackName)
343    {
344       AdviceStack stack = AspectManager.instance().getAdviceStack(stackName);
345       if (stack == null) throw new RuntimeException JavaDoc("Stack " + stackName + " not found.");
346
347       ClassAdvisor classAdvisor = null;
348       if (instance instanceof Advised)
349       {
350          Advised advised = (Advised) instance;
351          classAdvisor = ((ClassAdvisor) advised._getAdvisor());
352       }
353       int interceptorsRemoved = 0;
354       Iterator JavaDoc it = stack.getInterceptorFactories().iterator();
355       while (it.hasNext())
356       {
357          InterceptorFactory factory = (InterceptorFactory) it.next();
358          if (!factory.isDeployed()) continue;
359          Interceptor interceptor = factory.create(classAdvisor, null);
360          interceptorsRemoved += internalRemoveInterceptor(interceptor.getName());
361       }
362       if (interceptorChainObserver != null)
363       {
364          this.interceptorChainObserver.instanceInterceptorsRemoved(this, interceptorsRemoved);
365       }
366    }
367
368    public Domain getDomain()
369    {
370       throw new RuntimeException JavaDoc("Should be handled by generated advisors");
371    }
372
373    /**
374     * Added to notify interceptor chain observer of interceptor chain garbage collection.
375     */

376    protected void finalize()
377    {
378       ClassLoader JavaDoc classLoader = delegate.getAdvisor().getClazz().getClassLoader();
379       if (this.interceptorChainObserver == null || !delegate.getAdvisor().getManager().getRegisteredCLs().containsKey(classLoader))
380       {
381          return;
382       }
383       this.interceptorChainObserver.allInstanceInterceptorsRemoved(this);
384    }
385    
386    private GeneratedAdvisorInterceptor createWrapper(Interceptor interceptor)
387    {
388       return new GeneratedAdvisorInterceptor(new InstanceInterceptorFactory(interceptor), null, null);
389    }
390
391    public class InstanceInterceptorFactory implements InterceptorFactory
392    {
393       private Interceptor interceptor;
394       
395       private InstanceInterceptorFactory(Interceptor interceptor)
396       {
397          this.interceptor = interceptor;
398       }
399
400       public Interceptor create(Advisor advisor, Joinpoint joinpoint)
401       {
402          return interceptor;
403       }
404       
405       public String JavaDoc getClassName()
406       {
407          return interceptor.getClass().getName();
408       }
409
410       public String JavaDoc getAdvice()
411       {
412          return "invoke";
413       }
414
415       public AspectDefinition getAspect()
416       {
417          return null;
418       }
419
420       public String JavaDoc getName()
421       {
422          return interceptor.getName();
423       }
424
425       public boolean isDeployed()
426       {
427          return true;
428       }
429       
430       
431    }
432 }
Popular Tags