KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > definition > AspectRepository


1 /*
2  * Nanning Aspects
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  */

7 package com.tirsen.nanning.definition;
8
9 import java.io.ByteArrayOutputStream JavaDoc;
10 import java.net.URL JavaDoc;
11 import java.util.Collection JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.Map JavaDoc;
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 /**
24  * TODO document AspectRepository
25  *
26  * <!-- $Id: AspectRepository.java,v 1.13 2003/05/26 05:39:32 tirsen Exp $ -->
27  *
28  * @author $Author: tirsen $
29  * @version $Revision: 1.13 $
30  *
31  * @deprecated please use the new {@link com.tirsen.nanning.config.AspectSystem} framework instead.
32  */

33 public class AspectRepository implements AspectFactory {
34     private static AspectRepository instance;
35
36     protected final Map JavaDoc interceptorDefinitions = new HashMap JavaDoc();
37     protected final Map JavaDoc aspectDefinitions = new HashMap JavaDoc();
38     protected final Map JavaDoc aspectClasses = new HashMap JavaDoc();
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 JavaDoc interceptorClass) {
48         InterceptorDefinition interceptorDefinition =
49                 (InterceptorDefinition) interceptorDefinitions.get(interceptorClass);
50         if (interceptorDefinition == null) {
51             throw new IllegalArgumentException JavaDoc("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 JavaDoc 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 JavaDoc interfaceClass) {
70         AspectClass aspectClass = (AspectClass) aspectClasses.get(interfaceClass);
71         if (aspectClass == null) {
72             throw new IllegalArgumentException JavaDoc("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 JavaDoc e) {
84                 throw new AspectException("failed to configure default instance");
85             }
86         }
87         return instance;
88     }
89
90     /**
91      * Merges all defined aspect-repositories of the xml-file into this one, at least one needs to be defined.
92      *
93      * @param resource
94      * @throws com.tirsen.nanning.definition.ConfigureException
95      */

96     public void configure(URL JavaDoc 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 JavaDoc());
102             context.runScript(resource, xmlOutput);
103         } catch (Exception JavaDoc e) {
104             throw new ConfigureException(e);
105         }
106
107         Collection JavaDoc aspectRepositories = AspectTagLibrary.findDefinedRepositories(context);
108         Iterator JavaDoc 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 JavaDoc getClasses() {
121         return aspectClasses.values();
122     }
123
124     public Object JavaDoc newInstance(Class JavaDoc aspectInterface) {
125         return newInstance(aspectInterface, null);
126     }
127
128     public Object JavaDoc newInstance(Class JavaDoc aspectInterface, Object JavaDoc[] targets) {
129         assert aspectInterface instanceof Class JavaDoc : "aspect-classes are identified by the interface-class of their first mixin";
130         Object JavaDoc instance = getClass(aspectInterface).newInstance(targets);
131         return instance;
132     }
133
134 }
135
Popular Tags