package org.mindswap.swoop.utils.owlapi;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.semanticweb.owl.impl.model.OWLDataFactoryImpl;
import org.semanticweb.owl.impl.model.OWLIndividualTypeAssertionImpl;
import org.semanticweb.owl.model.OWLAnnotationInstance;
import org.semanticweb.owl.model.OWLAnnotationProperty;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLDataFactory;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLDataPropertyInstance;
import org.semanticweb.owl.model.OWLDataPropertyRangeAxiom;
import org.semanticweb.owl.model.OWLDataRange;
import org.semanticweb.owl.model.OWLDataType;
import org.semanticweb.owl.model.OWLDataValue;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLEquivalentPropertiesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLFunctionalPropertyAxiom;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLIndividualTypeAssertion;
import org.semanticweb.owl.model.OWLInverseFunctionalPropertyAxiom;
import org.semanticweb.owl.model.OWLInversePropertyAxiom;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLObjectPropertyInstance;
import org.semanticweb.owl.model.OWLObjectPropertyRangeAxiom;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLProperty;
import org.semanticweb.owl.model.OWLPropertyDomainAxiom;
import org.semanticweb.owl.model.OWLSameIndividualsAxiom;
import org.semanticweb.owl.model.OWLSubClassAxiom;
import org.semanticweb.owl.model.OWLSubPropertyAxiom;
import org.semanticweb.owl.model.OWLSymmetricPropertyAxiom;
import org.semanticweb.owl.model.OWLTransitivePropertyAxiom;
import org.semanticweb.owl.model.helper.OWLObjectVisitorAdapter;
public class AxiomCollector extends OWLObjectVisitorAdapter {
protected Set collectedAxioms;
protected OWLOntology ontology;
protected OWLDataFactory factory;
/**
* Construct a visitor that extracts *Axiom and *Instance objects
* from objects it visits.
*
* @param ontology
* @throws OWLException
*/
public AxiomCollector(OWLOntology ontology) throws OWLException {
this.ontology = ontology;
this.factory = ontology.getOWLDataFactory();
reset();
}
public static Set axiomize(OWLOntology ontology) throws OWLException {
AxiomCollector collector = new AxiomCollector(ontology);
Set toVisit = new HashSet();
toVisit.add(ontology);
toVisit.addAll(ontology.getClasses());
toVisit.addAll(ontology.getDatatypes());
toVisit.addAll(ontology.getAnnotationProperties());
toVisit.addAll(ontology.getDataProperties());
toVisit.addAll(ontology.getObjectProperties());
toVisit.addAll(ontology.getIndividuals());
toVisit.addAll(ontology.getClassAxioms());
toVisit.addAll(ontology.getPropertyAxioms());
toVisit.addAll(ontology.getIndividualAxioms());
for (Iterator iter = toVisit.iterator(); iter.hasNext();) {
OWLObject obj = (OWLObject) iter.next();
obj.accept(collector);
}
return collector.axioms();
}
public Set axioms() {
return collectedAxioms;
}
public void reset() {
collectedAxioms = new HashSet();
}
protected void addAnnotations(OWLObject node) throws OWLException {
for (Iterator iter = node.getAnnotations(ontology).iterator(); iter.hasNext(); ) {
OWLAnnotationInstance annotation = (OWLAnnotationInstance) iter.next();
collectedAxioms.add(annotation);
}
}
protected void addCommonPropertyAxioms(OWLProperty node) throws OWLException {
addAnnotations(node);
for (Iterator iter = node.getSuperProperties(ontology).iterator(); iter.hasNext();) {
OWLProperty superProp = (OWLProperty) iter.next();
collectedAxioms.add(factory.getOWLSubPropertyAxiom(node, superProp));
}
for (Iterator iter = node.getDomains(ontology).iterator(); iter.hasNext();) {
OWLDescription description = (OWLDescription) iter.next();
collectedAxioms.add(factory.getOWLPropertyDomainAxiom(node, description));
}
if (node.isFunctional(ontology)) {
collectedAxioms.add(factory.getOWLFunctionalPropertyAxiom(node));
}
}
/**
* Adds just the annotations of the ontology.
*/
public void visit(OWLOntology node) throws OWLException {
addAnnotations(node);
}
public void visit(OWLAnnotationProperty node) throws OWLException {
addAnnotations(node);
}
public void visit(OWLAnnotationInstance node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLDataProperty node) throws OWLException {
addCommonPropertyAxioms(node);
for (Iterator iter = node.getRanges(ontology).iterator(); iter.hasNext();) {
OWLDataRange range = (OWLDataRange) iter.next();
collectedAxioms.add(factory.getOWLDataPropertyRangeAxiom(node, range));
}
}
public void visit(OWLDataType node) throws OWLException {
addAnnotations(node);
}
public void visit(OWLDifferentIndividualsAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLDisjointClassesAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLEquivalentClassesAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLEquivalentPropertiesAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLIndividual node) throws OWLException {
addAnnotations(node);
for (Iterator iter = node.getTypes(ontology).iterator(); iter.hasNext(); ) {
OWLDescription type = (OWLDescription) iter.next();
collectedAxioms.add(new OWLIndividualTypeAssertionImpl((OWLDataFactoryImpl) factory, node, type));
}
Map dataMap = node.getDataPropertyValues(ontology);
for (Iterator keyIter = dataMap.keySet().iterator(); keyIter.hasNext();) {
OWLDataProperty prop = (OWLDataProperty) keyIter.next();
Set values = (Set) dataMap.get(prop);
for (Iterator iter = values.iterator(); iter.hasNext(); ) {
OWLDataValue value = (OWLDataValue) iter.next();
collectedAxioms.add(factory.getOWLDataPropertyInstance(node, prop, value));
}
}
Map objectMap = node.getObjectPropertyValues(ontology);
for (Iterator keyIter = objectMap.keySet().iterator(); keyIter.hasNext();) {
OWLObjectProperty prop = (OWLObjectProperty) keyIter.next();
Set values = (Set) objectMap.get(prop);
for (Iterator iter = values.iterator(); iter.hasNext(); ) {
OWLIndividual value = (OWLIndividual) iter.next();
collectedAxioms.add(factory.getOWLObjectPropertyInstance(node, prop, value));
}
}
}
public void visit(OWLObjectProperty node) throws OWLException {
addCommonPropertyAxioms(node);
for (Iterator iter = node.getDomains(ontology).iterator(); iter.hasNext();) {
OWLDescription description = (OWLDescription) iter.next();
collectedAxioms.add(factory.getOWLPropertyDomainAxiom(node, description));
}
for (Iterator iter = node.getRanges(ontology).iterator(); iter.hasNext();) {
OWLDescription description = (OWLDescription) iter.next();
collectedAxioms.add(factory.getOWLObjectPropertyRangeAxiom(node, description));
}
for(Iterator iter = node.getInverses(ontology).iterator(); iter.hasNext();){
OWLObjectProperty prop = (OWLObjectProperty)iter.next();
collectedAxioms.add(factory.getOWLInversePropertyAxiom(node,prop));
}
if (node.isInverseFunctional(ontology)) {
collectedAxioms.add(factory.getOWLInverseFunctionalPropertyAxiom(node));
}
if (node.isSymmetric(ontology)) {
collectedAxioms.add(factory.getOWLSymmetricPropertyAxiom(node));
}
if (node.isTransitive(ontology)) {
collectedAxioms.add(factory.getOWLTransitivePropertyAxiom(node));
}
}
public void visit(OWLClass node) throws OWLException {
addAnnotations(node);
for (Iterator iter = node.getSuperClasses(ontology).iterator(); iter.hasNext();) {
OWLDescription superClass = (OWLDescription) iter.next();
collectedAxioms.add(factory.getOWLSubClassAxiom(node, superClass));
}
Set equivalents = new HashSet(node.getEquivalentClasses(ontology));
equivalents.addAll(node.getEnumerations(ontology));
equivalents.add(node);
collectedAxioms.add(factory.getOWLEquivalentClassesAxiom(equivalents));
}
public void visit(OWLSameIndividualsAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLSubClassAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLSubPropertyAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLFunctionalPropertyAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLInverseFunctionalPropertyAxiom node)
throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLTransitivePropertyAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLSymmetricPropertyAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLInversePropertyAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLPropertyDomainAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLObjectPropertyRangeAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLDataPropertyRangeAxiom node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLObjectPropertyInstance node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLDataPropertyInstance node) throws OWLException {
collectedAxioms.add(node);
}
public void visit(OWLIndividualTypeAssertion node) throws OWLException {
collectedAxioms.add(node);
}
}