package uk.ac.manchester.cs.jfact;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.semanticweb.owlapi.model.OWLDataComplementOf;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataIntersectionOf;
import org.semanticweb.owlapi.model.OWLDataOneOf;
import org.semanticweb.owlapi.model.OWLDataRange;
import org.semanticweb.owlapi.model.OWLDataRangeVisitorEx;
import org.semanticweb.owlapi.model.OWLDataUnionOf;
import org.semanticweb.owlapi.model.OWLDatatype;
import org.semanticweb.owlapi.model.OWLDatatypeRestriction;
import org.semanticweb.owlapi.model.OWLFacetRestriction;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.reasoner.impl.DefaultNode;
import org.semanticweb.owlapi.reasoner.impl.DefaultNodeSet;
import org.semanticweb.owlapi.reasoner.impl.OWLDatatypeNode;
import org.semanticweb.owlapi.reasoner.impl.OWLDatatypeNodeSet;
import uk.ac.manchester.cs.jfact.datatypes.Datatype;
import uk.ac.manchester.cs.jfact.datatypes.DatatypeExpression;
import uk.ac.manchester.cs.jfact.datatypes.DatatypeFactory;
import uk.ac.manchester.cs.jfact.datatypes.Facet;
import uk.ac.manchester.cs.jfact.datatypes.Facets;
import uk.ac.manchester.cs.jfact.datatypes.Literal;
import uk.ac.manchester.cs.jfact.kernel.ExpressionManager;
import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.DataExpression;
/** datarange translator */
public class DataRangeTranslator extends
OWLEntityTranslator<OWLDatatype, DataExpression> implements
OWLDataRangeVisitorEx<DataExpression> {
private static final long serialVersionUID = 11000L;
private final DatatypeFactory f;
/**
* @param em
* em
* @param df
* df
* @param tr
* tr
* @param f
* f
*/
public DataRangeTranslator(ExpressionManager em, OWLDataFactory df,
TranslationMachinery tr, DatatypeFactory f) {
super(em, df, tr);
this.f = f;
}
@Override
protected DataExpression getTopEntityPointer() {
return em.dataTop();
}
@Override
protected DataExpression getBottomEntityPointer() {
return null;
}
@Override
protected DefaultNode<OWLDatatype> createDefaultNode() {
return new OWLDatatypeNode();
}
@Override
protected OWLDatatype getTopEntity() {
return df.getTopDatatype();
}
@Override
protected OWLDatatype getBottomEntity() {
return null;
}
@Override
protected DefaultNodeSet<OWLDatatype> createDefaultNodeSet() {
return new OWLDatatypeNodeSet();
}
@Override
protected DataExpression createPointerForEntity(OWLDatatype entity) {
return f.getKnownDatatype(entity.getIRI());
}
@Override
public Datatype<?> visit(OWLDatatype node) {
return f.getKnownDatatype(node.getIRI());
}
@Override
public DataExpression visit(OWLDataOneOf node) {
List<Literal<?>> l = new ArrayList<Literal<?>>();
for (OWLLiteral literal : node.getValues()) {
l.add(tr.pointer(literal));
}
return em.dataOneOf(l);
}
@Override
public DataExpression visit(OWLDataComplementOf node) {
return em.dataNot(node.getDataRange().accept(this));
}
@Override
public DataExpression visit(OWLDataIntersectionOf node) {
return em.dataAnd(translateDataRangeSet(node.getOperands()));
}
private List<DataExpression> translateDataRangeSet(
Set<OWLDataRange> dataRanges) {
List<DataExpression> l = new ArrayList<DataExpression>();
for (OWLDataRange op : dataRanges) {
l.add(op.accept(this));
}
return l;
}
@Override
public DataExpression visit(OWLDataUnionOf node) {
return em.dataOr(translateDataRangeSet(node.getOperands()));
}
@Override
public DataExpression visit(OWLDatatypeRestriction node) {
Datatype<?> type = f.getKnownDatatype(node.getDatatype().getIRI());
Set<OWLFacetRestriction> facetRestrictions = node
.getFacetRestrictions();
if (facetRestrictions.isEmpty()) {
return type;
}
DatatypeExpression<?> toReturn = null;
if (type.isNumericDatatype()) {
toReturn = DatatypeFactory.getNumericDatatypeExpression(type
.asNumericDatatype());
} else if (type.isOrderedDatatype()) {
toReturn = DatatypeFactory.getOrderedDatatypeExpression(type);
} else {
toReturn = DatatypeFactory.getDatatypeExpression(type);
}
for (OWLFacetRestriction restriction : facetRestrictions) {
Literal<?> dv = tr.pointer(restriction.getFacetValue());
Facet facet = Facets.parse(restriction.getFacet());
if (facet.isNumberFacet()) {
toReturn = toReturn.addNumericFacet(facet, dv.typedValue());
} else {
toReturn = toReturn.addNonNumericFacet(facet, dv.typedValue());
}
}
return toReturn;
}
}