KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jfun > yan > containers > SimpleContainer


1 /*****************************************************************************
2  * Copyright (C) Codehaus.org. All rights reserved. *
3  * ------------------------------------------------------------------------- *
4  * The software in this package is published under the terms of the BSD *
5  * style license a copy of which has been included with this distribution in *
6  * the LICENSE.txt file. *
7  *****************************************************************************/

8 /*
9  * Created on Feb 28, 2005
10  *
11  * Author Ben Yu
12  * ZBS
13  */

14 package jfun.yan.containers;
15
16 import java.util.ArrayList JavaDoc;
17 import java.util.Iterator JavaDoc;
18 import java.util.List JavaDoc;
19 import java.util.Map JavaDoc;
20 import java.util.Set JavaDoc;
21
22 import jfun.util.Misc;
23 import jfun.yan.AmbiguousComponentResolutionException;
24 import jfun.yan.Component;
25 import jfun.yan.ComponentInstantiationException;
26 import jfun.yan.ComponentMap;
27 import jfun.yan.Components;
28 import jfun.yan.Container;
29 import jfun.yan.Creator;
30 import jfun.yan.CyclicDependencyException;
31 import jfun.yan.Dependency;
32 import jfun.yan.Registrar;
33 import jfun.yan.UnknownComponentTypeException;
34 import jfun.yan.UnresolvedComponentException;
35 import jfun.yan.UnsatisfiedComponentException;
36 import jfun.yan.YanException;
37 import jfun.yan.factory.Factory;
38
39 /**
40  * A simple implementation of interface {@link Container}.
41  * <p>
42  * It forwards all method call to the delegated {@link Registrar} object,
43  * which makes it handy for customizing a Registrar object by subclassing.
44  * </p>
45  * <p>
46  * Plus, SimpleContainer implements {@link Container} interface,
47  * which provides convenient API's.
48  * </p>
49  * <p>
50  * In this implementation,
51  * registerStaticMethod and registerConstructor use singleton pattern.
52  * Override these methods or the {@link #defaultTransform(Component)} method to
53  * disable the singleton or get a different transformation.
54  * </p>
55  * Codehaus.org.
56  *
57  * @author Ben Yu
58  *
59  */

