package org.mindswap.swoop.utils.owlapi;
import java.util.HashMap;
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.OWLAnd;
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.OWLEntity;
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.OWLIndividualAxiom;
import org.semanticweb.owl.model.OWLIndividualTypeAssertion;
import org.semanticweb.owl.model.OWLInverseFunctionalPropertyAxiom;
import org.semanticweb.owl.model.OWLInversePropertyAxiom;
import org.semanticweb.owl.model.OWLNot;
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.OWLObjectQuantifiedRestriction;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLOr;
import org.semanticweb.owl.model.OWLProperty;
import org.semanticweb.owl.model.OWLPropertyDomainAxiom;
import org.semanticweb.owl.model.OWLRestriction;
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 SignatureCollector extends OWLObjectVisitorAdapter {
protected Map axiomsToSignature;
protected Set allAxioms;
/**
* Construct a visitor that extracts a map from axioms in the ontology to their signature
*
* @param ontology
* @throws OWLException
*/
public SignatureCollector(Set allAxioms) throws OWLException {
this.allAxioms = allAxioms;
reset();
}
private static void addToMap(Map map, Object key, Object value) {
Set index = new HashSet();
if (map.containsKey(key)) index.addAll((HashSet) map.get(key));
if (value instanceof Set)
index.addAll((HashSet) value);
else
index.add(value);
map.put(key, index);
}
public Map getAxiomsToSignature(){
return axiomsToSignature;
}
public static Map buildSignatureToAxiom(Map axToSignature){
Map result = new HashMap();
Iterator iter = axToSignature.keySet().iterator();
while(iter.hasNext()){
OWLObject axiom = (OWLObject)iter.next();
Set signature = new HashSet();
signature = (Set)axToSignature.get(axiom);
Iterator it = signature.iterator();
while(it.hasNext()){
OWLEntity ent = (OWLEntity)it.next();
addToMap(result, ent, axiom);
}
}
return result;
}
public static Map buildSignatureMap(Set allAxioms) throws OWLException {
SignatureCollector collector = new SignatureCollector(allAxioms);
Set toVisit = new HashSet();
toVisit.addAll(allAxioms);
for (Iterator iter = toVisit.iterator(); iter.hasNext();) {
OWLObject obj = (OWLObject) iter.next();
if(obj != null)
obj.accept(collector);
}
return collector.axiomsToSignature;
}
public void reset() {
axiomsToSignature = new HashMap();
}
public void visit(OWLDifferentIndividualsAxiom node) throws OWLException {
Set signature = new HashSet();
Set sameInds = ((OWLDifferentIndividualsAxiom)node).getIndividuals();
signature.addAll(sameInds);
axiomsToSignature.put(node,signature);
}
public Set visit(OWLDescription desc) throws OWLException{
Set result = new HashSet();
if (desc instanceof OWLClass){
result.add(desc);
return result;
}
if (desc instanceof OWLNot){
return(visit(
((OWLNot)desc).getOperand()));
}
if (desc instanceof OWLAnd){
Iterator iter = ((OWLAnd)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription d = (OWLDescription)iter.next();
result.addAll(visit(d));
}
return result;
}
if (desc instanceof OWLOr){
Iterator iter = ((OWLOr)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription d = (OWLDescription)iter.next();
result.addAll(visit(d));
}
return result;
}
if(desc instanceof OWLRestriction){
result.add(((OWLRestriction)desc).getProperty());
if(desc instanceof OWLObjectQuantifiedRestriction)
result.addAll(visit(((OWLObjectQuantifiedRestriction)desc).getDescription()));
return result;
}
return result;
}
public void visit(OWLDisjointClassesAxiom node) throws OWLException {
Set signature = new HashSet();
Set disjointConcepts = ((OWLDisjointClassesAxiom)node).getDisjointClasses();
Iterator iter = disjointConcepts.iterator();
while(iter.hasNext()){
OWLDescription desc = (OWLDescription)iter.next();
signature.addAll(visit(desc));
}
axiomsToSignature.put(node,signature);
}
public void visit(OWLEquivalentClassesAxiom node) throws OWLException {
Set signature = new HashSet();
Set eqConcepts = ((OWLEquivalentClassesAxiom)node).getEquivalentClasses();
Iterator iter = eqConcepts.iterator();
while(iter.hasNext()){
OWLDescription desc = (OWLDescription)iter.next();
signature.addAll(visit(desc));
}
axiomsToSignature.put(node,signature);
}
public void visit(OWLEquivalentPropertiesAxiom node) throws OWLException {
Set signature = new HashSet();
Set eqProperties = ((OWLEquivalentPropertiesAxiom)node).getProperties();
Iterator iter = eqProperties.iterator();
while(iter.hasNext()){
OWLProperty prop = (OWLProperty)iter.next();
signature.add(prop);
}
axiomsToSignature.put(node,signature);
}
public void visit(OWLSameIndividualsAxiom node) throws OWLException {
Set signature = new HashSet();
Set sameInds = ((OWLSameIndividualsAxiom)node).getIndividuals();
signature.addAll(sameInds);
axiomsToSignature.put(node,signature);
}
public void visit(OWLSubClassAxiom node) throws OWLException {
Set signature = new HashSet();
OWLDescription sub = ((OWLSubClassAxiom)node).getSubClass();
OWLDescription sup = ((OWLSubClassAxiom)node).getSuperClass();
signature.addAll(visit(sub));
signature.addAll(visit(sup));
axiomsToSignature.put(node,signature);
}
public void visit(OWLAnnotationInstance node) throws OWLException {
}
public void visit(OWLSubPropertyAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty sub = ((OWLSubPropertyAxiom)node).getSubProperty();
OWLProperty sup = ((OWLSubPropertyAxiom)node).getSuperProperty();
signature.add(sub);
signature.add(sup);
axiomsToSignature.put(node,signature);
}
public void visit(OWLFunctionalPropertyAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLFunctionalPropertyAxiom)node).getProperty();
signature.add(prop);
axiomsToSignature.put(node,signature);
}
public void visit(OWLInverseFunctionalPropertyAxiom node)
throws OWLException {
Set signature = new HashSet();
OWLObjectProperty prop = ((OWLInverseFunctionalPropertyAxiom)node).getProperty();
signature.add(prop);
axiomsToSignature.put(node,signature);
}
public void visit(OWLTransitivePropertyAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLTransitivePropertyAxiom)node).getProperty();
signature.add(prop);
axiomsToSignature.put(node,signature);
}
public void visit(OWLSymmetricPropertyAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLSymmetricPropertyAxiom)node).getProperty();
signature.add(prop);
axiomsToSignature.put(node,signature);
}
public void visit(OWLInversePropertyAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLInversePropertyAxiom)node).getProperty();
OWLProperty inv = ((OWLInversePropertyAxiom)node).getInverseProperty();
signature.add(prop);
signature.add(inv);
axiomsToSignature.put(node,signature);
}
public void visit(OWLPropertyDomainAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLPropertyDomainAxiom)node).getProperty();
signature.add(prop);
OWLDescription desc = ((OWLPropertyDomainAxiom)node).getDomain();
signature.addAll(visit(desc));
axiomsToSignature.put(node,signature);
}
public void visit(OWLObjectPropertyRangeAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLObjectPropertyRangeAxiom)node).getProperty();
signature.add(prop);
OWLDescription desc = ((OWLObjectPropertyRangeAxiom)node).getRange();
signature.addAll(visit(desc));
axiomsToSignature.put(node,signature);
}
public void visit(OWLDataPropertyRangeAxiom node) throws OWLException {
Set signature = new HashSet();
OWLProperty prop = ((OWLDataPropertyRangeAxiom)node).getProperty();
signature.add(prop);
axiomsToSignature.put(node,signature);
}
public void visit(OWLIndividualAxiom node) throws OWLException{
Set signature = new HashSet();
signature.addAll(((OWLIndividualAxiom)node).getIndividuals());
axiomsToSignature.put(node,signature);
}
public void visit(OWLObjectPropertyInstance node) throws OWLException {
Set signature = new HashSet();
signature.add(((OWLObjectPropertyInstance)node).getSubject());
signature.add(((OWLObjectPropertyInstance)node).getObject());
signature.add(((OWLObjectPropertyInstance)node).getProperty());
axiomsToSignature.put(node,signature);
}
public void visit(OWLDataPropertyInstance node) throws OWLException {
Set signature = new HashSet();
signature.add(((OWLDataPropertyInstance)node).getSubject());
//signature.add(((OWLObjectPropertyInstance)node).getObject());
signature.add(((OWLDataPropertyInstance)node).getProperty());
axiomsToSignature.put(node,signature);
}
public void visit(OWLIndividualTypeAssertion node) throws OWLException {
Set signature = new HashSet();
signature.add(((OWLIndividualTypeAssertion)node).getIndividual());
OWLDescription desc = ((OWLIndividualTypeAssertion)node).getType();
signature.addAll(visit(desc));
axiomsToSignature.put(node,signature);
}
}