1 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 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 42 public Object newInstance() { 43 return newInstance(null); 44 } 45 46 public Object newInstance(Object [] targets) { 47 AspectInstance aspectInstance = new AspectInstance(getAspectRepository(), getInterfaceClass()); 48 try { 49 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 e) { 63 throw new AspectException(e); 64 } catch (InstantiationException 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 proxy = aspectInstance.getProxy(); 79 80 return proxy; 81 } 82 83 private AspectDefinition getClassAspectDefinition() { 84 return getAspectDefinition(0); 85 } 86 87 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 getInterfaceClass() { 108 return getClassAspectDefinition().getInterfaceClass(); 109 } 110 111 private void indexInterface(Class interfaceClass, int instanceIndex) { 112 if (!interfacesToInstancesIndex.containsKey(interfaceClass)) { 115 interfacesToInstancesIndex.put(interfaceClass, new Integer (instanceIndex)); 116 } 117 Class [] interfaces = interfaceClass.getInterfaces(); 118 for (int i = 0; i < interfaces.length; i++) { 119 Class superInterface = interfaces[i]; 120 indexInterface(superInterface, instanceIndex); 121 } 122 } 123 124 public void setInterface(Class interfaceClass) { 125 getAspectDefinition(0).setInterface(interfaceClass); 126 reindexInterfacesToIndex(); 127 } 128 129 public void addInterceptor(Class 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 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
|