1 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 33 public class DynaopAspectablePicoContainerFactory implements AspectablePicoContainerFactory { 34 35 public AspectablePicoContainer createContainer(Class 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 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 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 []{AspectsContainer.class}, new InstanceMixinFactory(aspectsManager)); 88 aspects.interfaces(Pointcuts.ALL_CLASSES, new Class []{AspectablePicoContainer.class}); 89 return (AspectablePicoContainer) ProxyFactory.getInstance(aspects).wrap(pico); 90 } 91 92 }
| Popular Tags
|