1 package jfun.yan; 2 3 import java.util.Arrays ; 4 import java.util.List ; 5 6 import jfun.util.Misc; 7 8 14 final class AutoDetectingComponent<T> extends Component<T> { 15 private final Class <T> type; 16 private final Object [] keys; 17 AutoDetectingComponent(Class <T> type, final Object [] keys) { 18 this.type = type; 19 this.keys = keys; 20 } 21 22 public boolean equals(Object 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 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 <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 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 getType(){ 66 return null; 67 } 68 69 public String toString(){ 70 return "autodetect <" + Misc.getTypeName(type)+">"; 71 } 72 } 73 | Popular Tags |