KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jfun > yan > AutoDetectingComponent


1 package jfun.yan;
2
3 import java.util.Arrays JavaDoc;
4 import java.util.List JavaDoc;
5
6 import jfun.util.Misc;
7
8 /**
9  * First, use type, if ambiguous or not found, try a few alternative keys.
10  * <p>
11  * @author Ben Yu
12  * Dec 12, 2005 4:30:53 PM
13  */

14 final class AutoDetectingComponent<T> extends Component<T> {
15   private final Class JavaDoc<T> type;
16   private final Object JavaDoc[] keys;
17   AutoDetectingComponent(Class JavaDoc<T> type, final Object JavaDoc[] keys) {
18     this.type = type;
19     this.keys = keys;
20   }
21
22   public boolean equals(Object JavaDoc obj) {
23     if(obj instanceof AutoDetectingComponent){
24       final AutoDetectingComponent other = (AutoDetectingComponent)obj;
25       return type.equals(other.type) && Arrays.equals(keys, other.keys);
26     }
27     else return false;
28   }
29
30   public int hashCode() {
31     return type.hashCode()*31+Misc.getArrayHashcode(keys);
32   }
33
34   public Class JavaDoc verify(Dependency dependency){
35     return detect(dependency).verify(dependency);
36   }
37
38   public T create(Dependency dependency){
39     return detect(dependency).create(dependency);
40   }
41   private Component<T> detect(Dependency dep){
42     final ComponentMap cmap = dep.getComponentMap();
43     final List JavaDoc<Component<T>> candidates = cmap.getComponentsOfType(type);
44     if(candidates.isEmpty() || candidates.size()>1){
45       return detectAlternatives(cmap);
46     }
47     else return candidates.get(0);
48   }
49   private Component detectAlternatives(ComponentMap cmap){
50     for(int i=0; i<keys.length; i++){
51       final Object JavaDoc key = keys[i];
52       Component c = cmap.getComponent(key);
53       if(c!=null) return c;
54     }
55     throw new UnresolvedComponentException(type);
56   }
57   public boolean isSingleton(){
58     return false;
59   }
60
61   public boolean isConcrete(){
62     return false;
63   }
64
65   public Class JavaDoc getType(){
66     return null;
67   }
68
69   public String JavaDoc toString(){
70     return "autodetect <" + Misc.getTypeName(type)+">";
71   }
72 }
73
Popular Tags