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.OWLEnumeration; import org.semanticweb.owl.model.OWLEquivalentClassesAxiom; import org.semanticweb.owl.model.OWLException; 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 LocalityChecker { protected SwoopModel swoopModel; protected OWLOntology source; protected OWLOntology imported; // ************************************************************ //Indexes storing general information about the SOURCE ontology //********************************************************** protected Set Restrictions; // All Restrictions protected Set Unions; protected Set Intersections; protected Set disjointAxioms; protected Map equivalents; protected Map subClasses, superClasses, subProperties, superProperties, instancesOf; protected Set local; protected Set nlocal; protected boolean DEBUG; public static final String OWL_THING = "http://www.w3.org/2002/07/owl#Thing"; public LocalityChecker(OWLOntology source) { this.source = source; this.local = new HashSet(); this.nlocal = new HashSet(); this.DEBUG = true; } public boolean isLocal(OWLDescription desc) throws OWLException{ if (desc instanceof OWLClass){ if(((OWLClass)desc).getURI().toString().equals(OWL_THING)){ return false; } else return true; } else{ if(desc instanceof OWLObjectSomeRestriction){ return true; } if(desc instanceof OWLObjectAllRestriction){ return false; } if (desc instanceof OWLObjectCardinalityRestriction) { try { if(((OWLObjectCardinalityRestriction)desc).isAtLeast() || ((OWLObjectCardinalityRestriction)desc).isExactly()) return true; else return false; } catch (OWLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (desc instanceof OWLNot){ try { if(this.isLocal(((OWLNot)desc).getOperand())) return false; else return true; } catch (OWLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (desc instanceof OWLEnumeration){ return true; } if (desc instanceof OWLObjectValueRestriction){ return true; } if (desc instanceof OWLAnd){ Iterator iter; try { iter = ((OWLAnd)desc).getOperands().iterator(); while(iter.hasNext()){ OWLDescription conjunct = (OWLDescription)iter.next(); if (this.isLocal(conjunct)) return true; } } catch (OWLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } if (desc instanceof OWLOr){ Iterator iter; try { iter = ((OWLOr)desc).getOperands().iterator(); while(iter.hasNext()){ OWLDescription disjunct = (OWLDescription)iter.next(); if (!(this.isLocal(disjunct))) return false; } } catch (OWLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } } return true; } public Set getNonLocalAxioms() 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())) && this.isLocal(((OWLSubClassAxiom)axiom).getSuperClass())) { nlocalAxioms.add(axiom); } } if (axiom instanceof OWLEquivalentClassesAxiom){ int l = 0,nl = 0; Set eq = ((OWLEquivalentClassesAxiom)axiom).getEquivalentClasses(); Iterator it = eq.iterator(); while(it.hasNext()){ OWLDescription d = (OWLDescription)it.next(); if(this.isLocal(d)){ l = l+1; } else{ nl= nl+1; } } if( l > 0 && nl > 0){ nlocalAxioms.add(axiom); } } } Iterator ite = this.source.getClasses().iterator(); while(ite.hasNext()){ OWLClass cl = (OWLClass)ite.next(); Set ec = cl.getEquivalentClasses(source); Iterator itera = ec.iterator(); while(itera.hasNext()){ OWLDescription d = (OWLDescription)itera.next(); if (!(this.isLocal(d))){ Set aux = new HashSet(); aux.add(d); aux.add(cl); OWLEquivalentClassesAxiom axiom = source.getOWLDataFactory().getOWLEquivalentClassesAxiom(aux); nlocalAxioms.add(axiom); } } } return nlocalAxioms; } public boolean isLocal(OWLOntology ont) throws OWLException{ if (this.getNonLocalAxioms().isEmpty()) return true; else return false; } 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; } }