package org.aksw.sparqlify.core.cast; import java.util.HashMap; import java.util.Map; import org.aksw.sparqlify.core.TypeToken; public class CoercionSystemImpl2 implements CoercionSystem<TypeToken, NodeValueTransformer> { private TypeSystem typeSystem; private Map<TypeToken, Map<TypeToken, NodeValueTransformer>> sourceToTargetToTransform = new HashMap<TypeToken, Map<TypeToken, NodeValueTransformer>>(); public CoercionSystemImpl2(TypeSystem typeSystem) { this.typeSystem = typeSystem; } public NodeValueTransformer lookup(TypeToken sourceTypeName, TypeToken targetTypeName) { Map<TypeToken, NodeValueTransformer> targetToDecl = sourceToTargetToTransform.get(sourceTypeName); if(targetToDecl == null) { return null; } NodeValueTransformer result = targetToDecl.get(targetTypeName); return result; } /** * Registers a coercion. * * * * @param sourceTypeName * @param targetTypeName */ public void registerCoercion(TypeToken sourceTypeName, TypeToken targetTypeName, NodeValueTransformer transformer) { if(typeSystem.isSuperClassOf(targetTypeName, sourceTypeName)) { throw new RuntimeException("The return type must not be a subtype of the argument."); } Map<TypeToken, NodeValueTransformer> targetToDecl = sourceToTargetToTransform.get(sourceTypeName); NodeValueTransformer priorDecl = null; if(targetToDecl == null) { targetToDecl = new HashMap<TypeToken, NodeValueTransformer>(); 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); } }