in src/main/java/org/apache/sling/models/impl/AdapterImplementations.java [192:227]
public <ModelType> ModelClass<ModelType> lookup(Class<ModelType> adapterType, Object adaptable) {
String key = adapterType.getName();
// lookup in cache for models without adapter classes
ModelClass<ModelType> modelClass = (ModelClass<ModelType>)modelClasses.get(key);
if (modelClass!=null) {
return modelClass;
}
// not found? look in cache with adapter classes
ConcurrentNavigableMap<String,ModelClass<?>> implementations = adapterImplementations.get(key);
if (implementations==null || implementations.isEmpty()) {
return null;
}
Collection<ModelClass<?>> implementationsCollection = implementations.values();
ModelClass<?>[] implementationWrappersArray = implementationsCollection.toArray(new ModelClass<?>[implementationsCollection.size()]);
// prepare array for implementation picker
Class<?>[] implementationsArray = new Class<?>[implementationsCollection.size()];
for (int i=0; i<implementationWrappersArray.length; i++) {
implementationsArray[i] = implementationWrappersArray[i].getType();
}
for (ImplementationPicker picker : this.sortedImplementationPickers) {
Class<?> implementation = picker.pick(adapterType, implementationsArray, adaptable);
if (implementation != null) {
for (int i=0; i<implementationWrappersArray.length; i++) {
if (implementation==implementationWrappersArray[i].getType()) {
return (ModelClass<ModelType>)implementationWrappersArray[i];
}
}
}
}
return null;
}