All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 iterable) {
            Iterator 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