package org.mindswap.swoop.utils.owlapi.diff;
import java.net.URI;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.change.AddAnnotationInstance;
import org.semanticweb.owl.model.change.AddClassAxiom;
import org.semanticweb.owl.model.change.AddDataPropertyInstance;
import org.semanticweb.owl.model.change.AddDataPropertyRange;
import org.semanticweb.owl.model.change.AddDataType;
import org.semanticweb.owl.model.change.AddDomain;
import org.semanticweb.owl.model.change.AddEntity;
import org.semanticweb.owl.model.change.AddEnumeration;
import org.semanticweb.owl.model.change.AddEquivalentClass;
import org.semanticweb.owl.model.change.AddForeignEntity;
import org.semanticweb.owl.model.change.AddImport;
import org.semanticweb.owl.model.change.AddIndividualAxiom;
import org.semanticweb.owl.model.change.AddIndividualClass;
import org.semanticweb.owl.model.change.AddInverse;
import org.semanticweb.owl.model.change.AddObjectPropertyInstance;
import org.semanticweb.owl.model.change.AddObjectPropertyRange;
import org.semanticweb.owl.model.change.AddPropertyAxiom;
import org.semanticweb.owl.model.change.AddSuperClass;
import org.semanticweb.owl.model.change.AddSuperProperty;
import org.semanticweb.owl.model.change.ChangeVisitor;
import org.semanticweb.owl.model.change.OntologyChange;
import org.semanticweb.owl.model.change.RemoveAnnotationInstance;
import org.semanticweb.owl.model.change.RemoveClassAxiom;
import org.semanticweb.owl.model.change.RemoveDataPropertyInstance;
import org.semanticweb.owl.model.change.RemoveDataPropertyRange;
import org.semanticweb.owl.model.change.RemoveDataType;
import org.semanticweb.owl.model.change.RemoveDomain;
import org.semanticweb.owl.model.change.RemoveEntity;
import org.semanticweb.owl.model.change.RemoveEnumeration;
import org.semanticweb.owl.model.change.RemoveEquivalentClass;
import org.semanticweb.owl.model.change.RemoveForeignEntity;
import org.semanticweb.owl.model.change.RemoveImport;
import org.semanticweb.owl.model.change.RemoveIndividualAxiom;
import org.semanticweb.owl.model.change.RemoveIndividualClass;
import org.semanticweb.owl.model.change.RemoveInverse;
import org.semanticweb.owl.model.change.RemoveObjectPropertyInstance;
import org.semanticweb.owl.model.change.RemoveObjectPropertyRange;
import org.semanticweb.owl.model.change.RemovePropertyAxiom;
import org.semanticweb.owl.model.change.RemoveSuperClass;
import org.semanticweb.owl.model.change.RemoveSuperProperty;
import org.semanticweb.owl.model.change.SetDeprecated;
import org.semanticweb.owl.model.change.SetFunctional;
import org.semanticweb.owl.model.change.SetInverseFunctional;
import org.semanticweb.owl.model.change.SetLinkTarget;
import org.semanticweb.owl.model.change.SetLogicalURI;
import org.semanticweb.owl.model.change.SetOneToOne;
import org.semanticweb.owl.model.change.SetSymmetric;
import org.semanticweb.owl.model.change.SetTransitive;
public class ChangePolarity implements ChangeVisitor {
List changes;
private ChangePolarity() {
changes = new Vector();
}
public static List invert(Collection changes) throws OWLException {
ChangePolarity changer = new ChangePolarity();
for (Iterator iter = changes.iterator(); iter.hasNext(); ) {
OntologyChange change = (OntologyChange) iter.next();
change.accept(changer);
}
return changer.changes;
}
public void visit(AddAnnotationInstance event) throws OWLException {
changes.add(new RemoveAnnotationInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getContent(), event.getCause()));
}
public void visit(AddEntity event) throws OWLException {
changes.add(new RemoveEntity(event.getOntology(), event.getEntity(), event.getCause()));
}
public void visit(AddDataType event) throws OWLException {
changes.add(new RemoveDataType(event.getOntology(), event.getDatatype(), event.getCause()));
}
public void visit(RemoveEntity event) throws OWLException {
changes.add(new AddEntity(event.getOntology(), event.getEntity(), event.getCause()));
}
public void visit(AddImport event) throws OWLException {
changes.add(new RemoveImport(event.getOntology(), event.getImportOntology(), event.getCause()));
}
public void visit(AddIndividualAxiom event) throws OWLException {
changes.add(new RemoveIndividualAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(AddClassAxiom event) throws OWLException {
changes.add(new RemoveClassAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(AddPropertyAxiom event) throws OWLException {
changes.add(new RemovePropertyAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(AddSuperClass event) throws OWLException {
changes.add(new RemoveSuperClass(event.getOntology(), event.getOWLClass(), event.getDescription(), event.getCause()));
}
public void visit(AddSuperProperty event) throws OWLException {
changes.add(new RemoveSuperProperty(event.getOntology(), event.getProperty(), event.getSuperProperty(), event.getCause()));
}
public void visit(AddIndividualClass event) throws OWLException {
changes.add(new RemoveIndividualClass(event.getOntology(), event.getIndividual(), event.getDescription(), event.getCause()));
}
public void visit(AddEquivalentClass event) throws OWLException {
changes.add(new RemoveEquivalentClass(event.getOntology(), event.getOWLClass(), event.getDescription(), event.getCause()));
}
public void visit(AddEnumeration event) throws OWLException {
changes.add(new RemoveEnumeration(event.getOntology(), event.getOWLClass(), event.getEnumeration(), event.getCause()));
}
public void visit(AddDomain event) throws OWLException {
changes.add(new RemoveDomain(event.getOntology(), event.getProperty(), event.getDomain(), event.getCause()));
}
public void visit(AddDataPropertyRange event) throws OWLException {
changes.add(new RemoveDataPropertyRange(event.getOntology(), event.getProperty(), event.getRange(), event.getCause()));
}
public void visit(AddObjectPropertyRange event) throws OWLException {
changes.add(new RemoveObjectPropertyRange(event.getOntology(), event.getProperty(), event.getRange(), event.getCause()));
}
public void visit(AddInverse event) throws OWLException {
changes.add(new RemoveInverse(event.getOntology(), event.getProperty(), event.getInverse(), event.getCause()));
}
public void visit(SetFunctional event) throws OWLException {
changes.add(new SetFunctional(event.getOntology(), event.getProperty(), !event.isFunctional(), event.getCause()));
}
public void visit(SetTransitive event) throws OWLException {
changes.add(new SetTransitive(event.getOntology(), event.getProperty(), !event.isTransitive(), event.getCause()));
}
public void visit(SetSymmetric event) throws OWLException {
changes.add(new SetSymmetric(event.getOntology(), event.getProperty(), !event.isSymmetric(), event.getCause()));
}
public void visit(SetInverseFunctional event) throws OWLException {
changes.add(new SetInverseFunctional(event.getOntology(), event.getProperty(), !event.isInverseFunctional(), event.getCause()));
}
public void visit(SetOneToOne event) throws OWLException {
changes.add(new SetOneToOne(event.getOntology(), event.getProperty(), !event.isOneToOne(), event.getCause()));
}
public void visit(SetDeprecated event) throws OWLException {
changes.add(new SetDeprecated(event.getOntology(), event.getObject(), !event.isDeprecated(), event.getCause()));
}
public void visit(AddObjectPropertyInstance event) throws OWLException {
changes.add(new RemoveObjectPropertyInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getObject(), event.getCause()));
}
public void visit(AddDataPropertyInstance event) throws OWLException {
changes.add(new RemoveDataPropertyInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getObject(), event.getCause()));
}
public void visit(RemoveClassAxiom event) throws OWLException {
changes.add(new AddClassAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(RemoveSuperClass event) throws OWLException {
changes.add(new AddSuperClass(event.getOntology(), event.getOWLClass(), event.getDescription(), event.getCause()));
}
public void visit(RemoveEquivalentClass event) throws OWLException {
changes.add(new AddEquivalentClass(event.getOntology(), event.getOWLClass(), event.getDescription(), event.getCause()));
}
public void visit(RemoveEnumeration event) throws OWLException {
changes.add(new AddEnumeration(event.getOntology(), event.getOWLClass(), event.getEnumeration(), event.getCause()));
}
public void visit(SetLogicalURI event) throws OWLException {
// Err, no reverse of this.
changes.add(event);
}
public void visit(RemoveDomain event) throws OWLException {
changes.add(new AddDomain(event.getOntology(), event.getProperty(), event.getDomain(), event.getCause()));
}
public void visit(RemoveDataPropertyRange event) throws OWLException {
changes.add(new AddDataPropertyRange(event.getOntology(), event.getProperty(), event.getRange(), event.getCause()));
}
public void visit(RemoveObjectPropertyRange event) throws OWLException {
changes.add(new AddObjectPropertyRange(event.getOntology(), event.getProperty(), event.getRange(), event.getCause()));
}
public void visit(RemovePropertyAxiom event) throws OWLException {
changes.add(new AddPropertyAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(RemoveIndividualAxiom event) throws OWLException {
changes.add(new AddIndividualAxiom(event.getOntology(), event.getAxiom(), event.getCause()));
}
public void visit(RemoveDataPropertyInstance event) throws OWLException {
changes.add(new AddDataPropertyInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getObject(), event.getCause()));
}
public void visit(RemoveObjectPropertyInstance event) throws OWLException {
changes.add(new AddObjectPropertyInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getObject(), event.getCause()));
}
public void visit(RemoveSuperProperty event) throws OWLException {
changes.add(new AddSuperProperty(event.getOntology(), event.getProperty(), event.getSuperProperty(), event.getCause()));
}
public void visit(RemoveAnnotationInstance event) throws OWLException {
changes.add(new AddAnnotationInstance(event.getOntology(), event.getSubject(), event.getProperty(), event.getContent(), event.getCause()));
}
public void visit(RemoveImport event) throws OWLException {
changes.add(new AddImport(event.getOntology(), event.getImportOntology(), event.getCause()));
}
public void visit(RemoveIndividualClass event) throws OWLException {
changes.add(new AddIndividualClass(event.getOntology(), event.getIndividual(), event.getDescription(), event.getCause()));
}
public void visit(RemoveInverse event) throws OWLException {
changes.add(new AddInverse(event.getOntology(), event.getProperty(), event.getInverse(), event.getCause()));
}
public void visit(SetLinkTarget target) throws OWLException {
// No inverse
changes.add(target);
}
public void visit(AddForeignEntity entity) throws OWLException {
changes.add(new RemoveForeignEntity(entity.getOntology(), entity.getForeignEntity(), entity.getCause()));
}
public void visit(RemoveForeignEntity entity) throws OWLException {
for (Iterator iter = entity.getOntology().getForeignEntities().entrySet().iterator();
iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
if (entity.getForeignEntity().equals(entry.getValue())) {
changes.add(new AddForeignEntity(entity.getOntology(), entity.getForeignEntity(), (URI) entry.getKey(), entity.getCause()));
}
}
}
public void visit(RemoveDataType event) throws OWLException {
changes.add(new AddDataType(event.getOntology(), event.getDatatype(), event.getCause()));
}
}