KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nanocontainer > aop > dynaop > DynaopAspectablePicoContainerFactory


1 /*****************************************************************************
2  * Copyright (c) PicoContainer Organization. All rights reserved. *
3  * ------------------------------------------------------------------------- *
4  * The software in this package is published under the terms of the BSD *
5  * style license a copy of which has been included with this distribution in *
6  * the LICENSE.txt file. *
7  * *
8  * Idea by Rachel Davies, Original code by various *
9  *****************************************************************************/

10 package org.nanocontainer.aop.dynaop;
11
12 import dynaop.Aspects;
13 import dynaop.Pointcuts;
14 import dynaop.ProxyFactory;
15 import org.nanocontainer.aop.AspectablePicoContainer;
16 import org.nanocontainer.aop.AspectablePicoContainerFactory;
17 import org.nanocontainer.aop.AspectsContainer;
18 import org.nanocontainer.aop.AspectsManager;
19 import org.nanocontainer.aop.defaults.AspectsComponentAdapterFactory;
20 import org.picocontainer.MutablePicoContainer;
21 import org.picocontainer.PicoContainer;
22 import org.picocontainer.defaults.ComponentAdapterFactory;
23 import org.picocontainer.defaults.DefaultComponentAdapterFactory;
24 import org.picocontainer.defaults.DefaultPicoContainer;
25
26 /**
27  * Uses dynaop to create <code>AspectablePicoContainer</code> objects.
28  *
29  * @author Stephen Molitor
30  * @author Mauro Talevi
31  * @version $Revision: 3144 $
32  */

33 public class DynaopAspectablePicoContainerFactory implements AspectablePicoContainerFactory {
34
35     public AspectablePicoContainer createContainer(Class JavaDoc containerClass, AspectsManager aspectsManager,
36                                                    ComponentAdapterFactory componentAdapterFactory, PicoContainer parent) {
37
38         ComponentAdapterFactory aspectsComponentAdapterFactory = new AspectsComponentAdapterFactory(aspectsManager,
39                 componentAdapterFactory);
40         MutablePicoContainer pico = createMutablePicoContainer(containerClass, aspectsComponentAdapterFactory, parent);
41         return mixinAspectablePicoContainer(aspectsManager, pico);
42     }
43
44     public AspectablePicoContainer createContainer(Class JavaDoc containerClass,
45                                                    ComponentAdapterFactory componentAdapterFactory, PicoContainer parent) {
46         return createContainer(containerClass, new DynaopAspectsManager(), componentAdapterFactory, parent);
47     }
48
49     public AspectablePicoContainer createContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent) {
50         return createContainer(DefaultPicoContainer.class, componentAdapterFactory, parent);
51     }
52
53     public AspectablePicoContainer createContainer(ComponentAdapterFactory componentAdapterFactory) {
54         return createContainer(componentAdapterFactory, null);
55     }
56
57     public AspectablePicoContainer createContainer(PicoContainer parent) {
58         return createContainer(new DefaultComponentAdapterFactory(), parent);
59     }
60
61     public AspectablePicoContainer createContainer() {
62         return createContainer(new DefaultComponentAdapterFactory());
63     }
64
65     public AspectablePicoContainer makeChildContainer(AspectsManager aspectsManager, AspectablePicoContainer parent) {
66         return mixinAspectablePicoContainer(aspectsManager, parent.makeChildContainer());
67     }
68
69     public AspectablePicoContainer makeChildContainer(AspectablePicoContainer parent) {
70         return makeChildContainer(new DynaopAspectsManager(), parent);
71     }
72     
73     private MutablePicoContainer createMutablePicoContainer(Class JavaDoc containerClass, ComponentAdapterFactory caFactory,
74                                                       PicoContainer parent) {
75         MutablePicoContainer temp = new DefaultPicoContainer();
76         temp.registerComponentImplementation(containerClass);
77         temp.registerComponentInstance(ComponentAdapterFactory.class, caFactory);
78         if (parent != null) {
79             temp.registerComponentInstance(PicoContainer.class, parent);
80         }
81         return (MutablePicoContainer) temp.getComponentInstance(containerClass);
82     }
83
84     private AspectablePicoContainer mixinAspectablePicoContainer(AspectsManager aspectsManager,
85             MutablePicoContainer pico) {
86         Aspects aspects = new Aspects();
87         aspects.mixin(Pointcuts.ALL_CLASSES, new Class JavaDoc[]{AspectsContainer.class}, new InstanceMixinFactory(aspectsManager));
88         aspects.interfaces(Pointcuts.ALL_CLASSES, new Class JavaDoc[]{AspectablePicoContainer.class});
89         return (AspectablePicoContainer) ProxyFactory.getInstance(aspects).wrap(pico);
90     }
91
92 }
Popular Tags