1 10 package org.nanocontainer.aop.dynaop; 11 12 import dynaop.Aspects; 13 import org.picocontainer.PicoInitializationException; 14 15 import java.lang.reflect.Constructor ; 16 import java.lang.reflect.InvocationTargetException ; 17 import java.util.ArrayList ; 18 import java.util.Arrays ; 19 import java.util.Collection ; 20 import java.util.Iterator ; 21 22 30 class ComponentAspectsCollection { 31 32 private final Collection componentsAspects = new ArrayList (); 33 34 39 void add(ComponentAspect componentAspect) { 40 componentsAspects.add(componentAspect); 41 } 42 43 57 Aspects registerAspects(Object componentKey, Aspects containerAspects) { 58 Aspects aspects = copyAspects(containerAspects); 59 Iterator iterator = componentsAspects.iterator(); 60 while (iterator.hasNext()) { 61 ComponentAspect componentAspect = (ComponentAspect) iterator.next(); 62 componentAspect.registerAspect(componentKey, aspects); 63 } 64 return aspects; 65 } 66 67 private static Aspects copyAspects(Aspects aspects) { 68 try { 70 Constructor constructor = getAspectsCopyConstructor(); 71 constructor.setAccessible(true); 72 return (Aspects) constructor.newInstance(new Object []{aspects}); 73 } catch (SecurityException e) { 74 throw new PicoInitializationException("security exception copying dynaop.Aspects", e); 75 } catch (IllegalArgumentException e) { 76 throw new PicoInitializationException("illegal argument passed to dynaop.Aspects copy constructor", e); 77 } catch (InstantiationException e) { 78 throw new PicoInitializationException("error instantiating dynaop.Aspects copy constructor object", e); 79 } catch (IllegalAccessException e) { 80 throw new PicoInitializationException("illegal access exception while trying to make dynaop.Aspects copy constructor accessible", e); 81 } catch (InvocationTargetException e) { 82 throw new PicoInitializationException("dynaop.Aspects copy constructor threw an exception", e); 83 } 84 } 85 86 private static Constructor getAspectsCopyConstructor() { 87 final Class [] params = new Class []{Aspects.class}; 88 Constructor [] constructors = Aspects.class.getDeclaredConstructors(); 89 for (int i = 0; i < constructors.length; ++i) { 90 Constructor constructor = constructors[i]; 91 if (Arrays.equals(params, constructor.getParameterTypes())) { 92 return constructor; 93 } 94 } 95 throw new PicoInitializationException("dynaop.Aspects copy constructor not found"); 96 } 97 98 } | Popular Tags |