package org.aksw.sparqlify.core.cast;
import java.util.HashMap;
import java.util.Map;
import org.aksw.sparqlify.core.TypeToken;
public class CoercionSystemImpl3
implements CoercionSystem<TypeToken, SqlValueTransformer>
{
private TypeSystem typeSystem;
private Map<TypeToken, Map<TypeToken, SqlValueTransformer>> sourceToTargetToTransform = new HashMap<TypeToken, Map<TypeToken, SqlValueTransformer>>();
public CoercionSystemImpl3(TypeSystem typeSystem) {
this.typeSystem = typeSystem;
}
public SqlValueTransformer lookup(TypeToken sourceTypeName, TypeToken targetTypeName) {
Map<TypeToken, SqlValueTransformer> targetToDecl = sourceToTargetToTransform.get(sourceTypeName);
if(targetToDecl == null) {
return null;
}
SqlValueTransformer result = targetToDecl.get(targetTypeName);
return result;
}
/**
* Registers a coercion.
*
*
*
* @param sourceTypeName
* @param targetTypeName
*/
public void registerCoercion(TypeToken sourceTypeName, TypeToken targetTypeName, SqlValueTransformer transformer) {
if(typeSystem.isSuperClassOf(targetTypeName, sourceTypeName)) {
throw new RuntimeException("The return type must not be a subtype of the argument.");
}
Map<TypeToken, SqlValueTransformer> targetToDecl = sourceToTargetToTransform.get(sourceTypeName);
SqlValueTransformer priorDecl = null;
if(targetToDecl == null) {
targetToDecl = new HashMap<TypeToken, SqlValueTransformer>();
sourceToTargetToTransform.put(sourceTypeName, targetToDecl);
} else {
priorDecl = targetToDecl.get(targetTypeName);
}
//XClass priorTargetClass = targetToDecl.get(targetClass);
if(priorDecl != null) {
throw new RuntimeException("Coercion " + transformer + " from " + sourceTypeName + " to " + targetTypeName + " already defined with " + priorDecl);
}
targetToDecl.put(targetTypeName, transformer);
}
}