60 public class SimpleContainer implements Container, java.io.Serializable JavaDoc{
61   private final Registrar target;
62   
63   /**
64    * Create a new SimpleContainer object.
65    * @param target the Registrar object.
66    */

67   public SimpleContainer(final Registrar target) {
68     this.target = target;
69   }
70
71   public void registerComponent(Object JavaDoc key, Component cc) {
72     target.registerComponent(key, cc);
73   }
74   public void registerComponent(Component cc){
75     final Class JavaDoc ctype = cc.getType();
76     if(ctype==null){
77       throw new UnknownComponentTypeException(
78           "immature component cannot be registered");
79     }
80     registerComponent(ctype, cc);
81   }
82   public void unregisterComponent(Object JavaDoc key) {
83     target.unregisterComponent(key);
84   }
85   
86   public void unregisterComponentsOfType(Class JavaDoc type) {
87     target.unregisterComponentsOfType(type);
88   }
89   public boolean containsKey(Object JavaDoc key) {
90     return target.containsKey(key);
91   }
92
93   public boolean containsType(Class JavaDoc type) {
94     return target.containsType(type);
95   }
96
97   public Component getComponent(Object JavaDoc key) {
98     return target.getComponent(key);
99   }
100   
101   public <T> Component<T> getComponentOfType(Class JavaDoc<T> type) {
102     return target.getComponentOfType(type);
103   }
104   public <T> List JavaDoc<Component<T>> getComponentsOfType(Class JavaDoc<T> type) {
105     return target.getComponentsOfType(type);
106   }
107
108   public <T> T getInstanceOfType(final Class JavaDoc<T> type, ComponentMap cmap){
109     try{
110       final Component<T> cc = getComponentOfType(type);
111       if(cc==null){
112         throw new UnresolvedComponentException(type);
113       }
114       return cc.create(cmap.getDependencyOfType(type, cmap));
115     }
116     catch(YanException e){
117       e.push("getInstanceOfType <" + Misc.getTypeName(type)+">");
118       throw e;
119     }
120   }
121   public <T> List JavaDoc<T> getInstancesOfType(final Class JavaDoc<T> type, ComponentMap cmap){
122     try{
123       java.util.List JavaDoc<Component<T>> ccs = getComponentsOfType(type);
124       final java.util.List JavaDoc<T> ret = new java.util.ArrayList JavaDoc<T>();
125       for(final Component<T> cc : ccs){
126         final Class JavaDoc ctype = cc.getType();
127         if(ctype != null)
128           ret.add(cc.create(cmap.getDependencyOfType(ctype, cmap)));
129       }
130       return ret;
131     }
132     catch(YanException e){
133       e.push("getInstancesOfType <" + Misc.getTypeName(type) + ">");
134       throw e;
135     }
136   }
137   public <T> T getInstanceOfType(Class JavaDoc<T> type){
138     return getInstanceOfType(type, this);
139   }
140   public <T> List JavaDoc<T> getInstancesOfType(Class JavaDoc<T> type){
141     return getInstancesOfType(type, this);
142   }
143   public Dependency getDependencyOfType(Class JavaDoc type, ComponentMap cmap) {
144     return target.getDependencyOfType(type, cmap);
145   }
146   public Dependency getDependency(Object JavaDoc key, ComponentMap cmap){
147     return target.getDependency(key, cmap);
148   }
149   public Dependency getDependency(Object JavaDoc key){
150     return getDependency(key, this);
151   }
152   public Dependency getDependencyOfType(Class JavaDoc type){
153     return getDependencyOfType(type, this);
154   }
155   public void verify(ComponentMap cmap) {
156     target.verify(cmap);
157   }
158   public void verify(){
159     target.verify(this);
160   }
161   
162   public Class JavaDoc verifyComponent(Component cc){
163     try{
164       /*final Class ctype = cc.getType();
165       if(ctype == null)
166         throw new IllegalArgumentException(
167             "dynamic-bound component cannot be verified");
168       */

169       return cc.verify(getDependency(null));
170     }
171     catch(YanException e){
172       e.push("verifyComponent <" + cc + ">");
173       throw e;
174     }
175   }
176   public Class JavaDoc verifyKey(Object JavaDoc key){
177     try{
178       final Component c = getComponent(key);
179       if(c==null){
180         throw new UnresolvedComponentException(key);
181       }
182       return c.verify(getDependency(key));
183     }
184     catch(YanException e){
185       e.push("verifyKey <" + key +">");
186       throw e;
187     }
188   }
189   public Class JavaDoc verifyType(Class JavaDoc type){
190     try{
191       final Component c = getComponentOfType(type);
192       if(c==null)
193         throw new UnresolvedComponentException(type);
194       return c.verify(getDependencyOfType(type));
195     }
196     catch(YanException e){
197       e.push("verifyType <" + Misc.getTypeName(type) +">");
198       throw e;
199     }
200   }
201   public Class JavaDoc getComponentType(Object JavaDoc key) {
202     final Component cc = getComponent(key);
203     if(cc==null) return null;
204     return cc.getType();
205   }
206
207   
208   public <T> T instantiateComponent(Creator<T> cc, ComponentMap cmap)
209       throws AmbiguousComponentResolutionException,
210       ComponentInstantiationException, CyclicDependencyException,
211       UnresolvedComponentException, UnsatisfiedComponentException, YanException {
212     try{
213       return cc.create(getDependency(null, cmap));
214     }
215     catch(YanException e){
216       e.push("instantiateComponent <" + cc + ">");
217       throw e;
218     }
219   }
220   public <T> T instantiateComponent(Object JavaDoc key, Creator<T> cc, ComponentMap cmap)
221   throws AmbiguousComponentResolutionException,
222   ComponentInstantiationException, CyclicDependencyException,
223   UnresolvedComponentException, UnsatisfiedComponentException, YanException {
224     try{
225       return cc.create(getDependency(key, cmap));
226     }
227     catch(YanException e){
228       e.push("instantiateComponent <" + key + ">");
229       throw e;
230     }
231   }
232   public <T> T instantiateComponent(Creator<T> cc)
233       throws AmbiguousComponentResolutionException,
234       ComponentInstantiationException, CyclicDependencyException,
235       UnresolvedComponentException, UnsatisfiedComponentException, YanException {
236     return instantiateComponent(cc, this);
237   }
238   public <T> T instantiateComponent(Object JavaDoc key, Creator<T> cc)
239   throws AmbiguousComponentResolutionException,
240   ComponentInstantiationException, CyclicDependencyException,
241   UnresolvedComponentException, UnsatisfiedComponentException, YanException {
242     return instantiateComponent(key, cc, this);
243   }
244   public Object JavaDoc getInstance(Object JavaDoc key, ComponentMap cmap) {
245     try{
246       final Component cc = getComponent(key);
247       if(cc==null){
248         throw new UnresolvedComponentException(key);
249       }
250       return cc.create(cmap.getDependency(key,cmap));
251     }
252     catch(YanException e){
253       e.push("getInstance <" + key + ">");
254       throw e;
255     }
256   }
257   public Object JavaDoc getInstance(Object JavaDoc key){
258     return getInstance(key, this);
259   }
260
261   public void registerValue(Object JavaDoc key, Object JavaDoc v){
262     registerComponent(key, Components.value(v));
263   }
264   public void registerValue(Object JavaDoc v){
265     //registerValue(v==null?Object.class:v.getClass(), v);
266
registerValue(v.getClass(), v);
267   }
268   /**
269    * The component is transformed by {@link #defaultTransform(Component)},
270    * which makes it singleton.
271    * Override {@link #defaultTransform(Component)} if a different default behavior
272    * is desired.
273    */

274   public void registerConstructor(Class JavaDoc c){
275     registerConstructor(c, c);
276   }
277   /**
278    * Transforms a component by calling singleton().
279    * registerConstructor and registerStaticMethod
280    * call this function to transform the component
281    * before registering to the container.
282    * Override this function if singleton() is not desired
283    * or a different transformation is needed.
284    * @param comp the component.
285    * @return the transformed component.
286    */

287   protected Component defaultTransform(Component comp){
288     return comp.singleton();
289   }
290   /**
291    * The component is transformed by {@link #defaultTransform(Component)},
292    * which makes it singleton.
293    * Override {@link #defaultTransform(Component)} if a different default behavior
294    * is desired.
295    */

296   public void registerConstructor(Object JavaDoc key, Class JavaDoc c){
297     registerComponent(key, defaultTransform(Components.ctor(c)));
298   }
299   /**
300    * The component is transformed by {@link #defaultTransform(Component)},
301    * which makes it singleton.
302    * Override {@link #defaultTransform(Component)} if a different default behavior
303    * is desired.
304    */

305   public void registerConstructor(Class JavaDoc c, Class JavaDoc[] param_types){
306     registerConstructor(c, c, param_types);
307   }
308   /**
309    * The component is transformed by {@link #defaultTransform(Component)},
310    * which makes it singleton.
311    * Override {@link #defaultTransform(Component)} if a different default behavior
312    * is desired.
313    */

314   public void registerConstructor(Object JavaDoc key, Class JavaDoc c, Class JavaDoc[] param_types){
315     registerComponent(key,
316         defaultTransform(Components.ctor(c, param_types)));
317   }
318   /**
319    * The component is transformed by {@link #defaultTransform(Component)},
320    * which makes it singleton.
321    * Override {@link #defaultTransform(Component)} if a different default behavior
322    * is desired.
323    */

324   public void registerStaticMethod(Class JavaDoc c, String JavaDoc name){
325     final Component comp = Components.static_method(c, name);
326     registerComponent(defaultTransform(comp));
327   }
328   /**
329    * The component is transformed by {@link #defaultTransform(Component)},
330    * which makes it singleton.
331    * Override {@link #defaultTransform(Component)} if a different default behavior
332    * is desired.
333    */

334   public void registerStaticMethod(Object JavaDoc key, Class JavaDoc c, String JavaDoc name){
335     registerComponent(key,
336         defaultTransform(Components.static_method(c, name)));
337   }
338   /**
339    * The component is transformed by {@link #defaultTransform(Component)},
340    * which makes it singleton.
341    * Override {@link #defaultTransform(Component)} if a different default behavior
342    * is desired.
343    */

344   public void registerStaticMethod(Class JavaDoc c, String JavaDoc name, Class JavaDoc[] param_types){
345     final Component comp = Components.static_method(c, name, param_types);
346     registerComponent(defaultTransform(comp));
347   }
348   /**
349    * The component is transformed by {@link #defaultTransform(Component)},
350    * which makes it singleton.
351    * Override {@link #defaultTransform(Component)} if a different default behavior
352    * is desired.
353    */

354   public void registerStaticMethod(Object JavaDoc key, Class JavaDoc c, String JavaDoc name, Class JavaDoc[] param_types){
355     registerComponent(key,
356         defaultTransform(Components.static_method(c, name, param_types)));
357   }
358   public Container inherit(Registrar parent){
359     if(parent==this) return this;
360     return new SimpleContainer(new InheritedRegistrar(parent, this));
361   }
362   public boolean equals(Object JavaDoc other) {
363     if(other instanceof SimpleContainer){
364       final SimpleContainer cc2 = (SimpleContainer)other;
365       return target.equals(cc2.target);
366     }
367     else return target.equals(other);
368   }
369   public int hashCode() {
370     return target.hashCode();
371   }
372   public String JavaDoc toString() {
373     return target.toString();
374   }
375   
376   public Set JavaDoc keys() {
377     return target.keys();
378   }
379   public java.util.Collection JavaDoc getComponents(){
380     return target.getComponents();
381   }
382   public void getInstances(Map JavaDoc store){
383     getInstances(store, this);
384   }
385   public java.util.List JavaDoc getInstances(){
386     return getInstances(this);
387   }
388   public void getInstances(Map JavaDoc store, ComponentMap cmap){
389     try{
390       for(Iterator JavaDoc it = keys().iterator(); it.hasNext();){
391         final Object JavaDoc ky = it.next();
392         final Component cc = getComponent(ky);
393         store.put(ky, cc.create(cmap.getDependency(ky, cmap)));
394       }
395     }
396     catch(YanException e){
397       e.push("getInstances");
398       throw e;
399     }
400   }
401   public java.util.List JavaDoc getInstances(ComponentMap cmap){
402     try{
403       final java.util.Set JavaDoc ks = keys();
404       final ArrayList JavaDoc ret = new ArrayList JavaDoc();
405       for(Iterator JavaDoc it = ks.iterator(); it.hasNext();){
406         final Object JavaDoc ky = it.next();
407         final Component cc = getComponent(ky);
408         ret.add(cc.create(cmap.getDependency(ky, cmap)));
409       }
410       return ret;
411     }
412     catch(YanException e){
413       e.push("getInstances");
414       throw e;
415     }
416   }
417   public Factory getFactory(Object JavaDoc key, ComponentMap cmap) throws UnresolvedComponentException, YanException {
418     return instantiateFactory(key, getComponent(key), cmap);
419   }
420
421   public Factory getFactory(Object JavaDoc key) throws UnresolvedComponentException, YanException {
422     return instantiateFactory(key, getComponent(key));
423   }
424
425   public <T> Factory<T> getFactoryOfType(Class JavaDoc<T> type, ComponentMap cmap) throws AmbiguousComponentResolutionException, UnresolvedComponentException, YanException {
426     return instantiateFactory(type, getComponentOfType(type), cmap);
427   }
428
429   public <T> Factory<T> getFactoryOfType(Class JavaDoc<T> type) throws AmbiguousComponentResolutionException, UnresolvedComponentException, YanException {
430     return instantiateFactory(type, getComponentOfType(type));
431   }
432   private <T> Factory<T> instantiateFactory(Object JavaDoc key, Component<T> cc, ComponentMap src){
433     return this.instantiateComponent(key, cc.factory(), src);
434   }
435   private <T> Factory<T> instantiateFactory(Object JavaDoc key, Component<T> cc){
436     return this.instantiateComponent(key, cc.factory());
437   }
438   /**
439    * Gets the Registrar object being delegated.
440    * @return the Container object.
441    */

442   protected final Registrar getDelegateTarget(){
443     return target;
444   }
445 }
446
Popular Tags