package uk.ac.manchester.cs.jfact; import java.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLObject; import org.semanticweb.owlapi.reasoner.Node; import org.semanticweb.owlapi.reasoner.NodeSet; import org.semanticweb.owlapi.reasoner.impl.DefaultNode; import org.semanticweb.owlapi.reasoner.impl.DefaultNodeSet; import uk.ac.manchester.cs.jfact.kernel.ExpressionManager; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.Entity; abstract class OWLEntityTranslator<E extends OWLObject, T extends Entity> implements Serializable { private static final long serialVersionUID = 11000L; private final Map<E, T> entity2dlentity = new HashMap<E, T>(); private final Map<T, E> dlentity2entity = new HashMap<T, E>(); protected final ExpressionManager em; protected final OWLDataFactory df; protected final TranslationMachinery tr; protected void fillMaps(E entity, T dlentity) { this.entity2dlentity.put(entity, dlentity); this.dlentity2entity.put(dlentity, entity); } protected OWLEntityTranslator(ExpressionManager em, OWLDataFactory df, TranslationMachinery tr) { this.em = em; this.df = df; this.tr = tr; E topEntity = this.getTopEntity(); if (topEntity != null) { this.fillMaps(topEntity, this.getTopEntityPointer()); } E bottomEntity = this.getBottomEntity(); if (bottomEntity != null) { this.fillMaps(bottomEntity, this.getBottomEntityPointer()); } } protected T registerNewEntity(E entity) { T pointer = this.createPointerForEntity(entity); this.fillMaps(entity, pointer); return pointer; } public E getEntityFromPointer(T pointer) { return this.dlentity2entity.get(pointer); } public T getPointerFromEntity(E entity) { T pointer = this.entity2dlentity.get(entity); if (pointer == null) { pointer = this.registerNewEntity(entity); } return pointer; } public Node<E> node(Collection<T> pointers) { DefaultNode<E> node = this.createDefaultNode(); for (T pointer : pointers) { node.add(this.getEntityFromPointer(pointer)); } return node; } public NodeSet<E> nodeSet(Collection<Collection<T>> pointers) { DefaultNodeSet<E> nodeSet = this.createDefaultNodeSet(); for (Collection<T> pointerArray : pointers) { nodeSet.addNode(this.node(pointerArray)); } return nodeSet; } protected abstract DefaultNode<E> createDefaultNode(); protected abstract DefaultNodeSet<E> createDefaultNodeSet(); protected abstract T getTopEntityPointer(); protected abstract T getBottomEntityPointer(); protected abstract T createPointerForEntity(E entity); protected abstract E getTopEntity(); protected abstract E getBottomEntity(); }