package org.mindswap.swoop.refactoring;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.swing.JOptionPane;
import org.mindswap.swoop.OntologyDisplay;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.renderer.SwoopOntologyRenderer;
import org.mindswap.swoop.renderer.entity.AbstractSyntaxEntityRenderer;
import org.mindswap.swoop.utils.owlapi.CorrectedRDFRenderer;
import org.semanticweb.owl.io.RendererException;
import org.semanticweb.owl.model.OWLAnd;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDataFactory;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLEnumeration;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLNot;
import org.semanticweb.owl.model.OWLObjectAllRestriction;
import org.semanticweb.owl.model.OWLObjectCardinalityRestriction;
import org.semanticweb.owl.model.OWLObjectSomeRestriction;
import org.semanticweb.owl.model.OWLObjectValueRestriction;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLOr;
import org.semanticweb.owl.model.OWLSubClassAxiom;
import org.semanticweb.owl.model.change.AddClassAxiom;
import org.semanticweb.owl.model.change.AddEntity;
import org.semanticweb.owl.model.change.ChangeVisitor;
import org.semanticweb.owl.model.helper.OWLBuilder;
public class LocalityCheckerExtended {
protected SwoopModel swoopModel;
protected OWLOntology source;
protected OWLOntology imported;
// ************************************************************
//Indexes storing general information about the SOURCE ontology
//**********************************************************
protected Set local;
protected Set nlocal;
protected boolean DEBUG;
public static final String OWL_THING = "http://www.w3.org/2002/07/owl#Thing";
public LocalityCheckerExtended(OWLOntology source) {
this.source = source;
this.local = new HashSet();
this.nlocal = new HashSet();
this.DEBUG = true;
}
/******
*
* @param desc
* @param foreign
* @return TRUE if the description is non-local with respect to foreign
* and FALSE otherwise
* @throws OWLException
*/
public boolean isNonLocal(OWLDescription desc, Set foreign) throws OWLException {
if(desc instanceof OWLClass){
return false;
}
if(desc instanceof OWLObjectSomeRestriction){
return false;
}
if(desc instanceof OWLObjectValueRestriction){
return false;
}
if(desc instanceof OWLEnumeration){
return false;
}
if(desc instanceof OWLObjectAllRestriction){
if(!foreign.contains(((OWLObjectAllRestriction)desc).getProperty())){
return true;
}
else{
if(isNonLocal(((OWLObjectAllRestriction)desc).getDescription(),foreign))
return true;
else
return false;
}
}
if (desc instanceof OWLObjectCardinalityRestriction)
{
try {
if(((OWLObjectCardinalityRestriction)desc).isAtLeast())
return false;
if(((OWLObjectCardinalityRestriction)desc).isAtMost())
if(!foreign.contains(((OWLObjectCardinalityRestriction)desc).getProperty()))
return true;
else
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (desc instanceof OWLNot){
try {
if(this.isNonLocal(((OWLNot)desc).getOperand(), foreign))
return false;
if(this.isLocal(((OWLNot)desc).getOperand(), foreign))
return true;
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//All conjuncts must be non-local
if (desc instanceof OWLAnd){
Iterator iter;
try {
iter = ((OWLAnd)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription conjunct = (OWLDescription)iter.next();
if (!this.isNonLocal(conjunct, foreign))
return false;
}
return true;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
//At least one of the disjuncts must be non-local
if (desc instanceof OWLOr){
Iterator iter;
try {
iter = ((OWLOr)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription disjunct = (OWLDescription)iter.next();
if (this.isNonLocal(disjunct, foreign))
return true;
}
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
return true;
}
public boolean isLocal(OWLDescription desc, Set foreign) throws OWLException{
if (desc instanceof OWLClass){
if (foreign.contains(desc))
return false;
else
{
if(((OWLClass)desc).getURI().toString().equals(OWL_THING)){
return false;
}
else
return true;
}
}
else{
if(desc instanceof OWLObjectSomeRestriction){
if(!foreign.contains(((OWLObjectSomeRestriction)desc).getProperty())){
return true;
}
else{
if(isLocal(((OWLObjectSomeRestriction)desc).getDescription(),foreign))
return true;
else
return false;
}
}
if(desc instanceof OWLEnumeration){
Set indiv = new HashSet();
indiv = ((OWLEnumeration)desc).getIndividuals();
boolean b = true;
Iterator it = indiv.iterator();
while(it.hasNext()){
OWLIndividual in = (OWLIndividual)it.next();
if(foreign.contains(in)){
return false;
}
}
return b;
}
if(desc instanceof OWLObjectValueRestriction){
if(!foreign.contains(((OWLObjectValueRestriction)desc).getProperty())){
return true;
}
else{
if(!foreign.contains(((OWLObjectValueRestriction)desc).getIndividual()))
return true;
else
return false;
}
}
if(desc instanceof OWLObjectAllRestriction){
return false;
}
if (desc instanceof OWLObjectCardinalityRestriction)
{
try {
if(((OWLObjectCardinalityRestriction)desc).isAtMost())
return false;
if(((OWLObjectCardinalityRestriction)desc).isAtLeast() || ((OWLObjectCardinalityRestriction)desc).isExactly())
if(!foreign.contains(((OWLObjectCardinalityRestriction)desc).getProperty()))
return true;
else
return false;
else
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (desc instanceof OWLNot){
try {
if(this.isLocal(((OWLNot)desc).getOperand(), foreign))
return false;
if(this.isNonLocal(((OWLNot)desc).getOperand(), foreign))
return true;
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//At least one conjunct must be local
if (desc instanceof OWLAnd){
Iterator iter;
try {
iter = ((OWLAnd)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription conjunct = (OWLDescription)iter.next();
if (this.isLocal(conjunct, foreign))
return true;
}
return false;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
//All disjuncts must be local
if (desc instanceof OWLOr){
Iterator iter;
try {
iter = ((OWLOr)desc).getOperands().iterator();
while(iter.hasNext()){
OWLDescription disjunct = (OWLDescription)iter.next();
if (!(this.isLocal(disjunct, foreign)))
return false;
}
return true;
} catch (OWLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}
return true;
}
public Set getNonLocalAxioms(Set foreign) throws OWLException {
Set allGCIs = new HashSet();
Set nlocalAxioms = new HashSet();
allGCIs = source.getClassAxioms();
Iterator iter = allGCIs.iterator();
while (iter.hasNext()) {
OWLClassAxiom axiom = (OWLClassAxiom) iter.next();
if (axiom instanceof OWLSubClassAxiom) {
if (!(this.isLocal(((OWLSubClassAxiom)axiom).getSubClass(), foreign)) &&
!this.isNonLocal(((OWLSubClassAxiom)axiom).getSuperClass(), foreign)) {
nlocalAxioms.add(axiom);
}
}
if (axiom instanceof OWLEquivalentClassesAxiom){
int l = 0,nl = 0, neither = 0;
Set eq = ((OWLEquivalentClassesAxiom)axiom).getEquivalentClasses();
Iterator it = eq.iterator();
while(it.hasNext()){
OWLDescription d = (OWLDescription)it.next();
if(this.isLocal(d,foreign)){
l = l+1;
}
else{
if(this.isNonLocal(d,foreign)){
nl = nl+1;
}
else
neither= neither+1;
}
}
if( nl > 0 || neither > 0){
nlocalAxioms.add(axiom);
}
}
}
Iterator ite = this.source.getClasses().iterator();
while(ite.hasNext()){
OWLClass cl = (OWLClass)ite.next();
Set ec = new HashSet();
ec = cl.getEquivalentClasses(source);
Iterator iit = ec.iterator();
while(iit.hasNext()){
OWLDescription d = (OWLDescription)iit.next();
if(!this.isLocal(d,foreign)){
Set aux = new HashSet();
aux.add(d);
aux.add(cl);
OWLEquivalentClassesAxiom axiom = source.getOWLDataFactory().getOWLEquivalentClassesAxiom(aux);
nlocalAxioms.add(axiom);
}
}
Set sc = new HashSet();
sc = cl.getSuperClasses(source);
Iterator j = sc.iterator();
while(j.hasNext()){
OWLDescription d = (OWLDescription)j.next();
if(foreign.contains(cl)){
if(!this.isNonLocal(d,foreign)){
OWLSubClassAxiom axiom = source.getOWLDataFactory().getOWLSubClassAxiom(cl,d);
nlocalAxioms.add(axiom);
}
}
}
}
return nlocalAxioms;
}
public OWLOntology createNonLocalPart(Set axioms) throws Exception{
OWLOntology ontology;
OWLDataFactory df = null;
URI uri = new URI("http://www.cs.man.ac.uk/~nonLocal");
OWLBuilder builder = new OWLBuilder();
builder.createOntology(uri, uri);
ontology = builder.getOntology();
df = ontology.getOWLDataFactory();
//addAnnotations(df);
/* also add owl:Thing to the ontology */
// otherwise thing appears as an imported class in the tree?!
OWLClass thing = df.getOWLThing();
AddEntity ae = new AddEntity(ontology, thing, null);
ae.accept((ChangeVisitor) ontology);
Iterator iter = axioms.iterator();
while(iter.hasNext()){
OWLClassAxiom ax = (OWLClassAxiom)iter.next();
AddClassAxiom aax = new AddClassAxiom(ontology,ax,null);
aax.accept((ChangeVisitor) ontology);
}
//swoopModel.addOntology(ontology);
//((OntologyDisplay) SwoopHandler).swoopHandler.enableMenuOptions();
//swoopModel.setSelectedOntology(ontology);
return ontology;
}
public String renderNonLocal(OWLOntology nonLocalPart) throws OWLException{
String output;
StringWriter rdfBuffer = new StringWriter();
CorrectedRDFRenderer rdfRenderer = new CorrectedRDFRenderer();
rdfRenderer.renderOntology(nonLocalPart, rdfBuffer);
output = rdfBuffer.toString();
return output;
}
/*
public Set getForeignEntities(OWLOntology ontology) throws OWLException {
Set foreignOntologies = new HashSet();
foreignOntologies = ontology.getIncludedOntologies();
Set foreignEntities = new HashSet();
Iterator iter = foreignOntologies.iterator();
while (iter.hasNext()){
OWLOntology auxOnt = (OWLOntology)iter.next();
Set entities = new HashSet();
entities = auxOnt.getClasses();
entities.addAll(auxOnt.getObjectProperties());
entities.addAll(auxOnt.getIndividuals());
foreignEntities.addAll(entities);
}
return foreignEntities;
}
*/
public boolean isLocal(OWLOntology ont, Set foreign) throws OWLException{
if (this.getNonLocalAxioms(foreign).isEmpty())
return true;
else
return false;
}
public String renderForeignInNonLocal(OWLOntology ont, Set foreign) throws OWLException {
String result= new String();
Set entities = new HashSet();
entities = ont.getClasses();
entities.addAll(ont.getObjectProperties());
entities.addAll(ont.getIndividuals());
Iterator iter = entities.iterator();
while(iter.hasNext()){
OWLEntity ent = (OWLEntity)iter.next();
if(foreign.contains(ent)){
result = result.concat(ent.getURI().toString() + "\n");
}
}
return result;
}
public boolean isHierarchical(OWLOntology ontology) throws OWLException {
Set includedOnts = new HashSet();
includedOnts = ontology.getIncludedOntologies();
Iterator iter = includedOnts.iterator();
while(iter.hasNext()){
OWLOntology aux = (OWLOntology)iter.next();
Set auxIncluded = new HashSet();
auxIncluded = aux.getIncludedOntologies();
if (auxIncluded.contains(ontology)){
return false;
}
}
return true;
}
}