in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java [325:405]
private <T> T findObjectConverter(final Class clazz,
final Map<Class<?>, T> from,
final Map<Class<?>, T> cache) {
if (clazz == null) {
throw new IllegalArgumentException("clazz must not be null");
}
// first lets look in our cache
T converter = cache.get(clazz);
if (converter != null && converter != NO_CONVERTER) {
return converter;
}
// if we have found a dummy, we return null
if (converter == NO_CONVERTER) {
return null;
}
// we get called the first time for this class
// lets search...
Map<Class<?>, T> matchingConverters = new HashMap<Class<?>, T>();
for (Map.Entry<Class<?>, T> entry : from.entrySet()) {
if (clazz == entry.getKey()) {
converter = entry.getValue();
break;
}
if (entry.getKey().isAssignableFrom(clazz)) {
matchingConverters.put(entry.getKey(), entry.getValue());
}
}
if (converter != null) {
cache.put(clazz, converter);
return converter;
}
if (matchingConverters.isEmpty()) {
cache.put(clazz, (T) NO_CONVERTER);
return null;
}
// search the most significant
Class toProcess = clazz;
while (toProcess != null && converter == null) {
converter = matchingConverters.get(toProcess);
if (converter != null) {
break;
}
Class[] interfaces = toProcess.getInterfaces();
if (interfaces.length > 0) {
for (Class interfaceToSearch : interfaces) {
converter = matchingConverters.get(interfaceToSearch);
if (converter != null) {
break;
}
}
}
if (converter == null && toProcess.isInterface()) {
converter = matchingConverters.get(Object.class);
break;
}
toProcess = toProcess.getSuperclass();
}
if (converter == null) {
cache.put(clazz, (T) NO_CONVERTER);
} else {
cache.put(clazz, converter);
}
return converter;
}