
edu.stanford.protege.webprotege.axiom.AxiomIRISubjectProvider Maven / Gradle / Ivy
The newest version!
package edu.stanford.protege.webprotege.axiom;
import org.semanticweb.owlapi.model.*;
import javax.inject.Inject;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Optional.empty;
import static java.util.Optional.of;
/**
* Matthew Horridge
* Stanford Center for Biomedical Informatics Research
* 30/01/15
*/
public class AxiomIRISubjectProvider {
private final AxiomSubjectProviderVisitor visitor;
@Inject
public AxiomIRISubjectProvider(Comparator iriComparator) {
visitor = new AxiomSubjectProviderVisitor(checkNotNull(iriComparator));
}
public Optional getSubject(OWLAxiom axiom) {
return axiom.accept(visitor);
}
private static class AxiomSubjectProviderVisitor implements OWLAxiomVisitorEx> {
public static final int BEFORE = -1;
public static final int SAME = 0;
public static final int AFTER = 1;
private final Comparator iriComparator;
public AxiomSubjectProviderVisitor(Comparator iriComparator) {
this.iriComparator = iriComparator;
}
private Optional wrapIterable(Iterable extends OWLObject> iterable) {
Iterator extends OWLObject> iterator = iterable.iterator();
if(!iterator.hasNext()) {
return empty();
}
Optional previous = wrap(iterator.next());
while(iterator.hasNext()) {
Optional current = wrap(iterator.next());
int diff = compare(previous, current);
if(diff > 0) {
previous = current;
}
}
return previous;
}
private int compare(Optional iriA, Optional iriB) {
if(iriA.isPresent()) {
if(iriB.isPresent()) {
return iriComparator.compare(iriA.get(), iriB.get());
}
else {
return BEFORE;
}
}
else {
if(iriB.isPresent()) {
return AFTER;
}
else {
return SAME;
}
}
}
private static Optional wrap(OWLObject object) {
if(object instanceof HasIRI) {
return of(((HasIRI) object).getIRI());
}
else if(object instanceof IRI) {
return of((IRI) object);
}
else {
return empty();
}
}
@Override
public Optional visit(OWLSubClassOfAxiom axiom) {
return wrap(axiom.getSubClass());
}
@Override
public Optional visit(OWLNegativeObjectPropertyAssertionAxiom axiom) {
return wrap(axiom.getSubject());
}
@Override
public Optional visit(OWLAsymmetricObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLReflexiveObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLDisjointClassesAxiom axiom) {
return wrapIterable(axiom.getClassExpressions());
}
@Override
public Optional visit(OWLDataPropertyDomainAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLObjectPropertyDomainAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLEquivalentObjectPropertiesAxiom axiom) {
return wrapIterable(axiom.getProperties());
}
@Override
public Optional visit(OWLNegativeDataPropertyAssertionAxiom axiom) {
return wrap(axiom.getSubject());
}
@Override
public Optional visit(OWLDifferentIndividualsAxiom axiom) {
return wrapIterable(axiom.getIndividuals());
}
@Override
public Optional visit(OWLDisjointDataPropertiesAxiom axiom) {
return wrapIterable(axiom.getProperties());
}
@Override
public Optional visit(OWLDisjointObjectPropertiesAxiom axiom) {
return wrapIterable(axiom.getProperties());
}
@Override
public Optional visit(OWLObjectPropertyRangeAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLObjectPropertyAssertionAxiom axiom) {
return wrap(axiom.getSubject());
}
@Override
public Optional visit(OWLFunctionalObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLSubObjectPropertyOfAxiom axiom) {
return wrap(axiom.getSubProperty());
}
@Override
public Optional visit(OWLDisjointUnionAxiom axiom) {
return wrap(axiom.getOWLClass());
}
@Override
public Optional visit(OWLDeclarationAxiom axiom) {
return wrap(axiom.getEntity());
}
@Override
public Optional visit(OWLAnnotationAssertionAxiom axiom) {
return wrap(axiom.getSubject());
}
@Override
public Optional visit(OWLSymmetricObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLDataPropertyRangeAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLFunctionalDataPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLEquivalentDataPropertiesAxiom axiom) {
return wrapIterable(axiom.getProperties());
}
@Override
public Optional visit(OWLClassAssertionAxiom axiom) {
return wrap(axiom.getIndividual());
}
@Override
public Optional visit(OWLEquivalentClassesAxiom axiom) {
return wrapIterable(axiom.getClassExpressions());
}
@Override
public Optional visit(OWLDataPropertyAssertionAxiom axiom) {
return wrap(axiom.getSubject());
}
@Override
public Optional visit(OWLTransitiveObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLIrreflexiveObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLSubDataPropertyOfAxiom axiom) {
return wrap(axiom.getSubProperty());
}
@Override
public Optional visit(OWLInverseFunctionalObjectPropertyAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLSameIndividualAxiom axiom) {
return wrapIterable(axiom.getIndividuals());
}
@Override
public Optional visit(OWLSubPropertyChainOfAxiom axiom) {
return wrap(axiom.getSuperProperty());
}
@Override
public Optional visit(OWLInverseObjectPropertiesAxiom axiom) {
return wrap(axiom.getFirstProperty());
}
@Override
public Optional visit(OWLHasKeyAxiom axiom) {
return wrap(axiom.getClassExpression());
}
@Override
public Optional visit(OWLDatatypeDefinitionAxiom axiom) {
return wrap(axiom.getDatatype());
}
@Override
public Optional visit(SWRLRule rule) {
return wrapIterable(rule.getHead());
}
@Override
public Optional visit(OWLSubAnnotationPropertyOfAxiom axiom) {
return wrap(axiom.getSubProperty());
}
@Override
public Optional visit(OWLAnnotationPropertyDomainAxiom axiom) {
return wrap(axiom.getProperty());
}
@Override
public Optional visit(OWLAnnotationPropertyRangeAxiom axiom) {
return wrap(axiom.getProperty());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy