1 7 package com.tirsen.nanning.definition; 8 9 import java.io.ByteArrayOutputStream ; 10 import java.net.URL ; 11 import java.util.Collection ; 12 import java.util.HashMap ; 13 import java.util.Iterator ; 14 import java.util.Map ; 15 16 import com.tirsen.nanning.AspectFactory; 17 import com.tirsen.nanning.AspectInstance; 18 import com.tirsen.nanning.AspectException; 19 import com.tirsen.nanning.jelly.AspectTagLibrary; 20 import org.apache.commons.jelly.JellyContext; 21 import org.apache.commons.jelly.XMLOutput; 22 23 33 public class AspectRepository implements AspectFactory { 34 private static AspectRepository instance; 35 36 protected final Map interceptorDefinitions = new HashMap (); 37 protected final Map aspectDefinitions = new HashMap (); 38 protected final Map aspectClasses = new HashMap (); 39 40 public void reinitialize(AspectInstance aspectInstance) { 41 } 42 43 public void defineInterceptor(InterceptorDefinition interceptorDefinition) { 44 interceptorDefinitions.put(interceptorDefinition.getInterceptorClass(), interceptorDefinition); 45 } 46 47 public InterceptorDefinition getInterceptor(Class interceptorClass) { 48 InterceptorDefinition interceptorDefinition = 49 (InterceptorDefinition) interceptorDefinitions.get(interceptorClass); 50 if (interceptorDefinition == null) { 51 throw new IllegalArgumentException ("no such interceptor defined: " + interceptorClass); 52 } 53 return interceptorDefinition; 54 } 55 56 public void defineAspect(AspectDefinition aspectDefinition) { 57 aspectDefinitions.put(aspectDefinition.getInterfaceClass(), aspectDefinition); 58 } 59 60 public AspectDefinition getAspect(Class interfaceClass) { 61 return (AspectDefinition) aspectDefinitions.get(interfaceClass); 62 } 63 64 public void defineClass(AspectClass aspectClass) { 65 aspectClass.setAspectRepository(this); 66 aspectClasses.put(aspectClass.getInterfaceClass(), aspectClass); 67 } 68 69 public AspectClass getClass(Class interfaceClass) { 70 AspectClass aspectClass = (AspectClass) aspectClasses.get(interfaceClass); 71 if (aspectClass == null) { 72 throw new IllegalArgumentException ("Did not find aspect-class with interface " + 73 interfaceClass.getName()); 74 } 75 return aspectClass; 76 } 77 78 public static AspectFactory getInstance() { 79 if (instance == null) { 80 instance = new AspectRepository(); 81 try { 82 instance.configure(AspectRepository.class.getResource("/aspect-repository.xml")); 83 } catch (Exception e) { 84 throw new AspectException("failed to configure default instance"); 85 } 86 } 87 return instance; 88 } 89 90 96 public void configure(URL resource) throws ConfigureException { 97 JellyContext context = new JellyContext(); 98 try { 99 context.registerTagLibrary(AspectTagLibrary.TAG_LIBRARY_URI, new AspectTagLibrary()); 100 context.registerTagLibrary("", new AspectTagLibrary()); 101 XMLOutput xmlOutput = XMLOutput.createXMLOutput(new ByteArrayOutputStream ()); 102 context.runScript(resource, xmlOutput); 103 } catch (Exception e) { 104 throw new ConfigureException(e); 105 } 106 107 Collection aspectRepositories = AspectTagLibrary.findDefinedRepositories(context); 108 Iterator iterator = aspectRepositories.iterator(); 109 if (!iterator.hasNext()) { 110 throw new ConfigureException("No aspect-repository defined."); 111 } 112 while (iterator.hasNext()) { 113 AspectRepository configuredRepository = (AspectRepository) iterator.next(); 114 this.interceptorDefinitions.putAll(configuredRepository.interceptorDefinitions); 115 this.aspectClasses.putAll(configuredRepository.aspectClasses); 116 this.aspectDefinitions.putAll(configuredRepository.aspectDefinitions); 117 } 118 } 119 120 public Collection getClasses() { 121 return aspectClasses.values(); 122 } 123 124 public Object newInstance(Class aspectInterface) { 125 return newInstance(aspectInterface, null); 126 } 127 128 public Object newInstance(Class aspectInterface, Object [] targets) { 129 assert aspectInterface instanceof Class : "aspect-classes are identified by the interface-class of their first mixin"; 130 Object instance = getClass(aspectInterface).newInstance(targets); 131 return instance; 132 } 133 134 } 135 | Popular Tags |