package uk.ac.manchester.cs.jfact;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLClassExpressionVisitorEx;
import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
import org.semanticweb.owlapi.model.OWLDataExactCardinality;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataHasValue;
import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
import org.semanticweb.owlapi.model.OWLDataMinCardinality;
import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectComplementOf;
import org.semanticweb.owlapi.model.OWLObjectExactCardinality;
import org.semanticweb.owlapi.model.OWLObjectHasSelf;
import org.semanticweb.owlapi.model.OWLObjectHasValue;
import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
import org.semanticweb.owlapi.model.OWLObjectMaxCardinality;
import org.semanticweb.owlapi.model.OWLObjectMinCardinality;
import org.semanticweb.owlapi.model.OWLObjectOneOf;
import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
import org.semanticweb.owlapi.reasoner.impl.DefaultNode;
import org.semanticweb.owlapi.reasoner.impl.DefaultNodeSet;
import org.semanticweb.owlapi.reasoner.impl.OWLClassNode;
import org.semanticweb.owlapi.reasoner.impl.OWLClassNodeSet;
import uk.ac.manchester.cs.jfact.kernel.ExpressionManager;
import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.ConceptExpression;
/** class expression translator */
public class ClassExpressionTranslator extends
OWLEntityTranslator<OWLClass, ConceptExpression> implements
OWLClassExpressionVisitorEx<ConceptExpression> {
private static final long serialVersionUID = 11000L;
/**
* @param em
* em
* @param df
* df
* @param tr
* tr
*/
public ClassExpressionTranslator(ExpressionManager em, OWLDataFactory df,
TranslationMachinery tr) {
super(em, df, tr);
}
@Override
protected ConceptExpression getTopEntityPointer() {
return em.top();
}
@Override
protected ConceptExpression getBottomEntityPointer() {
return em.bottom();
}
@Override
protected OWLClass getTopEntity() {
return df.getOWLThing();
}
@Override
protected OWLClass getBottomEntity() {
return df.getOWLNothing();
}
@Override
protected ConceptExpression createPointerForEntity(OWLClass entity) {
// XXX many entities would cause a lot of wasted memory
return em.concept(entity.getIRI());
}
@Override
protected DefaultNode<OWLClass> createDefaultNode() {
return new OWLClassNode();
}
@Override
protected DefaultNodeSet<OWLClass> createDefaultNodeSet() {
return new OWLClassNodeSet();
}
@Override
public ConceptExpression visit(OWLClass desc) {
return getPointerFromEntity(desc);
}
@Override
public ConceptExpression visit(OWLObjectIntersectionOf desc) {
return em.and(translateClassExpressionSet(desc.getOperands()));
}
private List<ConceptExpression> translateClassExpressionSet(
Set<OWLClassExpression> classExpressions) {
List<ConceptExpression> l = new ArrayList<ConceptExpression>();
for (OWLClassExpression ce : classExpressions) {
l.add(ce.accept(this));
}
return l;
}
@Override
public ConceptExpression visit(OWLObjectUnionOf desc) {
return em.or(translateClassExpressionSet(desc.getOperands()));
}
@Override
public ConceptExpression visit(OWLObjectComplementOf desc) {
return em.not(desc.getOperand().accept(this));
}
@Override
public ConceptExpression visit(OWLObjectSomeValuesFrom desc) {
return em.exists(tr.pointer(desc.getProperty()), desc.getFiller()
.accept(this));
}
@Override
public ConceptExpression visit(OWLObjectAllValuesFrom desc) {
return em.forall(tr.pointer(desc.getProperty()), desc.getFiller()
.accept(this));
}
@Override
public ConceptExpression visit(OWLObjectHasValue desc) {
return em.value(tr.pointer(desc.getProperty()),
tr.pointer(desc.getValue()));
}
@Override
public ConceptExpression visit(OWLObjectMinCardinality desc) {
return em.minCardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), desc.getFiller().accept(this));
}
@Override
public ConceptExpression visit(OWLObjectExactCardinality desc) {
return em.cardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), desc.getFiller().accept(this));
}
@Override
public ConceptExpression visit(OWLObjectMaxCardinality desc) {
return em.maxCardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), desc.getFiller().accept(this));
}
@Override
public ConceptExpression visit(OWLObjectHasSelf desc) {
return em.selfReference(tr.pointer(desc.getProperty()));
}
@Override
public ConceptExpression visit(OWLObjectOneOf desc) {
return em.oneOf(tr.translate(desc.getIndividuals()));
}
@Override
public ConceptExpression visit(OWLDataSomeValuesFrom desc) {
return em.exists(tr.pointer(desc.getProperty()),
tr.pointer(desc.getFiller()));
}
@Override
public ConceptExpression visit(OWLDataAllValuesFrom desc) {
return em.forall(tr.pointer(desc.getProperty()),
tr.pointer(desc.getFiller()));
}
@Override
public ConceptExpression visit(OWLDataHasValue desc) {
return em.value(tr.pointer(desc.getProperty()),
tr.pointer(desc.getValue()));
}
@Override
public ConceptExpression visit(OWLDataMinCardinality desc) {
return em.minCardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), tr.pointer(desc.getFiller()));
}
@Override
public ConceptExpression visit(OWLDataExactCardinality desc) {
return em.cardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), tr.pointer(desc.getFiller()));
}
@Override
public ConceptExpression visit(OWLDataMaxCardinality desc) {
return em.maxCardinality(desc.getCardinality(),
tr.pointer(desc.getProperty()), tr.pointer(desc.getFiller()));
}
}