00001 00057 package com.arcle.rmt.j2se.util; 00058 00059 import java.util.Map; 00060 import java.util.Iterator; 00061 import com.arcle.rmt.xplat.util.MutableReference; 00062 00181 public abstract class GenericClassMap { 00182 00187 public boolean visitClasses(ClassMapVisitor v) { 00188 boolean wantsMore = true; 00189 Iterator iter = getMappings().entrySet().iterator(); 00190 while (iter.hasNext() && wantsMore) { 00191 Map.Entry entry = (Map.Entry) iter.next(); 00192 wantsMore = v.visitClassMap((Class) entry.getKey(), 00193 entry.getValue()); 00194 } 00195 00196 // when wantsMore is true, iteration is stopped because the iterator 00197 // does not have more elements. 00198 return wantsMore; 00199 } 00200 00208 public Object findFirstInstance(final Object key) { 00209 final MutableReference ref = new MutableReference(null); 00210 ClassMapVisitor visitor = new ClassMapVisitor() { 00211 public boolean visitClassMap(Class cls, Object obj) { 00212 if (cls.isInstance(key)) { 00213 ref.value = obj; 00214 return false; 00215 } 00216 return true; 00217 } 00218 }; 00219 visitClasses(visitor); 00220 return ref.value; 00221 } 00222 00229 public Object getMappedObject(Class key) { 00230 return getMappings().get(key); 00231 } 00232 00237 protected abstract Map createMappings(); 00238 00242 protected Map getMappings() { 00243 if (_mappings == null) { 00244 _mappings = createMappings(); 00245 }; 00246 return _mappings; 00247 } 00248 00252 private Map _mappings; 00253 }