package dbfit.util;
import java.util.HashMap;
import java.util.Map;
public class TypeTransformerFactory {
private Map<Class<?>, TypeTransformer> transformers = new HashMap<Class<?>, TypeTransformer>();
private Class<?> getCandidateIfAncestor(Class<?> target, Class<?> candidate) {
return candidate.isAssignableFrom(target) ? candidate : null;
}
private Class<?> getCandidateIfBetter(Class<?> currentBest, Class<?> nextCandidate) {
return currentBest.isAssignableFrom(nextCandidate) ? nextCandidate : currentBest;
}
private Class<?> findClosestAncestor(Class<?> targetClass) {
Class<?> currentBest = null;
for (Class<?> candidate: transformers.keySet()) {
if (currentBest == null) {
currentBest = getCandidateIfAncestor(targetClass, candidate);
} else {
currentBest = getCandidateIfBetter(currentBest, candidate);
}
}
return currentBest;
}
public void setTransformer(Class<?> targetClass, TypeTransformer normaliser) {
transformers.put(targetClass, normaliser);
}
public TypeTransformer getTransformer(Class<?> targetClass) {
TypeTransformer normaliser = transformers.get(targetClass);
if (normaliser == null) {
Class<?> bestCandidate = findClosestAncestor(targetClass);
if (bestCandidate != null) {
normaliser = transformers.get(bestCandidate);
transformers.put(targetClass, normaliser);
}
}
return normaliser;
}
}