package org.mindswap.swoop.utils.owlapi.diff;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.change.ChangeVisitorAdapter;
import org.semanticweb.owl.model.change.OntologyChange;
import org.semanticweb.owl.model.change.RemoveDataType;
import org.semanticweb.owl.model.change.RemoveEntity;
import org.semanticweb.owl.model.change.RemoveIndividualClass;
public class FilteredDiff extends ChangeVisitorAdapter {
private boolean result;
OWLOntology destination;
OWLOntology source;
OWLOntology target;
private FilteredDiff(OWLOntology source, OWLOntology destination, OWLOntology target) throws OWLException {
this.destination = destination;
this.source = source;
this.target = target;
}
/**
* Diffs two ontologies, filtering out RemoveEntity and RemoveDataType changes.
* @param source
* @param dest
* @param target
* @return Filtered list of ontology changes.
*/
public static List getChanges(OWLOntology source, OWLOntology dest, OWLOntology target) throws OWLException {
List diff = OWLDiff.getChanges(source, dest, target);
List filtered = new Vector();
FilteredDiff fdiff = new FilteredDiff(source, dest, target);
for (Iterator iter = diff.iterator(); iter.hasNext(); ) {
OntologyChange change = (OntologyChange) iter.next();
fdiff.result = true;
change.accept(fdiff);
if (fdiff.result) {
filtered.add(change);
}
}
return filtered;
}
/*
* Don't accept entity removal events (non-Javadoc)
* @see org.semanticweb.owl.model.change.ChangeVisitor#visit(org.semanticweb.owl.model.change.RemoveEntity)
*/
public void visit(RemoveEntity event) throws OWLException {
result = false;
}
/*
* Don't accept datatype removal events (non-Javadoc)
* @see org.semanticweb.owl.model.change.ChangeVisitor#visit(org.semanticweb.owl.model.change.RemoveDataType)
*/
public void visit(RemoveDataType event) throws OWLException {
result = false;
}
/*
* Ignore inividual's type remove if they are not in the destination ontology (non-Javadoc)
* @see org.semanticweb.owl.model.change.ChangeVisitor#visit(org.semanticweb.owl.model.change.RemoveIndividualClass)
*/
public void visit(RemoveIndividualClass event) throws OWLException {
URI indURI;
if (event.getIndividual().isAnonymous()) {
indURI = event.getIndividual().getAnonId();
} else {
indURI = event.getIndividual().getURI();
}
if (destination.getIndividual(indURI) == null) {
result = false;
}
}
}