//The MIT License
//
// Copyright (c) 2004 Mindswap Research Group, University of Maryland, College Park
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
package org.mindswap.swoop.renderer.entity;
import java.awt.Component;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import org.apache.commons.lang.StringEscapeUtils;
import org.mindswap.pellet.debug.owlapi.Reasoner;
import org.mindswap.pellet.debug.utils.Timer;
import org.mindswap.swoop.Swoop;
import org.mindswap.swoop.SwoopDisplayPanel;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.TermsDisplay;
import org.mindswap.swoop.debugging.RepairFrame;
import org.mindswap.swoop.popup.PopupAddAnnotation;
import org.mindswap.swoop.popup.PopupAddClass;
import org.mindswap.swoop.popup.PopupAddIndividual;
import org.mindswap.swoop.popup.PopupAddProperty;
import org.mindswap.swoop.popup.PopupAddRule;
import org.mindswap.swoop.popup.PopupAddValue;
import org.mindswap.swoop.reasoner.PelletReasoner;
import org.mindswap.swoop.reasoner.SwoopReasoner;
import org.mindswap.swoop.renderer.BaseEntityRenderer;
import org.mindswap.swoop.renderer.SwoopEditableRenderer;
import org.mindswap.swoop.renderer.SwoopEntityRenderer;
import org.mindswap.swoop.renderer.SwoopRenderingVisitor;
import org.mindswap.swoop.utils.RuleValue;
import org.mindswap.swoop.utils.RulesExpressivity;
import org.mindswap.swoop.utils.SetUtils;
import org.mindswap.swoop.utils.XPointers;
import org.mindswap.swoop.utils.change.BooleanElementChange;
import org.mindswap.swoop.utils.change.EnumElementChange;
import org.mindswap.swoop.utils.external.ExternalRuleSubmitter;
import org.mindswap.swoop.utils.owlapi.CorrectedRDFRenderer;
import org.mindswap.swoop.utils.owlapi.OWLDescriptionFinder;
import org.mindswap.swoop.utils.owlapi.OWLOntBuilder;
import org.mindswap.swoop.utils.ui.SwoopIcons;
import org.semanticweb.owl.io.RendererException;
import org.semanticweb.owl.io.vocabulary.OWLVocabularyAdapter;
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.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDataFactory;
import org.semanticweb.owl.model.OWLDataProperty;
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.OWLEnumeration;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLEquivalentPropertiesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLIndividualAxiom;
import org.semanticweb.owl.model.OWLIndividualTypeAssertion;
import org.semanticweb.owl.model.OWLNamedObject;
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.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.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.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.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.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.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.SetFunctional;
import org.semanticweb.owl.model.change.SetInverseFunctional;
import org.semanticweb.owl.model.change.SetSymmetric;
import org.semanticweb.owl.model.change.SetTransitive;
import org.semanticweb.owl.model.helper.OntologyHelper;
import org.semanticweb.owl.rules.OWLRule;
import org.semanticweb.owl.rules.OWLRuleAtom;
import org.semanticweb.owl.rules.OWLRuleClassAtom;
import org.semanticweb.owl.rules.OWLRuleDataPropertyAtom;
import org.semanticweb.owl.rules.OWLRuleObjectPropertyAtom;
/**
* @author Aditya Kalyanpur, Evren Sirin
*/
public class ConciseFormatEntityRenderer extends BaseEntityRenderer implements SwoopEditableRenderer, SwoopEntityRenderer {
List changes = null;
public Map OWLDescHash = new HashMap();
OWLEntity displayedEntity;
String[] depictions = {"http://www.mindswap.org/~glapizco/technical.owl#depiction", "http://xmlns.com/foaf/0.1/depiction"};
String HR = "</tr><tr></tr><tr bgcolor=\"#FFF68F\">";
boolean imported = false;
Map sortLevelMap;
// params used for black box sos derivation
boolean sosBlackBox = false;
int axiomLimit = 40;
// two maps for entities
HashMap usageMap = new HashMap();
HashMap axiomMap = new HashMap();
// one map for axioms
HashMap signatureMap = new HashMap();
private long parseTime = 0;
private long netTime = 0;
private int mupsCount = 0;
public ConciseFormatEntityRenderer() {
}
public String getContentType() {
return "text/html";
}
public String getName() {
return "Concise Format";
}
public SwoopRenderingVisitor createVisitor() {
return new ConciseFormatVisitor(this, swoopModel);
}
protected void renderEntity() throws OWLException {
print("<html><body style='color: black; background-color: white;'>");
print("<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
super.renderEntity();
print("</FONT>");
print("</body></html>");
}
// silly hack to remove artifact in display when show_divisions is ON
private String postProcess(String rendStr) {
if (swoopModel.getShowDivisions()) {
String remove = "<tr bgcolor=\"#FFF68F\">";
if (rendStr.lastIndexOf(remove)>rendStr.lastIndexOf("<b>")) {
rendStr = rendStr.substring(0, rendStr.lastIndexOf(remove));
}
}
return rendStr;
}
/* Well dodgy coding */
protected void renderAnnotationContent(Object o) throws OWLException {
if (o instanceof URI) {
print(escape(o));
} else if (o instanceof OWLIndividual) {
print(escape(((OWLIndividual) o).getURI()));
} else {
String content = o.toString();
if (o instanceof OWLDataValue) {
OWLDataValue dv = (OWLDataValue) o;
/* Only show it if it's not string */
URI dvdt = dv.getURI();
String dvlang = dv.getLang();
if (dvdt != null) {
print("(Datatype " + escape(dvdt) + ") ");
} else {
if (dvlang != null && !dvlang.equals("")) {
print("(" + escape(dvlang) + ") ");
}
}
content = dv.getValue().toString();
}
// print(escape(dv.getValue()));
// } else {
// This is such a hack - Ron
// if (content.indexOf("html")>=0 && content.indexOf("body")>=0) {
// content = content.replaceAll("<", "<");
// content = content.replaceAll(">", ">");
// content = content.replaceAll("&", "&");
//
// // remove <html><body> outer tags because it's being rendered inside a new html doc anyway
//
// int spos = content.indexOf("<body>")+6;
// int epos = content.indexOf("</body>");
// content = content.substring(spos, epos);
// if (content.trim().indexOf("<p")>=0) {
// content = content.substring(content.indexOf(">")+1, content.length());
// }
// content += " (**Stripped HTML tags**)";
// }
// // System.out.println(content);
print(" : "+escape(content));
}
}
/**
* Return an ontology change which deletes OWL Annotation Instances
* @param subj - subject of the annotation
* @param prop - OWL Annotation property used
* @param content - content of the annotation
* @return
*/
private OntologyChange isDeleted(OWLObject subj, OWLAnnotationProperty prop, Object content) {
OntologyChange deleted = null;
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if(oc instanceof RemoveAnnotationInstance) {
RemoveAnnotationInstance change = (RemoveAnnotationInstance) oc;
if (change.getSubject().equals(subj) && change.getProperty().equals(prop) && change.getContent().equals(content))
deleted = oc;
}
}
return deleted;
}
protected boolean renderAnnotations(OWLObject obj) throws OWLException {
boolean printed = false;
if (!obj.getAnnotations(reasoner.getOntology()).isEmpty()) {
printed = true;
println();
String annTitle = " <b>Annotations</b>:";
if (editorEnabled) annTitle += addTitle("A-ANN");
println(annTitle);
for (Iterator it = obj.getAnnotations(reasoner.getOntology()).iterator(); it.hasNext();) {
OWLAnnotationInstance oai = (OWLAnnotationInstance) it.next();
if (editorEnabled) {
OntologyChange deleted = isDeleted(obj, oai.getProperty(), oai.getContent());
if (deleted!=null) {
print("<font color=\"red\"><strike>");
print(" " + escape(shortForm(oai.getProperty().getURI())) + " ");
renderAnnotationContent(oai.getContent());
print("</strike></font>");
addUndo(deleted, "Delete", annTitle);
}
else {
print(" " + escape(shortForm(oai.getProperty().getURI())) + " ");
renderAnnotationContent(oai.getContent());
addDelete(oai, "A-ANN");
}
}
else {
print(" " + escape(shortForm(oai.getProperty().getURI())) + " ");
renderAnnotationContent(oai.getContent());
}
println();
/* Do we need to do this??? */
visitor.reset();
oai.accept(visitor);
// if (it.hasNext()) {
// println();
// }
}
}
// print temporarily added changes
if (editorEnabled) {
Set added = this.getAddedAnnotations(obj);
if (added.size()>0) {
// print title if not printed already
String annTitle = " <b>Annotations</b>:";
annTitle += addTitle("A-ANN");
if (!printed) {
println(annTitle);
printed = true;
}
// print added changes in green (and add undo links)
for (Iterator iter = added.iterator(); iter.hasNext(); ) {
AddAnnotationInstance change = (AddAnnotationInstance) iter.next();
print("<font color=\"green\">");
print(" " + escape(shortForm(change.getProperty().getURI())) + " ");
renderAnnotationContent(change.getContent());
print("</font>");
this.addUndo(change, "Add", annTitle);
println();
}
}
}
return printed;
}
private boolean isExplicit(OWLObject subj, String code, OWLObject obj) throws OWLException {
return this.isExplicit(subj, code, obj, null);
}
/**
* Given a subject (OWL entity) and an object (OWL entity) and a type of relation
* checks if the relation is explicitly defined in the ontology or not
* If not, it is either inferred by the reasoner or imported and hence is
* displayed in italics
* @param subj - subject of the relationship
* @param code - type of relationship
* @param obj - object of the relationship
* @param value - value only specified for ind-prop-value assertions
* @return
* @throws OWLException
*/
private boolean isExplicit(OWLObject subj, String code, OWLObject obj, Object value) throws OWLException {
OWLOntology ontology = reasoner.getOntology();
OWLDataFactory factory = ontology.getOWLDataFactory();
if (code.equals("C-INT")) {
if (subj instanceof OWLClass) {
OWLClass cla = (OWLClass) subj;
Iterator iter = cla.getEquivalentClasses(ontology).iterator();
while (iter.hasNext()) {
Object equ = iter.next();
if (equ instanceof OWLAnd) {
OWLAnd inter = (OWLAnd) equ;
if (inter.getOperands().contains(obj)) return true;
}
}
return false;
}
}
else if (code.equals("C-UNI")) {
if (subj instanceof OWLClass) {
OWLClass cla = (OWLClass) subj;
Iterator iter = cla.getEquivalentClasses(ontology).iterator();
while (iter.hasNext()) {
Object equ = iter.next();
if (equ instanceof OWLOr) {
OWLOr union = (OWLOr) equ;
if (union.getOperands().contains(obj)) return true;
}
}
return false;
}
}
else if (code.equals("I-ONE")) {
if (subj instanceof OWLClass && obj instanceof OWLIndividual) {
OWLClass cla = (OWLClass) subj;
Iterator iter = cla.getEnumerations(ontology).iterator();
while (iter.hasNext()) {
OWLEnumeration enumer = (OWLEnumeration) iter.next();
for (Iterator iter2 = enumer.getIndividuals().iterator(); iter2.hasNext(); ) {
OWLIndividual ind = (OWLIndividual) iter2.next();
if (ind.equals(obj)) return true;
}
}
}
return false;
}
else if (code.equals("C-DIS")) {
Iterator iter = ontology.getClassAxioms().iterator();
while (iter.hasNext()) {
OWLClassAxiom axiom = (OWLClassAxiom) iter.next();
if (axiom instanceof OWLDisjointClassesAxiom) {
OWLDisjointClassesAxiom disjAxiom = (OWLDisjointClassesAxiom) axiom;
if (disjAxiom.getDisjointClasses().contains(subj) && disjAxiom.getDisjointClasses().contains(obj)) return true;
}
}
return false;
}
else if(code.equals("C-SUB")) {
boolean asserted = false;
if(subj instanceof OWLClass)
asserted = ((OWLClass) subj).getSuperClasses(ontology).contains(obj);
OWLSubClassAxiom subClassAxiom = factory.getOWLSubClassAxiom((OWLDescription)subj, (OWLDescription)obj);
if (!asserted) asserted = (ontology.getClassAxioms().contains(subClassAxiom));
return asserted;
}
else if(code.equals("C-SUP")) {
boolean asserted = false;
if(obj instanceof OWLClass)
asserted = ((OWLClass) obj).getSuperClasses(ontology).contains(subj);
OWLSubClassAxiom subClassAxiom = factory.getOWLSubClassAxiom((OWLDescription)obj, (OWLDescription)subj);
if (!asserted) asserted = (ontology.getClassAxioms().contains(subClassAxiom));
return asserted;
}
else if(code.equals("C-EQU")) {
if(subj instanceof OWLClass)
return ((OWLClass) subj).getEquivalentClasses(reasoner.getOntologies()).contains(obj);
if(obj instanceof OWLClass)
return ((OWLClass) obj).getEquivalentClasses(reasoner.getOntologies()).contains(subj);
else {
Set set = new HashSet();
set.add(subj);
set.add(obj);
OWLEquivalentClassesAxiom eqClassAxiom = factory.getOWLEquivalentClassesAxiom(set);
return (ontology.getClassAxioms().contains(eqClassAxiom));
}
}
else if(code.equals("C-NOT")) {
if(subj instanceof OWLClass)
return OWLDescriptionFinder.getComplements((OWLClass) subj, reasoner.getOntologies()).contains(obj);
if(obj instanceof OWLClass)
return OWLDescriptionFinder.getComplements((OWLClass) obj, reasoner.getOntologies()).contains(subj);
}
else if(code.equals("P-DOM")) {
if((subj instanceof OWLClass) && (obj instanceof OWLProperty)) {
OWLClass cla = (OWLClass) subj;
OWLProperty prop = (OWLProperty) obj;
return (prop.getDomains(ontology).contains(cla));
//return (getPropertiesWithDomain(cla, false).contains(prop));
}
}
else if(code.equals("P-INV")) {
if((subj instanceof OWLProperty) && (obj instanceof OWLProperty)) {
OWLProperty p1 = (OWLProperty) subj;
OWLProperty p2 = (OWLProperty) obj;
return (((OWLObjectProperty) p1).getInverses(ontology).contains(p2));
//return (getPropertiesWithDomain(cla, false).contains(prop));
}
}
else if(code.equals("C-HASDOM")) {
if((obj instanceof OWLClass) && (subj instanceof OWLProperty)) {
OWLClass cla = (OWLClass) obj;
OWLProperty prop = (OWLProperty) subj;
return (prop.getDomains(ontology).contains(cla));
}
}
else if(code.equals("P-RAN")) {
if((subj instanceof OWLClass) && (obj instanceof OWLProperty)) {
OWLClass cla = (OWLClass) subj;
OWLProperty prop = (OWLProperty) obj;
return (prop.getRanges(ontology).contains(cla));
//return (getPropertiesWithRange(cla, false).contains(prop));
}
}
else if(code.equals("C-HASRAN")) {
if((obj instanceof OWLClass) && (subj instanceof OWLProperty)) {
OWLClass cla = (OWLClass) obj;
OWLProperty prop = (OWLProperty) subj;
return (prop.getRanges(ontology).contains(cla));
}
}
else if(code.equals("C-TYP")) {
OWLIndividual ind = (OWLIndividual) subj;
OWLDescription desc = (OWLDescription) obj;
if(desc instanceof OWLClass)
return ind.getTypes(ontology).contains(desc);
else
return true;
}
else if(code.equals("I-INS")) {
OWLIndividual ind = (OWLIndividual) obj;
OWLClass c = (OWLClass) subj;
return ind.getTypes(ontology).contains(c);
}
else if(code.equals("I-SAM")) {
// get individual axioms for the ontology
for (Iterator iter = ontology.getIndividualAxioms().iterator(); iter.hasNext(); ){
OWLIndividualAxiom indAxiom = (OWLIndividualAxiom) iter.next();
// get the set of individuals participating in each axiom
Set inds = indAxiom.getIndividuals();
if(!(indAxiom instanceof OWLSameIndividualsAxiom))
continue;
if(inds.contains(subj) && inds.contains(obj))
return true;
}
return false;
}
else if(code.equals("I-DIF")) {
// get individual axioms for the ontology
for (Iterator iter = ontology.getIndividualAxioms().iterator(); iter.hasNext(); ){
OWLIndividualAxiom indAxiom = (OWLIndividualAxiom) iter.next();
// get the set of individuals participating in each axiom
Set inds = indAxiom.getIndividuals();
if(!(indAxiom instanceof OWLDifferentIndividualsAxiom))
continue;
if(inds.contains(subj) && inds.contains(obj))
return true;
}
return false;
}
else if(code.equals("P-INSD")) {
OWLIndividual ind = (OWLIndividual) subj;
OWLDataProperty prop = (OWLDataProperty) obj;
Set allValues = (Set) ind.getDataPropertyValues(ontology).get( prop );
OWLDataValue val = (OWLDataValue) value;
// Evren: if the values are defined in another ontology then allValues will be null
if( allValues != null ) {
for (Iterator iter = allValues.iterator(); iter.hasNext();) {
OWLDataValue v = (OWLDataValue) iter.next();
if(v.equals(val))
return true;
}
}
return false;
}
else if(code.equals("P-INSO")) {
OWLIndividual ind = (OWLIndividual) subj;
OWLObjectProperty prop = (OWLObjectProperty) obj;
OWLIndividual val = (OWLIndividual) value;
Set allValues = (Set) ind.getObjectPropertyValues(ontology).get( prop );
return (allValues != null) && allValues.contains( val );
}
return true;
}
/**
* Check if a property attribute removal change is currently in the
* swoopModel.unCommittedChanges and return the change if found
* @param prop - property on which attribute is to be changed
* @param code - code for the attribute (functional, inversefunctional..)
* @return
*/
private OntologyChange isDeleted(OWLProperty prop, String code) {
// isDeleted function for property-attribues
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if (oc instanceof SetFunctional && code.equals("P-FUN")) {
SetFunctional change = (SetFunctional) oc;
if (change.getProperty().equals(prop) && !change.isFunctional()) return oc;
}
if (oc instanceof SetInverseFunctional && code.equals("P-IFUN")) {
SetInverseFunctional change = (SetInverseFunctional) oc;
if (change.getProperty().equals(prop) && !change.isInverseFunctional()) return oc;
}
if (oc instanceof SetTransitive && code.equals("P-TRA")) {
SetTransitive change = (SetTransitive) oc;
if (change.getProperty().equals(prop) && !change.isTransitive()) return oc;
}
if (oc instanceof SetSymmetric && code.equals("P-SYM")) {
SetSymmetric change = (SetSymmetric) oc;
if (change.getProperty().equals(prop) && !change.isSymmetric()) return oc;
}
}
return null;
}
/**
* Function to check instance' property-value axioms that are deleted
* If an ontology change is returned, corresponding axiom is striked out in the HTML renderer
* @param prop
* @param value
* @return
*/
private OntologyChange isDeleted(OWLProperty prop, OWLObject value) {
// isDeleted function for instance' property-value pairs only
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if (oc instanceof RemoveDataPropertyInstance && prop instanceof OWLDataProperty) {
RemoveDataPropertyInstance rem = (RemoveDataPropertyInstance) oc;
if (rem.getSubject().equals((OWLIndividual) displayedEntity)
&& rem.getProperty().equals((OWLDataProperty) prop)
&& rem.getObject().equals((OWLDataValue) value))
return oc;
}
if (oc instanceof RemoveObjectPropertyInstance && prop instanceof OWLObjectProperty) {
RemoveObjectPropertyInstance rem = (RemoveObjectPropertyInstance) oc;
if (rem.getSubject().equals((OWLIndividual) displayedEntity)
&& rem.getProperty().equals((OWLObjectProperty) prop)
&& rem.getObject().equals((OWLIndividual) value))
return oc;
}
}
return null;
}
/**
* Given a subject (OWL entity) and an object (OWL entity) and a relationship code,
* check if the relationship axiom is deleted by the user or not
* If an ontology change is returned, corresponding axiom is striked out in the HTML renderer
* @param subj - subject of the relationship axiom
* @param code - relation type code
* @param obj - object of the relationship axiom
* @return
* @throws OWLException
*/
private OntologyChange isDeleted(OWLObject subj, String code, OWLObject obj) throws OWLException {
OntologyChange deleted = null;
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if(oc instanceof RemoveDomain) {
RemoveDomain rem = (RemoveDomain) oc;
if ((code.equals("C-HASDOM")) && (rem.getProperty().equals((OWLProperty) subj)) && (rem.getDomain().equals((OWLDescription) obj))) {
deleted = oc;
}
if ((code.equals("P-DOM")) && (rem.getProperty().equals((OWLProperty) obj)) && (rem.getDomain().equals((OWLDescription) subj))) {
deleted = oc;
}
}
else if(oc instanceof RemoveInverse) {
RemoveInverse rem = (RemoveInverse) oc;
if ((code.equals("P-INV")) && (rem.getProperty().equals((OWLObjectProperty) subj)) && (rem.getInverse().equals((OWLObjectProperty) obj))) {
deleted = oc;
}
// also inverse is deleted
if ((code.equals("P-INV")) && (rem.getProperty().equals((OWLObjectProperty) obj)) && (rem.getInverse().equals((OWLObjectProperty) subj))) {
deleted = oc;
}
}
else if(oc instanceof RemoveObjectPropertyRange) {
RemoveObjectPropertyRange rem = (RemoveObjectPropertyRange) oc;
if (subj instanceof OWLObjectProperty) {
if ((code.equals("C-HASRAN")) && (rem.getProperty().equals((OWLObjectProperty) subj)) && (rem.getRange().equals((OWLDescription) obj))) {
deleted = oc;
}
}
if (obj instanceof OWLObjectProperty) {
if ((code.equals("P-RAN")) && (rem.getProperty().equals((OWLObjectProperty) obj)) && (rem.getRange().equals((OWLDescription) subj))) {
deleted = oc;
}
}
}
else if(oc instanceof RemoveDataPropertyRange) {
if (subj instanceof OWLDataProperty && obj instanceof OWLDataRange) {
RemoveDataPropertyRange rem = (RemoveDataPropertyRange) oc;
if ((code.equals("C-HASRAN")) && (rem.getProperty().equals((OWLDataProperty) subj)) && (rem.getRange().equals((OWLDataRange) obj))) {
deleted = oc;
}
}
}
else if(oc instanceof RemovePropertyAxiom) {
RemovePropertyAxiom rem = (RemovePropertyAxiom) oc;
if (rem.getAxiom() instanceof OWLEquivalentPropertiesAxiom) {
OWLEquivalentPropertiesAxiom epAxiom = (OWLEquivalentPropertiesAxiom) rem.getAxiom();
if (code.equals("P-EQU")
&& epAxiom.getProperties().contains((OWLProperty) obj)
&& epAxiom.getProperties().contains((OWLProperty) subj)) {
deleted = oc;
}
}
else if (rem.getAxiom() instanceof OWLSubPropertyAxiom) {
OWLSubPropertyAxiom subPAxiom = (OWLSubPropertyAxiom) rem.getAxiom();
if (code.equals("P-SUB")
&& subPAxiom.getSubProperty().equals((OWLProperty) subj)
&& subPAxiom.getSuperProperty().equals((OWLProperty) obj)) {
deleted = oc;
}
else if (code.equals("P-SUP")
&& subPAxiom.getSubProperty().equals((OWLProperty) obj)
&& subPAxiom.getSuperProperty().equals((OWLProperty) subj)) {
deleted = oc;
}
}
}
else if(oc instanceof RemoveSuperProperty) {
RemoveSuperProperty rem = (RemoveSuperProperty) oc;
if (code.equals("P-SUB")
&& rem.getProperty().equals((OWLProperty) subj)
&& rem.getSuperProperty().equals((OWLProperty) obj)) {
deleted = oc;
}
else if (code.equals("P-SUP")
&& rem.getProperty().equals((OWLProperty) obj)
&& rem.getSuperProperty().equals((OWLProperty) subj)) {
deleted = oc;
}
}
else if(oc instanceof RemoveClassAxiom) {
RemoveClassAxiom rem = (RemoveClassAxiom) oc;
if (rem.getAxiom() instanceof OWLDisjointClassesAxiom) {
OWLDisjointClassesAxiom change = (OWLDisjointClassesAxiom) rem.getAxiom();
if ((code.equals("C-DIS")) && (change.getDisjointClasses().contains(subj)) && (change.getDisjointClasses().contains(obj))) {
return oc;
}
}
else if (rem.getAxiom() instanceof OWLSubClassAxiom) {
OWLSubClassAxiom axiom = (OWLSubClassAxiom) rem.getAxiom();
if(code.equals("C-SUB")
&& axiom.getSubClass().equals(subj)
&& axiom.getSuperClass().equals(obj))
return oc;
else
if(code.equals("C-SUP")
&& axiom.getSubClass().equals(obj)
&& axiom.getSuperClass().equals(subj))
return oc;
}
}
else if(oc instanceof RemoveSuperClass) {
RemoveSuperClass change = (RemoveSuperClass) oc;
if(code.equals("C-SUB")
&& change.getOWLClass().equals(subj)
&& change.getDescription().equals(obj))
return oc;
else
if(code.equals("C-SUP")
&& change.getOWLClass().equals(obj)
&& change.getDescription().equals(subj))
return oc;
}
else
if(oc instanceof RemoveEquivalentClass) {
RemoveEquivalentClass change = (RemoveEquivalentClass) oc;
if(code.equals("C-EQU")
&& change.getOWLClass().equals(subj)
&& change.getDescription().equals(obj))
return oc;
}
else
if(oc instanceof BooleanElementChange) {
BooleanElementChange change = (BooleanElementChange) oc;
if(code.equals("C-INT")
&& change.getChangeType().equals("Remove")
&& change.getOWLClass().equals(subj)
&& change.getType().equals(OWLAnd.class)
&& change.getOWLDescription().hashCode()==obj.hashCode())
deleted = oc;
else
if(code.equals("C-UNI")
&& change.getChangeType().equals("Remove")
&& change.getOWLClass().equals(subj)
&& change.getType().equals(OWLOr.class)
&& change.getOWLDescription().hashCode()==obj.hashCode())
deleted = oc;
else
if(code.equals("C-NOT")
&& change.getChangeType().equals("Remove")
&& change.getOWLClass().equals(subj)
&& change.getType().equals(OWLNot.class)
&& change.getOWLDescription().hashCode()==obj.hashCode())
deleted = oc;
}
else
if(oc instanceof AddEquivalentClass) {
AddEquivalentClass change = (AddEquivalentClass) oc;
if(code.equals("C-INT")
&& change.getOWLClass().equals(subj)
&& change.getDescription() instanceof OWLAnd
&& ((OWLAnd)change.getDescription()).getOperands().contains(obj))
deleted = null;
else
if(code.equals("C-UNI")
&& change.getOWLClass().equals(subj)
&& change.getDescription() instanceof OWLOr
&& ((OWLOr)change.getDescription()).getOperands().contains(obj))
deleted = null;
}
else
if (oc instanceof EnumElementChange) {
EnumElementChange change = (EnumElementChange) oc;
if (code.equals("I-ONE")
&& change.getChangeType().equals("Remove")
&& change.getOWLClass().equals(subj)
&& change.getOWLIndividual().hashCode()==obj.hashCode())
deleted = oc;
}
else
if (oc instanceof RemoveIndividualClass) {
RemoveIndividualClass change = (RemoveIndividualClass) oc;
if (code.equals("I-INS")
&& change.getDescription().equals(subj)
&& change.getIndividual().equals(obj))
deleted = oc;
else
if (code.equals("C-TYP")
&& change.getDescription().equals(obj)
&& change.getIndividual().equals(subj))
deleted = oc;
}
else
if (oc instanceof AddEnumeration) {
AddEnumeration change = (AddEnumeration) oc;
if (code.equals("I-ONE")
&& change.getOWLClass().equals(subj)
&& change.getEnumeration().getIndividuals().contains(obj))
deleted = null;
}
else if(oc instanceof RemoveIndividualAxiom) {
RemoveIndividualAxiom rem = (RemoveIndividualAxiom) oc;
if (rem.getAxiom() instanceof OWLSameIndividualsAxiom) {
OWLSameIndividualsAxiom sameAxiom = (OWLSameIndividualsAxiom) rem.getAxiom();
if (code.equals("I-SAM")
&& sameAxiom.getIndividuals().contains((OWLIndividual) obj)
&& sameAxiom.getIndividuals().contains((OWLIndividual) subj)) {
deleted = oc;
}
}
if (rem.getAxiom() instanceof OWLDifferentIndividualsAxiom) {
OWLDifferentIndividualsAxiom diffAxiom = (OWLDifferentIndividualsAxiom) rem.getAxiom();
if (code.equals("I-DIF")
&& diffAxiom.getIndividuals().contains((OWLIndividual) obj)
&& diffAxiom.getIndividuals().contains((OWLIndividual) subj)) {
deleted = oc;
}
}
}
}
return deleted;
}
/**
* Same as getAdded(subj, code) except this one only checks
* AddAnnotationInstance changes
* @param subj
* @return
* @throws OWLException
*/
private Set getAddedAnnotations(OWLObject subj) throws OWLException {
Set added = new HashSet();
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if (oc instanceof AddAnnotationInstance) {
AddAnnotationInstance change = (AddAnnotationInstance) oc;
if (change.getSubject().equals(subj)) added.add(oc);
}
}
return added;
}
/**
* Given a subject (OWL entity) and a code for the axiom type,
* match any current uncommitted ontology change involving subject and of type code
* and return a map between object of the change and the change itself
* Stuff returned is rendered in 'green' in the HTML renderer
* @param subj - subject of the axiom change
* @param code - type of axiom change
* @return
* @throws OWLException
*/
private Map getAdded(OWLObject subj, String code) throws OWLException {
Map added = new Hashtable();
Iterator i = changes.iterator();
while(i.hasNext()) {
OntologyChange oc = (OntologyChange) i.next();
if (oc instanceof SetFunctional) {
SetFunctional change = (SetFunctional) oc;
if (code.equals("ATTRIB")) {
if (change.isFunctional() && change.getProperty().equals(subj)) {
// only for property attributes, add a set of ontology changes as the value in the hashmap
Set ocSet = new HashSet();
if (added.containsKey(subj)) ocSet = (HashSet) added.get(subj);
ocSet.add(oc);
added.put(subj, ocSet);
}
}
}
else
if (oc instanceof SetInverseFunctional) {
SetInverseFunctional change = (SetInverseFunctional) oc;
if (code.equals("ATTRIB")) {
if (change.isInverseFunctional() && change.getProperty().equals(subj)) {
// only for property attributes, add a set of ontology changes as the value in the hashmap
Set ocSet = new HashSet();
if (added.containsKey(subj)) ocSet = (HashSet) added.get(subj);
ocSet.add(oc);
added.put(subj, ocSet);
}
}
}
else
if (oc instanceof SetTransitive) {
SetTransitive change = (SetTransitive) oc;
if (code.equals("ATTRIB")) {
if (change.isTransitive() && change.getProperty().equals(subj)) {
// only for property attributes, add a set of ontology changes as the value in the hashmap
Set ocSet = new HashSet();
if (added.containsKey(subj)) ocSet = (HashSet) added.get(subj);
ocSet.add(oc);
added.put(subj, ocSet);
}
}
}
else
if (oc instanceof SetSymmetric) {
SetSymmetric change = (SetSymmetric) oc;
if (code.equals("ATTRIB")) {
if (change.isSymmetric() && change.getProperty().equals(subj)) {
// only for property attributes, add a set of ontology changes as the value in the hashmap
Set ocSet = new HashSet();
if (added.containsKey(subj)) ocSet = (HashSet) added.get(subj);
ocSet.add(oc);
added.put(subj, ocSet);
}
}
}
else
if(oc instanceof AddSuperClass) {
AddSuperClass change = (AddSuperClass) oc;
if(code.equals("C-SUB")
&& change.getOWLClass().equals(subj))
added.put(change.getDescription(), oc);
else
if(code.equals("C-SUP")
&& change.getDescription().equals(subj))
added.put(change.getOWLClass(), oc);
}
else if(oc instanceof RemoveSuperClass) {
RemoveSuperClass change = (RemoveSuperClass) oc;
if(code.equals("C-SUB")
&& change.getOWLClass().equals(subj))
added.remove(change.getDescription());
else
if(code.equals("C-SUP")
&& change.getDescription().equals(subj))
added.remove(change.getOWLClass());
}
else
if(oc instanceof AddEquivalentClass) {
AddEquivalentClass change = (AddEquivalentClass) oc;
if(code.equals("C-EQU")
&& change.getOWLClass().equals(subj))
added.put(change.getDescription(), oc);
}
else
if(oc instanceof BooleanElementChange) {
BooleanElementChange change = (BooleanElementChange) oc;
if(code.equals("C-INT")
&& change.getChangeType().equals("Add")
&& change.getType().equals(OWLAnd.class)
&& change.getOWLClass().equals(subj)) {
added.put(change.getOWLDescription(), oc);
}
else
if(code.equals("C-UNI")
&& change.getChangeType().equals("Add")
&& change.getType().equals(OWLOr.class)
&& change.getOWLClass().equals(subj)) {
added.put(change.getOWLDescription(), oc);
}
else
if(code.equals("C-NOT")
&& change.getChangeType().equals("Add")
&& change.getType().equals(OWLNot.class)
&& change.getOWLClass().equals(subj)) {
added.put(change.getOWLDescription(), oc);
}
}
else
if(oc instanceof RemoveEquivalentClass) {
RemoveEquivalentClass change = (RemoveEquivalentClass) oc;
if(code.equals("C-EQU")
&& change.getOWLClass().equals(subj)
&& !(change.getDescription() instanceof OWLAnd)
&& !(change.getDescription() instanceof OWLOr)
&& !(change.getDescription() instanceof OWLEnumeration))
added.remove(change.getDescription());
else if(code.equals("C-INT")
&& change.getOWLClass().equals(subj)
&& change.getDescription() instanceof OWLAnd)
added.keySet().removeAll(((OWLAnd)change.getDescription()).getOperands());
else
if(code.equals("C-UNI")
&& change.getOWLClass().equals(subj)
&& change.getDescription() instanceof OWLOr)
added.keySet().removeAll(((OWLOr)change.getDescription()).getOperands());
}
else
if (oc instanceof AddClassAxiom) {
if (code.equals("C-DIS")) {
AddClassAxiom change = (AddClassAxiom) oc;
if (change.getAxiom() instanceof OWLDisjointClassesAxiom) {
OWLDisjointClassesAxiom disAxiom = (OWLDisjointClassesAxiom) change.getAxiom();
if (disAxiom.getDisjointClasses().contains(subj)) {
Iterator j = disAxiom.getDisjointClasses().iterator();
while(j.hasNext())
added.put(j.next(), oc);
added.remove(subj);
}
}
}
else if (code.equals("C-SUP")) {
AddClassAxiom change = (AddClassAxiom) oc;
if (change.getAxiom() instanceof OWLSubClassAxiom) {
OWLSubClassAxiom subAxiom = (OWLSubClassAxiom) change.getAxiom();
if (subAxiom.getSuperClass().equals(subj)) {
added.put(subAxiom.getSubClass(), oc);
}
}
}
}
else
if(oc instanceof AddDomain) {
AddDomain change = (AddDomain) oc;
if(code.equals("P-DOM")
&& change.getDomain().equals(subj)
) {
added.put(change.getProperty(), oc);
}
if(code.equals("C-HASDOM")
&& change.getProperty().equals(subj)
) {
added.put(change.getDomain(), oc);
}
}
else
if (oc instanceof AddObjectPropertyRange) {
AddObjectPropertyRange change = (AddObjectPropertyRange) oc;
if(code.equals("P-RAN")
&& change.getRange().equals(subj)
) {
added.put(change.getProperty(), oc);
}
if(code.equals("C-HASRAN")
&& change.getProperty().equals(subj)
) {
added.put(change.getRange(), oc);
}
}
else
if (oc instanceof AddInverse){
AddInverse change = (AddInverse) oc;
if(code.equals("P-INV")
&& change.getProperty().equals(subj)) {
added.put(change.getInverse(), oc);
}
// also inverse gets added
if(code.equals("P-INV")
&& change.getInverse().equals(subj)) {
added.put(change.getProperty(), oc);
}
}
else
if (oc instanceof AddDataPropertyRange) {
AddDataPropertyRange change = (AddDataPropertyRange) oc;
if(code.equals("P-RAN")
&& change.getRange().equals(subj)
) {
added.put(change.getProperty(), oc);
}
if(code.equals("C-HASRAN")
&& change.getProperty().equals(subj)
) {
added.put(change.getRange(), oc);
}
}
else
if (oc instanceof AddPropertyAxiom) {
AddPropertyAxiom change = (AddPropertyAxiom) oc;
if (change.getAxiom() instanceof OWLEquivalentPropertiesAxiom && code.equals("P-EQU")) {
OWLEquivalentPropertiesAxiom propAxiom = (OWLEquivalentPropertiesAxiom) change.getAxiom();
if (code.equals("P-EQU") && propAxiom.getProperties().contains(subj)) {
Set equSet = new HashSet(propAxiom.getProperties());
equSet.remove(subj);
Iterator iter = equSet.iterator();
while (iter.hasNext()) {
added.put(iter.next(), oc);
}
}
}
}
if (oc instanceof AddSuperProperty) {
AddSuperProperty change = (AddSuperProperty) oc;
if ((code.equals("P-SUB")) && (change.getProperty().equals(subj))) {
added.put(change.getSuperProperty(), oc);
}
if ((code.equals("P-SUP")) && (change.getSuperProperty().equals(subj))) {
added.put(change.getProperty(), oc);
}
}
else
if (oc instanceof AddIndividualClass) {
AddIndividualClass change = (AddIndividualClass) oc;
OWLIndividual ind = change.getIndividual();
OWLDescription desc = change.getDescription();
if (code.equals("I-INS") && desc.equals(subj)) {
added.put(change.getIndividual(), oc);
}
else
if (code.equals("C-TYP") && ind.equals(subj)) {
added.put(change.getDescription(), oc);
}
}
else
if (oc instanceof EnumElementChange) {
EnumElementChange change = (EnumElementChange) oc;
if ((code.equals("I-ONE")) && (change.getChangeType().equals("Add")) && (change.getOWLClass().equals(subj))) {
added.put(change.getOWLIndividual(), oc);
}
}
else
if (oc instanceof RemoveEnumeration) {
RemoveEnumeration change = (RemoveEnumeration) oc;
if ((code.equals("I-ONE")) && (change.getOWLClass().equals(subj))) {
OWLEnumeration enumElem = change.getEnumeration();
added.keySet().removeAll(enumElem.getIndividuals());
}
}
else
if (oc instanceof AddIndividualAxiom) {
AddIndividualAxiom change = (AddIndividualAxiom) oc;
if (code.equals("I-SAM")) {
if (change.getAxiom() instanceof OWLSameIndividualsAxiom) {
OWLSameIndividualsAxiom sameAxiom = (OWLSameIndividualsAxiom) change.getAxiom();
if (sameAxiom.getIndividuals().contains(subj)) {
Iterator j = sameAxiom.getIndividuals().iterator();
while(j.hasNext())
added.put(j.next(), oc);
added.remove(subj);
}
}
}
if (code.equals("I-DIF")) {
if (change.getAxiom() instanceof OWLDifferentIndividualsAxiom) {
OWLDifferentIndividualsAxiom diffAxiom = (OWLDifferentIndividualsAxiom) change.getAxiom();
if (diffAxiom.getIndividuals().contains(subj)) {
Iterator j = diffAxiom.getIndividuals().iterator();
while(j.hasNext())
added.put(j.next(), oc);
added.remove(subj);
}
}
}
}
}
return added;
}
private void printConciseObject(OWLEntity obj) {
try {
if (obj==null) return;
String objURI = obj.getURI().toString();
String objName = shortForm(obj.getURI());
// String imageURI = baseImageURI; // JAVA WEBSTART STUFF
boolean showIcon = swoopModel.getShowIcons();
if (obj instanceof OWLClass && swoopModel.getEnableDebugging()) showIcon = true;
if (showIcon || swoopModel.getEnableDebugging()) {
String imageURI = "http://www.mindswap.org/2004/SWOOP/icons/"; // JAVA WEBSTART STUFF
if (obj instanceof OWLClass) {
boolean isConsistent = reasoner.isConsistent((OWLClass) obj);
if (isConsistent) imageURI += "InconsistentClass.gif";
else imageURI += "Class.gif";
}
//*************************************************
//changed for Econns
//*************************************************
else if (obj instanceof OWLObjectProperty){
if(((OWLObjectProperty)obj).isLink()) {
imageURI += "LinkProperty.GIF";
}
else{
imageURI += "Property.gif";
}
}
else if (obj instanceof OWLDataProperty) imageURI += "DataProperty.gif";
else if (obj instanceof OWLIndividual) imageURI += "Instance.gif";
if (imageURI.endsWith(".gif") || imageURI.endsWith(".GIF") ) print("<img src=\""+imageURI+"\">");
}
print("<a href=\""+StringEscapeUtils.escapeHtml(objURI)+"\">"+StringEscapeUtils.escapeHtml(objName)+"</a>");
}
catch (Exception e) {
e.printStackTrace();
}
}
private void printLine(OWLObject obj, String title) throws OWLException {
String code = getCode(title);
boolean explicit = isExplicit(displayedEntity, code, obj);
OntologyChange oc = editorEnabled ? isDeleted(displayedEntity, code, obj) : null;
boolean deleted = (oc != null);
if(deleted) print("<font color=\"red\"><strike>");
else if(!explicit) print("<i>");
printObject(obj);
if (editorEnabled && !deleted && explicit) {
// add delete hyperlink in editable mode
// store object hash
addDelete(obj, title);
}
if(!explicit) {
print("</i>");
if (reasoner.supportsExplanation()) addWhy(obj, title);
}
else if(deleted) {
print("</strike></font>");
addUndo(oc, "Delete", title);
}
println();
}
private void printCollection(Collection coll, String title) throws OWLException {
if(coll.isEmpty())
return;
if(title != null) {
println();
println(title);
}
Iterator i = coll.iterator();
while(i.hasNext()) {
Object obj = i.next();
// if there is more than one element for this line
// we only print the first one. rest are either
// equivalent classes (or properties)
if(obj instanceof Collection) {
if (((Collection) obj).size()>0)
obj = ((Collection)obj).iterator().next();
else
return; // empty set
}
// if debugging is enabled, for each class description, check consistency
if (swoopModel.getEnableDebugging() && obj instanceof OWLDescription && !(obj instanceof OWLClass)) {
URL imageURI; // = baseImageURI;
OWLDescription claExpr = (OWLDescription) obj;
boolean isConsistent = reasoner.isConsistent(claExpr);
if (!isConsistent) {
imageURI = SwoopIcons.getImageURL("InconsistentClassExpression.gif");
}
else {
imageURI = SwoopIcons.getImageURL("ClassExpression.gif");
}
String hashCode = String.valueOf(claExpr.hashCode());
OWLDescHash.put(hashCode, claExpr);
print("<a href=\"<CE:"+hashCode+"\"><img src=\""+imageURI+"\"></a>");
}
printLine((OWLObject) obj, title);
}
insertAddedChanges(coll, displayedEntity, title, "");
}
/**
* Accepts a collection (coll) of objects already displayed,
* gets all added objects on (displayedEntity), matching the (title)/code,
* inserts added objects not present in collection
* @param coll
* @param displayedEntity
* @param title
* @param titleHead
* @throws OWLException
*/
protected boolean insertAddedChanges(Collection coll, OWLEntity displayedEntity, String title, String titleHead) throws OWLException {
boolean printed = false;
String code = getCode(title);
if(editorEnabled) {
Map added = getAdded(displayedEntity, code);
if(!added.isEmpty()) {
printed = true;
if (!titleHead.equals("")) {
println();
println(titleHead+addTitle(code));
}
Iterator j = added.entrySet().iterator();
while(j.hasNext()) {
Map.Entry entry = (Map.Entry) j.next();
OWLObject obj = (OWLObject) entry.getKey();
if(coll.contains(obj))
continue;
Object change = entry.getValue();
print("<font color=\"green\">");
printObject(obj);
print("</font>");
addUndo(change, "Add", title);
println();
}
}
}
return printed;
}
protected void renderClass(OWLClass clazz) throws OWLException {
// check if class being rendered is a class expression
if (clazz.getURI().toString().indexOf("#ClassExpression")>=0) {
String uri = clazz.getURI().toString();
String hashCode = uri.substring(uri.indexOf("#ClassExpression")+16, uri.length());
// obtain class expression from hash
OWLDescription claExpr = swoopModel.getCEfromHash(hashCode);
// turn editable off
boolean saveEditable = this.editorEnabled;
this.editorEnabled = false;
// print class expression
print("Class Expression: ");
printLine((OWLObject) claExpr, "");
// print equivalent classes of CE
String equTitle = "<b>Equivalent to:</b>";
Set eqs = reasoner.equivalentClassesOf(claExpr);
printCollection(eqs, equTitle);
// print subclasses of CE
String subTitle = "<b>Sub-Class of:</b>";
Set sub = reasoner.superClassesOf(claExpr);
printCollection(sub, subTitle);
// print superclasses of CE
String supTitle = "<b>Super-Class of:</b>";
Set sup = reasoner.subClassesOf(claExpr);
printCollection(sup, supTitle);
// restore editable setting
this.editorEnabled = saveEditable;
return;
}
// check if class is in current ontology or imported
String importedLbl = "";
imported = false;
if (!clazz.getOntologies().contains(swoopModel.getSelectedOntology())) {
importedLbl = "Imported ";
imported = true;
}
Iterator i = null;
List notPrinted = new ArrayList();
OWLClass owlThing = reasoner.getOntology().getOWLDataFactory().getOWLThing();
OWLClass owlNothing = reasoner.getOntology().getOWLDataFactory().getOWLNothing();
//****** TESTING PURPOSES ONLY ***************
// print("<a href=\"PELLET-SATURATION\">SATURATION TEST</a><br>");
// *******************************************
print("<b>"+importedLbl+"OWL-Class:</b> ");
printObject(clazz);
if (importedLbl.length()>0) {
println();
// print("<b>Imported from Ontology(s):</b> ");
// also print where the class is imported from
Iterator ontIter = clazz.getOntologies().iterator();
while (ontIter.hasNext()) {
OWLOntology ont = (OWLOntology) ontIter.next();
String ontURI = ont.getURI().toString();
String ontName = ontURI.substring(ontURI.lastIndexOf("/")+1, ontURI.length());
String classXPtrURI = clazz.getURI() + XPointers.asDefinedIn + "(" + ontURI + ")";
print("See its definition in Imported Ontology: <a href=\""+escape(classXPtrURI)+"\">" + escape(ontName) + "</a>");
// print("<a href=\""+ontURI+"asDefinedIn("+ontURI+")\">"+className+"</a> ");
println();
}
println();
}
println();
//*** explanations for inconsistent class
if(!reasoner.isConsistent( clazz )) {
println("<font color=\"red\"><b>Unsatisfiable concept</b></font>");
if (reasoner instanceof PelletReasoner && swoopModel.isDebugGlass()) {
if (swoopModel.findAllMUPS) parseTime = 0;
Timer mupsTimer = new Timer("MUPS Processing Time");
mupsTimer.start();
// create a set of sets for MUPS
List MUPS = new ArrayList();
List explStr = new ArrayList(); // also get explanation strings if using tableau
Set explanationSet = new HashSet();
if (swoopModel.isUseTableau()) {
// call debugging version of Pellet instead
List explSOS = this.getTableauSOS(swoopModel.getSelectedOntology(), clazz);
// String explanation = explSOS.get(0).toString();
// get explanation set from pellet
explanationSet = (HashSet) explSOS.get(1);
explStr.add(explSOS.get(0).toString());
}
else {
// use black box method instead
explanationSet = this.getBlackBoxSOS(swoopModel.getSelectedOntology(), clazz);
}
MUPS.add(explanationSet);
// find all MUPS using Hitting Set Trees approach
if (swoopModel.isFindAllMUPS()) HSTMUPS(explanationSet, swoopModel.getSelectedOntology(), MUPS, explStr, new HashSet(), new HashSet());
mupsTimer.stop();
System.out.println("------ MUPS PROCEDURE COMPLETE -------");
if (swoopModel.findAllMUPS) {
System.out.println(mupsTimer);
System.out.println("parse time: "+parseTime);
System.out.println("net time: "+ String.valueOf(mupsTimer.getTotal() - parseTime));
netTime = mupsTimer.getTotal() - parseTime;
mupsCount = MUPS.size();
}
Object[] explObj = explStr.toArray();
int o = 0;
HashMap explMap = new HashMap();
Set mupsSet = new HashSet();
for (Iterator iter = MUPS.iterator(); iter.hasNext();) {
Set explSet = (HashSet) iter.next();
mupsSet.add(explSet);
if (o<explObj.length && explObj[o]!=null) {
String expl = explObj[o].toString();
explMap.put(explSet, expl);
}
o++;
}
for (Iterator iter = mupsSet.iterator(); iter.hasNext();) {
Set m = (HashSet) iter.next();
print("<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
if (explMap.containsKey(m)) println(explMap.get(m).toString());
this.printExplanationSOS(m, clazz, false);
}
}
}
//***
// rules stuff
if (swoopModel.getEnableRules()) {
RulesExpressivity ruleExpr = swoopModel.getRuleExpr();
Set rules = ruleExpr.getRules(clazz);
String ruleTitle = "<b>Rules:</b>";
if (editorEnabled)
ruleTitle += addTitle("RULE");
pw.println( "\n" + ruleTitle + " \n<br>" );
for (Iterator iter = rules.iterator(); iter.hasNext();) {
OWLRule rule = ((RuleValue) iter.next()).getRule();
String ruleDesc = rule.toString();
int ptr;
ptr = ruleDesc.indexOf(">")+1;
String consequent = ruleDesc.substring(ptr,ruleDesc.indexOf("."));
String varConsequent = consequent.substring((consequent.indexOf("(")+1),consequent.indexOf(")"));
ruleDesc = ruleDesc.substring(0,ptr-2)+".";
ruleDesc = consequent + " <b>:-</b> " + ruleDesc;
ptr = 0;
ruleDesc = " " + ruleDesc;
String hyperRule = ruleDesc;
while ((ptr = ruleDesc.indexOf("(", ptr))>=0) {
String name = ruleDesc.substring(ruleDesc.lastIndexOf(" ", ptr), ptr);
String uri = this.getURIForTerm(name.trim());
hyperRule = hyperRule.replaceAll(name, "<a href=\""+uri+"\">"+name+"</a>");
ptr++;
}
if ( editorEnabled ) {
pw.print( hyperRule );
String hash = String.valueOf(rule.hashCode());
OWLDescHash.put(hash, rule);
String titleCode = "RULE"; //getCode(title);
pw.print(" (<font color=\"red\"><a href=\"<Delete:" + hash
+ ":" + titleCode + "\">Delete</a></font>) ");
pw.print(" (<font color=\"red\"><a href=\"<Edit:" + hash
+ ":" + titleCode + "\">Edit</a></font>)");
pw.print(" (<font color=\"red\"><a href=\"<Publish:" + hash
+ ":" + titleCode + "\">Publish</a></font>)");
pw.println( "<br>" );
} else {
pw.println( hyperRule + "<br>");
}
}
}
if (showDivisions) {
print("<table cellpadding=\"5\"><tr bgcolor=\"#FFF68F\"><FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
}
boolean printedAnn = renderAnnotations(clazz);
if (!printedAnn) notPrinted.add("A-ANN");
else if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
int notPrintedSize = notPrinted.size();
i = OWLDescriptionFinder.getIntersections(clazz, reasoner.getOntologies()).iterator();
if (!i.hasNext()) {
// insert added elements
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-INT", "<b>Intersection of:</b>");
if (!printed) notPrinted.add("C-INT");
}
while(i.hasNext()) {
OWLAnd intersection = (OWLAnd) i.next();
String title = "<b>Intersection of:</b>";
if (editorEnabled) title += addTitle("C-INT");
// check for empty collection
if (intersection.getOperands().size()==0) {
// copy from above
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-INT", "<b>Intersection of:</b>");
if (!printed) notPrinted.add("C-INT");
}
else printCollection(intersection.getOperands(), title);
}
i = OWLDescriptionFinder.getUnions(clazz, reasoner.getOntologies()).iterator();
if (!i.hasNext()) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-UNI", "<b>Union of:</b>");
if (!printed) notPrinted.add("C-UNI");
}
while(i.hasNext()) {
OWLOr union = (OWLOr) i.next();
String title = "<b>Union of:</b>";
if (editorEnabled) title += addTitle("C-UNI");
// check for empty collection
if (union.getOperands().size()==0) {
//copy from above
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-UNI", "<b>Union of:</b>");
if (!printed) notPrinted.add("C-UNI");
}
else printCollection(union.getOperands(), title);
}
i = OWLDescriptionFinder.getEnumerations(clazz, reasoner.getOntologies()).iterator();
if (!i.hasNext()) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "I-ONE", "<b>One of:</b>");
if (!printed) notPrinted.add("I-ONE");
}
while(i.hasNext()) {
OWLEnumeration oneOf = (OWLEnumeration) i.next();
String title = "<b>One of:</b>";
if (editorEnabled) title += addTitle("I-ONE");
// check for empty collection
if (oneOf.getIndividuals().size()==0) {
//copy from above
boolean printed = insertAddedChanges(new HashSet(), clazz, "I-ONE", "<b>One of:</b>");
if (!printed) notPrinted.add("I-ONE");
}
else printCollection(oneOf.getIndividuals(), title);
}
if ((notPrinted.size()-notPrintedSize<3) && (showDivisions)) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
// print equivalent classes
String equTitle = "<b>Equivalent to:</b>";
if (editorEnabled) equTitle += addTitle("C-EQU");
// get defined equivalentclasses
Set eqs = OWLDescriptionFinder.getEquivalentClasses(clazz, reasoner.getOntologies());
// remove all complements
i = eqs.iterator();
while(i.hasNext()) {
OWLDescription desc = (OWLDescription) i.next();
if(!(desc instanceof OWLClass || desc instanceof OWLRestriction))
i.remove();
}
if(reasoner.isConsistent(clazz)) {
// add all the named equivalent classes
eqs.addAll(reasoner.equivalentClassesOf(clazz));
}
else
eqs.add(owlNothing);
// title is not printed if there was no equivalent class
if (!eqs.isEmpty()) {
printCollection(eqs, equTitle);
}
else {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-EQU", "<b>Equivalent to:</b>");
if (!printed) notPrinted.add("C-EQU");
}
// print complements
String notTitle = "<b>Complement of:</b>";
if (editorEnabled) notTitle += addTitle("C-NOT");
// get complements
Set nots = OWLDescriptionFinder.getComplements(clazz, reasoner.getOntologies());
if (nots.isEmpty()) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-NOT", "<b>Complement of:</b>");
if (!printed) notPrinted.add("C-NOT");
}
else {
// if(reasoner.isConsistent(clazz)) {
// // add all the named equivalent classes
// nots.addAll(reasoner.equivalentClassesOf(clazz));
// }
// else
// nots.add(owlNothing);
printCollection(nots, notTitle);
}
// print named disjoints
String disTitle = "<b>Disjoint with:</b>";
Set disjoints = OWLDescriptionFinder.getDisjoints(clazz, reasoner.getOntologies());
if (disjoints.size()==0) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-DIS", disTitle);
if (!printed) notPrinted.add("C-DIS");
}
else {
if (editorEnabled) disTitle += addTitle("C-DIS");
printCollection(disjoints, disTitle);
}
// get defined superclasses
Set supers = OWLDescriptionFinder.getSuperClasses(clazz, reasoner.getOntologies());
if(reasoner.isConsistent(clazz)) {
// remove all the named classes because reasoner will eventually add them
i = supers.iterator();
while(i.hasNext())
if(i.next() instanceof OWLClass)
i.remove();
// add all the named superclasses
supers.addAll(reasoner.superClassesOf(clazz));
// remove owl:Thing from the superclass set
i = supers.iterator();
while(i.hasNext()) {
Object o = i.next();
if(o instanceof Set && ((Set)o).contains(owlThing))
i.remove();
}
}
String subTitle = "<b>Subclass of:</b>";
if(supers.size() == 0) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-SUB", "<b>Subclass of:</b>");
if (!printed) notPrinted.add("C-SUB");
}
else {
if (editorEnabled) subTitle += addTitle("C-SUB");
printCollection(supers, subTitle);
}
// print named subclasses
// and asserted complex subclasses
String supTitle = "<b>Superclass of:</b>";
if (editorEnabled) supTitle += addTitle("C-SUP");
Set subs = reasoner.subClassesOf(clazz);
subs = SetUtils.union(subs);
subs.addAll(OWLDescriptionFinder.getSubClasses(clazz, reasoner.getOntologies()));
subs.remove(owlNothing);
subs.removeAll(reasoner.equivalentClassesOf(owlNothing));
if(subs.size() >= 1)
printCollection(subs, supTitle);
else {
boolean printed = insertAddedChanges(new HashSet(), clazz, "C-SUP", "<b>Superclass of:</b>");
if (!printed) notPrinted.add("C-SUP");
}
if ((notPrinted.size()-notPrintedSize<5) && (showDivisions)) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
// start printing properties whose domain/range is this class
String domTitle = "<b>Domain of:</b>";
if (editorEnabled) domTitle += addTitle("P-DOM");
if (getPropertiesWithDomain(clazz, showInherited).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "P-DOM", "<b>Domain of:</b>");
if (!printed) notPrinted.add("P-DOM");
}
else printCollection(getPropertiesWithDomain(clazz, showInherited), domTitle);
String ranTitle = "<b>Range of:</b>";
if (editorEnabled) ranTitle += addTitle("P-RAN");
if (getPropertiesWithRange(clazz, showInherited).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "P-RAN", "<b>Range of:</b>");
if (!printed) notPrinted.add("P-RAN");
}
else printCollection(getPropertiesWithRange(clazz, showInherited), ranTitle);
if ((notPrinted.size()-notPrintedSize<2) && (showDivisions)) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
Set instances = new HashSet();
if (showInherited) instances = reasoner.allInstancesOf(clazz);
else instances = reasoner.instancesOf(clazz);
String insTitle = "<b>Instances:</b>";
if (editorEnabled) insTitle += addTitle("I-INS");
if (instances.size()==0) {
boolean printed = insertAddedChanges(new HashSet(), clazz, "I-INS", "<b>Instances:</b>");
if (!printed) notPrinted.add("I-INS");
}
else printCollection(instances, insTitle);
if ((notPrinted.size()-notPrintedSize<1) && (showDivisions)) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
if (showDivisions && !editorEnabled) {
print("</tr>");
}
// add unprinted titles at the bottom
addUnprinted(notPrinted);
}
/**
* Add all the unprinted parameters at the end of the CF pane if editor is enabled
* @param notPrinted
*/
protected void addUnprinted(List notPrinted) {
if (editorEnabled) {
Iterator npIter = notPrinted.iterator();
boolean div1 = false, div2 = false, div3 = false, div4 = false, div5 = false, div6 = false, div7 = false;
while (npIter.hasNext()) {
String typeCode = npIter.next().toString();
if (typeCode.equals("A-ANN")) {
println();
println(" <b>Annotations</b>:"+addTitle(typeCode));
if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
}
if (typeCode.equals("C-INT")) {
div1 = true;
println();
println(" <b>Intersection of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-UNI")) {
div1 = true;
println();
println(" <b>Union of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("I-ONE")) {
div1 = true;
println();
println(" <b>One of:</b>"+addTitle(typeCode));
}
else if (showDivisions && div1) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div1 = false;
}
if (typeCode.equals("C-EQU")) {
div2 = true;
println();
println(" <b>Equivalent to:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-NOT")) {
div2 = true;
println();
println(" <b>Complement of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-DIS")) {
div2 = true;
println();
println(" <b>Disjoint with:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-SUB")) {
div2 = true;
println();
println(" <b>Subclass of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-SUP")) {
div2 = true;
println();
println(" <b>Superclass of:</b>"+addTitle(typeCode));
}
else if (showDivisions && div2) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div2 = false;
}
if (typeCode.equals("P-DOM")) {
div3 = true;
println();
println(" <b>Domain of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("P-RAN")) {
div3 = true;
println();
println(" <b>Range of:</b>"+addTitle(typeCode));
}
else if (showDivisions && div3) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div3 = false;
}
if (typeCode.equals("I-INS")) {
println();
println(" <b>Instances:</b>"+addTitle(typeCode));
}
// render unassigned property axiom divisions
if (typeCode.equals("P-EQU")) {
div4 = true;
println();
println(" <b>Equivalent to:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("P-INV")) {
div4 = true;
println();
println(" <b>Inverse of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("P-SUB")) {
div4 = true;
println();
println(" <b>Subproperty of:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("P-SUP")) {
div4 = true;
println();
println(" <b>Superproperty of:</b>"+addTitle(typeCode));
}
else if (showDivisions && div4) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div4 = false;
}
if (typeCode.equals("C-HASDOM")) {
div5 = true;
println();
println(" <b>Has Domain:</b>"+addTitle(typeCode));
}
else if (typeCode.equals("C-HASRAN")) {
div5 = true;
println();
println(" <b>Has Range:</b>"+addTitle(typeCode));
}
else if (showDivisions && div5) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div5 = false;
}
if (typeCode.equals("ATTRIB")) {
println();
println(" <b>Attributes:</b>"+addTitle(typeCode));
}
// render individual related information
if (typeCode.equals("C-TYP")) {
println();
println("<b>Instance of:</b>"+addTitle(typeCode));
div6 = true;
}
else if (typeCode.equals("I-SAM")) {
println();
println("<b>Same As:</b>"+addTitle(typeCode));
div6 = true;
}
else if (typeCode.equals("I-DIF")) {
println();
println("<b>Different From:</b>"+addTitle(typeCode));
div6 = true;
}
else if (showDivisions && div6) {
print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
div6 = false;
}
if (typeCode.equals("P-INSD")) {
println();
println("<b>Datatype Assertions:</b>"+addTitle(typeCode));
div7 = true;
}
if (typeCode.equals("P-INSO")) {
println();
println("<b>Object Assertions:</b>"+addTitle(typeCode));
div7 = true;
}
}
}
}
protected String addTitle(String param) {
String title = " (<font color=\"red\"><a href=\"<Add"+param+"\">Add</a></font>)";
return title;
}
protected String getCode(String title) {
String titleCode = title;
if (editorEnabled) {
// remove hyperlink stuff and return code
if(title.indexOf("red")>=0) {
int spos = title.indexOf("<a href=\"<")+10;
int epos = title.indexOf("\"", spos+1);
titleCode = title.substring(spos, epos);
titleCode = titleCode.substring(3, titleCode.length()); // remove 'Add..'
}
}
else {
// return code directly
if (title.equals("<b>Intersection of:</b>")) titleCode = "C-INT";
else if (title.equals("<b>Union of:</b>")) titleCode = "C-UNI";
else if (title.equals("<b>One of:</b>")) titleCode = "I-ONE";
else if (title.equals("<b>Equivalent to:</b>")) {
if (displayedEntity instanceof OWLClass) titleCode = "C-EQU";
else titleCode = "P-EQU";
}
else if (title.equals("<b>Disjoint with:</b>")) titleCode = "C-DIS";
else if (title.equals("<b>Complement of:</b>")) titleCode = "C-NOT";
else if (title.equals("<b>Subclass of:</b>")) titleCode = "C-SUB";
else if (title.equals("<b>Superclass of:</b>")) titleCode = "C-SUP";
else if (title.equals("<b>Domain of:</b>")) titleCode = "P-DOM";
else if (title.equals("<b>Range of:</b>")) titleCode = "P-RAN";
else if (title.equals("<b>Instances:</b>")) titleCode = "I-INS";
else if (title.equals("<b>Instance of:</b>")) titleCode = "C-TYP";
else if (title.equals("<b>Inverse of:</b>")) titleCode = "P-INV";
else if (title.equals("<b>Subproperty of:</b>")) titleCode = "P-SUB";
else if (title.equals("<b>Superproperty of:</b>")) titleCode = "P-SUP";
else if (title.equals("<b>Has domain:</b>")) titleCode = "C-HASDOM";
else if (title.equals("<b>Has range:</b>")) titleCode = "C-HASRAN";
}
return titleCode;
}
protected void addWhy(Object obj, String title) {
String hash = String.valueOf(obj.hashCode());
OWLDescHash.put(hash, obj);
String titleCode = getCode(title);
if (!imported) {
print(" (<font color=\"red\"><a href=\"<Why:"+hash+":"+titleCode+"\">Why?</a></font>)");
}
}
protected void addDelete(Object obj, String title) {
String hash = String.valueOf(obj.hashCode());
OWLDescHash.put(hash, obj);
String titleCode = getCode(title);
if (!imported) {
print(" (<font color=\"red\"><a href=\"<Delete:"+hash+":"+titleCode+"\">Delete</a></font>)");
}
}
protected void addValueLink(OWLProperty prop) {
String hash = String.valueOf(prop.hashCode());
OWLDescHash.put(hash, prop);
print(" (<font color=\"red\"><a href=\"<AddV:"+hash+"\">Add Value</a></font>)");
}
protected void deleteValueLink(OWLProperty prop, OWLDataValue dtv) {
String hash1 = String.valueOf(prop.hashCode());
String hash2 = String.valueOf(dtv.hashCode());
OWLDescHash.put(hash1, prop);
OWLDescHash.put(hash2, dtv);
print(" (<font color=\"red\"><a href=\"<Delete:"+hash1+":P-VAL:"+hash2+"\">Delete</a></font>)");
}
protected void deleteValueLink(OWLProperty prop, OWLIndividual ind) {
String hash1 = String.valueOf(prop.hashCode());
String hash2 = String.valueOf(ind.hashCode());
OWLDescHash.put(hash1, prop);
OWLDescHash.put(hash2, ind);
print(" (<font color=\"red\"><a href=\"<Delete:"+hash1+":P-VAL:"+hash2+"\">Delete</a></font>)");
}
protected void deleteTypeLink(OWLDescription cla) {
String hash = String.valueOf(cla.hashCode());
OWLDescHash.put(hash, cla);
print(" (<font color=\"red\"><a href=\"<Delete:"+hash+":I-INS\">Delete</a></font>)");
}
protected void addUndo(Object obj, String type, String title) {
String hash = String.valueOf(obj.hashCode());
OWLDescHash.put(hash, obj);
String titleCode = getCode(title);
print(" (<font color=\"red\"><a href=\"<Undo:"+type+":"+hash+":"+titleCode+"\">Undo</a></font>)");
}
protected String isImage(String url) {
Set imageExtSet = new HashSet();
imageExtSet.add("jpg");
imageExtSet.add("gif");
if (url.indexOf("<a href=")>=0) {
int spos = url.indexOf("<a href=\"<")+10;
int epos = url.indexOf("\"", spos+1);
url = url.substring(spos, epos);
String ext = url.substring(url.lastIndexOf(".")+1, url.length());
if (imageExtSet.contains(ext)) {
return url;
}
}
return "";
}
protected void renderIndividual(OWLIndividual ind) throws OWLException {
// check if individual is in current ontology or imported
String importedLbl = "";
imported = false;
List unprinted = new ArrayList();
if (!ind.getOntologies().contains(swoopModel.getSelectedOntology())) {
importedLbl = "Imported ";
imported = true;
}
OWLClass owlThing = reasoner.getOntology().getOWLDataFactory().getOWLThing();
print("<b>"+importedLbl+"OWL-Individual:</b> ");
if (ind.isAnonymous())
println("Anonymous ");
else
println(shortForm(ind.getURI()) + " ");
if (importedLbl.length()>0) {
println();
// print("<b>Imported from Ontology(s):</b> ");
// also print where the class is imported from
Iterator ontIter = ind.getOntologies().iterator();
while (ontIter.hasNext()) {
OWLOntology ont = (OWLOntology) ontIter.next();
String ontURI = ont.getURI().toString();
String ontName = ontURI.substring(ontURI.lastIndexOf("/")+1, ontURI.length());
String indXPtrURI = ind.getURI() + XPointers.asDefinedIn + "(" + ontURI + ")";
print("See its definition in Imported Ontology: <a href=\""+indXPtrURI+"\">" + ontName + "</a>");
// print("<a href=\""+ontURI+"asDefinedIn("+ontURI+")\">"+className+"</a> ");
println();
}
println();
}
println();
if (showDivisions) {
print("<table cellpadding=\"5\"><tr bgcolor=\"#FFF68F\"><FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
}
boolean printedAnn = renderAnnotations(ind);
if (!printedAnn) unprinted.add("A-ANN");
else // print the first division here (after annotations)
if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
boolean div2 = false;
// get defined types
Set types = OWLDescriptionFinder.getTypes(ind, reasoner.getOntologies());
if(reasoner.isConsistent()) {
// remove all the named classes because reasoner will eventually add them
Iterator i = types.iterator();
while(i.hasNext())
if(i.next() instanceof OWLClass)
i.remove();
// types.clear(); // *** turns out reasoner returns asserted types as well
// add all the named superclasses
types.addAll(reasoner.typesOf(ind));
}
// remove owl:Thing from the superclass set
Iterator i = types.iterator();
while(i.hasNext()) {
Object o = i.next();
if(o instanceof Set && ((Set)o).contains(owlThing))
i.remove();
}
boolean printedType = false;
String title = "<b>Instance of:</b>";
if(types.size() == 0) {
printedType = insertAddedChanges(new HashSet(), ind, "C-TYP", "<b>Instance of:</b>");
}
else {
if (editorEnabled) title += addTitle("C-TYP");
printCollection(types, title);
printedType = true;
}
if (!printedType) unprinted.add("C-TYP");
else div2 = true;
// print sameAs individuals
title = "<b>Same As:</b>";
boolean printedSame = false;
if (reasoner.isConsistent() && reasoner.getSameAsIndividuals(ind)!=null && reasoner.getSameAsIndividuals(ind).size()>0) {
Set sameAs = reasoner.getSameAsIndividuals(ind);
if (editorEnabled) title += addTitle("I-SAM");
printCollection(sameAs, title);
printedSame = true;
}
else {
printedSame = insertAddedChanges(new HashSet(), ind, "I-SAM", "<b>Same As:</b>");
}
if (!printedSame) unprinted.add("I-SAM");
else div2 = true;
// print diffFrom individuals
boolean printedDiff = false;
title = "<b>Different From:</b>";
if (reasoner.isConsistent() && reasoner.getDifferentFromIndividuals(ind)!=null && reasoner.getDifferentFromIndividuals(ind).size()>0) {
Set diffFrom = reasoner.getDifferentFromIndividuals(ind);
if (editorEnabled) title += addTitle("I-DIF");
printCollection(diffFrom, title);
printedDiff = true;
}
else {
printedDiff = insertAddedChanges(new HashSet(), ind, "I-DIF", "<b>Different From:</b>");
}
if (!printedDiff) unprinted.add("I-DIF");
else div2 = true;
// print second division here (after types, sameAs, diffFrom)
if (div2) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
// get properties whose domain is the type of the individual
HashMap propMap = new HashMap();
for (Iterator typeIter = types.iterator(); typeIter.hasNext();) {
Object typ = typeIter.next();
if (typ instanceof Set) {
Set equClas = (HashSet) typ; // set of equivalent class types
for (Iterator ite=equClas.iterator(); ite.hasNext();) {
OWLDescription type = (OWLDescription) ite.next();
if (!(type instanceof OWLClass)) continue;
propMap.put(type, getPropertiesWithDomain((OWLClass) type, false));
if (showInherited) {
Set ancSet = reasoner.ancestorClassesOf(type);
for (Iterator supCIter = ancSet.iterator(); supCIter.hasNext();) {
Set supCSet = (HashSet) supCIter.next();
OWLDescription supC = (OWLDescription) supCSet.iterator().next();
if (supC instanceof OWLClass) {
propMap.put(supC, getPropertiesWithDomain((OWLClass) supC, false));
}
}
}
}
}
}
boolean div3 = false;
// print all datatype properties and value pairs of instance
Set instanceProps = new HashSet();
Map dataValues = new HashMap();
if (reasoner.isConsistent()) dataValues = reasoner.getDataPropertyValues(ind);
boolean printedDataAssTitle = false;
if(dataValues.size() > 0) {
for (Iterator it = dataValues.keySet().iterator(); it.hasNext();) {
OWLDataProperty prop = (OWLDataProperty) it.next();
boolean valLinkPrinted = false;
Set vals = (Set) dataValues.get(prop);
if (vals.size()>0) {
if (!printedDataAssTitle) {
// just print title once
println();
print("<b>Datatype Assertions:</b>");
if (editorEnabled) print(addTitle("P-INSD"));
println();
printedDataAssTitle = true;
}
instanceProps.add(prop);
}
for (Iterator valIt = vals.iterator(); valIt.hasNext();) {
OWLDataValue dtv = (OWLDataValue) valIt.next();
// check if DataPropertyInstance is deleted
OntologyChange oc = editorEnabled ? isDeleted(prop, dtv) : null;
boolean deleted = (oc != null);
if(deleted) print("<font color=\"red\"><strike>");
visitor.reset();
dtv.accept(visitor);
if (!isExplicit(ind, "P-INSD", prop, dtv)) print("<i>");
printConciseObject(prop);
print(" : " + visitor.result());
if (!isExplicit(ind, "P-INSD", prop, dtv)) print("</i>");
if(deleted) {
print("</strike></font>");
addUndo(oc, "Delete", "P-VAL");
}
else if (editorEnabled && isExplicit(ind, "P-INSD", prop, dtv)) deleteValueLink(prop, dtv);
if ((!valLinkPrinted) && (editorEnabled)) {
addValueLink(prop);
valLinkPrinted = true; // only display 'Add Value' link once for each property
}
if (valIt.hasNext()) {
println();
}
}
if (printedDataAssTitle) println();
}
}
// print all AddDataPropertyInstance changes associated with this instance in green
Iterator citer = changes.iterator();
while(citer.hasNext()) {
OntologyChange oc = (OntologyChange) citer.next();
if (oc instanceof AddDataPropertyInstance) {
AddDataPropertyInstance change = (AddDataPropertyInstance) oc;
if (change.getSubject().equals(ind)) {
if (!printedDataAssTitle) {
println();
print("<b>Datatype Assertions:</b>");
if (editorEnabled) print(addTitle("P-INSD"));
println();
printedDataAssTitle = true;
}
OWLDataProperty prop = change.getProperty();
instanceProps.add(prop);
OWLDataValue dtv = change.getObject();
visitor.reset();
dtv.accept(visitor);
print("<font color=\"green\">");
printConciseObject(prop);
print(" : " + visitor.result());
addUndo(change, "Add", "V");
print("</font>");
println();
}
}
}
if (!printedDataAssTitle) unprinted.add("P-INSD");
else div3 = true;
// print all object properties and value pairs of instance
Map propertyValues = new HashMap();
if (reasoner.isConsistent()) propertyValues = reasoner.getObjectPropertyValues(ind);
boolean printedObjAssTitle = false;
if(propertyValues.size() > 0) {
for (Iterator it = propertyValues.keySet().iterator(); it.hasNext();) {
OWLObjectProperty prop = (OWLObjectProperty) it.next();
boolean valLinkPrinted = false;
Set vals = (Set) propertyValues.get(prop);
if (vals.size()>0) {
if (!printedObjAssTitle) {
// only print title once
println();
print("<b>Object Assertions:</b>");
if (editorEnabled) print(addTitle("P-INSO"));
println();
printedObjAssTitle = true;
}
instanceProps.add(prop);
}
for (Iterator valIt = vals.iterator(); valIt.hasNext();) {
OWLIndividual oi = (OWLIndividual) valIt.next();
// check if ObjectPropertyInstance is deleted
OntologyChange oc = editorEnabled ? isDeleted(prop, oi) : null;
boolean deleted = (oc != null);
if(deleted) print("<font color=\"red\"><strike>");
if (!isExplicit(ind, "P-INSO", prop, oi)) print("<i>");
printConciseObject(prop);
visitor.reset();
boolean turnOnIcons = false;
// turn off icons while rendering individuals
// since we are rendering image values inline
if (swoopModel.getShowIcons()) {
turnOnIcons = true;
swoopModel.setShowIcons(false, false);
}
oi.accept(visitor);
String objValue = visitor.result();
if (isImage(objValue).equals("")) print(" : " + visitor.result());
else {
// render image inline
print(" : ");
println("<P align=\"left\"><b><img border=\"3\" src=\""+ isImage(objValue)+ "\" width=\"100\" height=\"100\"></b></P>");
}
// check for turnOnIcons
if (turnOnIcons) swoopModel.setShowIcons(true, false);
if (!isExplicit(ind, "P-INSO", prop, oi)) {
print("</i>");
if (reasoner.supportsExplanation()) {
// add why link manually
List propVal = new ArrayList();
propVal.add(prop);
propVal.add(oi);
String hash = String.valueOf(propVal.hashCode());
OWLDescHash.put(hash, propVal);
if (!imported) {
print(" (<font color=\"red\"><a href=\"<Why:"+hash+":"+"P-INSO"+"\">Why?</a></font>)");
}
}
}
if (deleted) {
print("</strike></font>");
addUndo(oc, "Delete", "P-VAL");
}
else if (editorEnabled && isExplicit(ind, "P-INSO", prop, oi)) deleteValueLink(prop, oi);
if ((!valLinkPrinted) && (editorEnabled)) {
addValueLink(prop);
valLinkPrinted = true; // only display 'Add Value' link once for each property
}
if (valIt.hasNext()) {
println();
}
}
if (printedObjAssTitle) println();
}
}
// print all AddObjectPropertyInstance changes associated with this instance in green
citer = changes.iterator();
while(citer.hasNext()) {
OntologyChange oc = (OntologyChange) citer.next();
if (oc instanceof AddObjectPropertyInstance) {
AddObjectPropertyInstance change = (AddObjectPropertyInstance) oc;
if (change.getSubject().equals(ind)) {
if (!printedObjAssTitle) {
println();
print("<b>Object Assertions:</b>");
if (editorEnabled) print(addTitle("P-INSO"));
println();
printedObjAssTitle = true;
}
OWLObjectProperty prop = change.getProperty();
instanceProps.add(prop);
OWLIndividual objInst = change.getObject();
print("<font color=\"green\">");
printConciseObject(prop);
print(" : ");
printConciseObject(objInst);
addUndo(change, "Add", "V");
print("</font>");
println();
}
}
}
if (!printedObjAssTitle) unprinted.add("P-INSO");
else div3 = true;
if (div3) {
if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+swoopModel.getFontSize()+">");
}
this.addUnprinted(unprinted);
if (editorEnabled) {
if (propMap.size()>0) {
if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
println();
println("<b>Likely Properties to Use:</b>");
for (Iterator iter = propMap.keySet().iterator(); iter.hasNext();) {
OWLClass cla = (OWLClass) iter.next();
Set props = (HashSet) propMap.get(cla);
for (Iterator pit = props.iterator(); pit.hasNext();) {
OWLProperty prop = (OWLProperty) pit.next();
if (!instanceProps.contains(prop)) {
print("(of ");
printConciseObject(cla);
print(") ");
printConciseObject(prop);
print(" : ");
addValueLink(prop);
println();
}
}
}
}
}
}
protected void renderAnnotationProperty(OWLAnnotationProperty prop) throws OWLException {
println("<b>OWL-AnnotationProperty:</b> " + shortForm(prop.getURI()) + " ");
}
protected void renderObjectProperty(OWLObjectProperty prop) throws OWLException {
// check if property is in current ontology or imported
String importedLbl = "";
imported = false;
if (!prop.getOntologies().contains(swoopModel.getSelectedOntology())) {
importedLbl = "Imported ";
imported = true;
}
List notPrinted = new ArrayList();
Iterator it = null;
// print("<b>"+importedLbl+"OWL-ObjectProperty:</b> ");
// printObject(prop);
//
// *********************************************
//Added for Econnections
//**********************************************
if(!prop.isLink()){
print("<b>"+importedLbl+"OWL-ObjectProperty:</b> ");
printObject(prop);}
else{
print("<b>"+importedLbl+"OWL-LinkProperty:</b> ");
printObject(prop);
print("<br><b>"+"ForeignOntology:</b> ");
URI linkURI = prop.getLinkTarget();
print( "<a href=\""+ linkURI.toString() + "\">" + swoopModel.shortForm(linkURI) + "</a>");
}
//***********************************************
if (importedLbl.length()>0) {
println();
// print("<b>Imported from Ontology(s):</b> ");
// also print where the class is imported from
Iterator ontIter = prop.getOntologies().iterator();
while (ontIter.hasNext()) {
OWLOntology ont = (OWLOntology) ontIter.next();
String ontURI = ont.getURI().toString();
String ontName = ontURI.substring(ontURI.lastIndexOf("/")+1, ontURI.length());
String propXPtrURI = prop.getURI() + XPointers.asDefinedIn + "(" + ontURI + ")";
print("See its definition in Imported Ontology: <a href=\""+propXPtrURI+"\">" + ontName + "</a>");
// print("<a href=\""+ontURI+"asDefinedIn("+ontURI+")\">"+className+"</a> ");
println();
}
println();
}
else if (editorEnabled) print(" <font color=\"red\">(<a href=\"<SwitchProp\">Switch</a>)</font>");
if (showDivisions) print("<table cellpadding=\"5\"><tr bgcolor=\"#FFF68F\"><FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
// **** rules stuff for object properties****
if (swoopModel.getEnableRules()) {
RulesExpressivity ruleExpr = swoopModel.getRuleExpr();
System.out.println("number of rules:" + ruleExpr.getNumRules());
Set rules = ruleExpr.getRules(prop);
//pw.println("<b> Rules: </b> <br>");
String ruleTitle = "<b> Rules: </b>";
if (editorEnabled)
ruleTitle += addTitle("RULE");
pw.println( ruleTitle + " \n<br>" );
for (Iterator iter = rules.iterator(); iter.hasNext();) {
//OWLRule rule = (OWLRule) iter.next();
RuleValue rv = (RuleValue) iter.next();
OWLRule rule = rv.getRule();
String ruleDesc = rule.toString();
int ptr;
ptr = ruleDesc.indexOf(">")+1;
String consequent = ruleDesc.substring(ptr,ruleDesc.indexOf("."));
String varConsequent = consequent.substring((consequent.indexOf("(")+1),consequent.indexOf(")"));
ruleDesc = ruleDesc.substring(0,ptr-2)+".";
ruleDesc = consequent + " <b>:-</b> " + ruleDesc;
ptr = 0;
ruleDesc = " " + ruleDesc;
String hyperRule = ruleDesc;
while ((ptr = ruleDesc.indexOf("(", ptr))>=0) {
String name = ruleDesc.substring(ruleDesc.lastIndexOf(" ", ptr), ptr);
String uri = this.getURIForTerm(name.trim());
hyperRule = hyperRule.replaceAll(name, "<a href=\""+uri+"\">"+name+"</a>");
ptr++;
}
if ( editorEnabled ) {
pw.print( hyperRule );
String hash = String.valueOf(rule.hashCode());
OWLDescHash.put(hash, rule);
String titleCode = "RULE"; //getCode(title);
pw.print(" (<font color=\"red\"><a href=\"<Delete:" + hash
+ ":" + titleCode + "\">Delete</a></font>) ");
pw.print(" (<font color=\"red\"><a href=\"<Edit:" + hash
+ ":" + titleCode + "\">Edit</a></font>)");
pw.print(" (<font color=\"red\"><a href=\"<Publish:" + hash
+ ":" + titleCode + "\">Publish</a></font>)");
pw.println( "<br>" );
} else {
pw.println( hyperRule + "<br>");
}
}
}
boolean printedAnn = renderAnnotations(prop);
if (!printedAnn) notPrinted.add("A-ANN");
else if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
int notPrintedSize = notPrinted.size();
String title = "<b>Equivalent to:</b>";
if (reasoner.equivalentPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-EQU", title);
if (!printed) notPrinted.add("P-EQU");
}
else {
if (editorEnabled) title += addTitle("P-EQU");
printCollection(reasoner.equivalentPropertiesOf(prop), title);
}
title = "<b>Inverse of:</b>";
if (reasoner.inversePropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-INV", title);
if (!printed) notPrinted.add("P-INV");
}
else {
if (editorEnabled) title += addTitle("P-INV");
printCollection(reasoner.inversePropertiesOf(prop), title);
}
title = "<b>Subproperty of:</b>";
if (reasoner.superPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-SUB", title);
if (!printed) notPrinted.add("P-SUB");
}
else {
if (editorEnabled) title += addTitle("P-SUB");
printCollection(reasoner.superPropertiesOf(prop), title);
}
title = "<b>Superproperty of:</b>";
if (reasoner.subPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-SUP", title);
if (!printed) notPrinted.add("P-SUP");
}
else {
if (editorEnabled) title += addTitle("P-SUP");
printCollection(reasoner.subPropertiesOf(prop), title);
}
if ((notPrinted.size()-notPrintedSize<4) && showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
title = "<b>Has domain:</b>";
Set doms = reasoner.domainsOf(prop);
doms.addAll(prop.getDomains(swoopModel.getSelectedOntology()));
if (doms.size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "C-HASDOM", title);
if (!printed) notPrinted.add("C-HASDOM");
}
else {
if (editorEnabled) title += addTitle("C-HASDOM");
printCollection(doms, title);
}
title = "<b>Has range:</b>";
Set rans = reasoner.rangesOf(prop);
rans.addAll(prop.getRanges(swoopModel.getSelectedOntology()));
if (rans.size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "C-HASRAN", title);
if (!printed) notPrinted.add("C-HASRAN");
}
else {
if (editorEnabled) title += addTitle("C-HASRAN");
//printCollection(reasoner.rangesOf(prop), title);
printCollection(rans, title);
}
if ((notPrinted.size()-notPrintedSize<2) && showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
String OWL = OWLVocabularyAdapter.OWL;
title = "<b>Attributes:</b>";
boolean printedAttribs = false;
if(prop.isTransitive(reasoner.getOntologies()) || prop.isFunctional(reasoner.getOntologies()) ||
prop.isInverseFunctional(reasoner.getOntologies()) || prop.isSymmetric(reasoner.getOntologies())) {
printedAttribs = true;
println();
if (editorEnabled) title += addTitle("ATTRIB");
println(title);
if (prop.isFunctional(reasoner.getOntologies())) {
OntologyChange isDeleted = isDeleted(prop, "P-FUN");
if (editorEnabled) {
if (isDeleted!=null) {
print("<font color=\"red\"><strike><a href=\""+OWL+"FunctionalProperty\">Functional</a></strike></font>");
addUndo(isDeleted, "Delete", title);
}
else {
print("<a href=\""+OWL+"FunctionalProperty\">Functional</a>");
addDelete(prop, "P-FUN");
}
}
else print("<a href=\""+OWL+"FunctionalProperty\">Functional</a>");
println();
}
if (prop.isInverseFunctional(reasoner.getOntologies())) {
OntologyChange isDeleted = isDeleted(prop, "P-IFUN");
if (editorEnabled) {
if (isDeleted!=null) {
print("<font color=\"red\"><strike><a href=\""+OWL+"InverseFunctionalProperty\">Inverse Functional</a></strike></font>");
addUndo(isDeleted, "Delete", title);
}
else {
print("<a href=\""+OWL+"InverseFunctionalProperty\">Inverse Functional</a>");
addDelete(prop, "P-IFUN");
}
}
else print("<a href=\""+OWL+"InverseFunctionalProperty\">Inverse Functional</a>");
println();
}
if (prop.isTransitive(reasoner.getOntologies())) {
OntologyChange isDeleted = isDeleted(prop, "P-TRA");
if (editorEnabled) {
if (isDeleted!=null) {
print("<font color=\"red\"><strike><a href=\""+OWL+"TransitiveProperty\">Transitive</a></strike></font>");
addUndo(isDeleted, "Delete", title);
}
else {
print("<a href=\""+OWL+"TransitiveProperty\">Transitive</a>");
addDelete(prop, "P-TRA");
}
}
else print("<a href=\""+OWL+"TransitiveProperty\">Transitive</a>");
println();
}
if (prop.isSymmetric(reasoner.getOntologies())) {
OntologyChange isDeleted = isDeleted(prop, "P-SYM");
if (editorEnabled) {
if (isDeleted!=null) {
print("<font color=\"red\"><strike><a href=\""+OWL+"SymmetricProperty\">Symmetric</a></strike></font>");
addUndo(isDeleted, "Delete", title);
}
else {
print("<a href=\""+OWL+"SymmetricProperty\">Symmetric</a>");
addDelete(prop, "P-SYM");
}
}
else print("<a href=\""+OWL+"SymmetricProperty\">Symmetric</a>");
println();
}
}
// print temporarily added attribute changes
Map added = this.getAdded(prop, "ATTRIB");
if (!added.isEmpty()) {
if (!printedAttribs) {
printedAttribs = true;
if (editorEnabled) title += addTitle("ATTRIB");
println(title);
}
Iterator j = added.entrySet().iterator();
while(j.hasNext()) {
Map.Entry entry = (Map.Entry) j.next();
OWLObject obj = (OWLObject) entry.getKey();
Set changes = (HashSet) entry.getValue();
for (Iterator changeIter = changes.iterator(); changeIter.hasNext(); ) {
OntologyChange change = (OntologyChange) changeIter.next();
print("<font color=\"green\">");
if (change instanceof SetFunctional) {
print("Functional");
}
else if (change instanceof SetInverseFunctional) {
print("Inverse Functional");
}
else if (change instanceof SetTransitive) {
print("Transitive");
}
else if (change instanceof SetSymmetric) print("Symmetric");
print("</font>");
addUndo(change, "Add", title);
println();
}
}
}
if (swoopModel.getEditorEnabled() && !printedAttribs) notPrinted.add("ATTRIB");
if (showDivisions && printedAttribs) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
// add unprinted titles at the bottom
addUnprinted(notPrinted);
}
// recursively find all MUPS using HST principle
public void HSTMUPS(Set mups, OWLOntology onto, List MUPS, List explStr, Set satPaths, Set currPath) {
// key step - make a backup of onto
OWLOntology backup = swoopModel.cloneOntology(onto);
try {
for (Iterator iter = mups.iterator(); iter.hasNext();) {
// reset ontology
OWLOntology copyOnt = swoopModel.cloneOntology(backup);
OWLObject axiom = (OWLObject) iter.next();
currPath.add(axiom);
// System.out.println(axiom);
// **** remove axiom from copyOnt *****
if (axiom instanceof OWLDisjointClassesAxiom) {
OWLDisjointClassesAxiom dis = (OWLDisjointClassesAxiom) axiom;
Set disSet = dis.getDisjointClasses();
Set newDisSet = new HashSet();
for (Iterator iter2 = disSet.iterator(); iter2.hasNext();) {
OWLDescription desc = (OWLDescription) iter2.next();
if (desc instanceof OWLClass)
newDisSet.add(copyOnt.getClass(((OWLClass) desc).getURI()));
else
newDisSet.add(desc);
}
OWLDisjointClassesAxiom newDis = copyOnt.getOWLDataFactory().getOWLDisjointClassesAxiom(newDisSet);
RemoveClassAxiom r = new RemoveClassAxiom(copyOnt, (OWLClassAxiom) newDis, null);
r.accept((ChangeVisitor) copyOnt);
}
else if (axiom instanceof OWLEquivalentClassesAxiom) {
OWLEquivalentClassesAxiom equ = (OWLEquivalentClassesAxiom) axiom;
Set equSet = equ.getEquivalentClasses();
Set newEquSet = new HashSet();
List equList = new ArrayList();
for (Iterator iter2 = equSet.iterator(); iter2.hasNext();) {
OWLDescription desc = (OWLDescription) iter2.next();
if (desc instanceof OWLClass) {
newEquSet.add(copyOnt.getClass(((OWLClass) desc).getURI()));
equList.add(copyOnt.getClass(((OWLClass) desc).getURI()));
}
else {
newEquSet.add(desc);
equList.add(desc);
}
}
OWLEquivalentClassesAxiom newEqu = copyOnt.getOWLDataFactory().getOWLEquivalentClassesAxiom(newEquSet);
RemoveClassAxiom r = new RemoveClassAxiom(copyOnt, (OWLClassAxiom) newEqu, null);
r.accept((ChangeVisitor) copyOnt);
if (equList.size()==2) {
OWLDescription desc1 = (OWLDescription) equList.get(0);
OWLDescription desc2 = (OWLDescription) equList.get(0);
if (desc1 instanceof OWLClass) {
RemoveEquivalentClass re = new RemoveEquivalentClass(copyOnt, (OWLClass) desc1, desc2, null);
re.accept((ChangeVisitor) copyOnt);
}
if (desc2 instanceof OWLClass) {
RemoveEquivalentClass re = new RemoveEquivalentClass(copyOnt, (OWLClass) desc2, desc1, null);
re.accept((ChangeVisitor) copyOnt);
}
}
}
else if (axiom instanceof OWLSubClassAxiom) {
OWLSubClassAxiom subA = (OWLSubClassAxiom) axiom;
OWLDescription sub = subA.getSubClass();
OWLDescription sup = subA.getSuperClass();
OWLDescription newSub = sub;
if (sub instanceof OWLClass) newSub = copyOnt.getClass(((OWLClass) sub).getURI());
OWLDescription newSup = sup;
if (sup instanceof OWLClass) newSup = copyOnt.getClass(((OWLClass) sup).getURI());
OWLSubClassAxiom newSubA = copyOnt.getOWLDataFactory().getOWLSubClassAxiom(newSub, newSup);
OntologyChange r = new RemoveClassAxiom(copyOnt, (OWLClassAxiom) newSubA, null);
r.accept((ChangeVisitor) copyOnt);
if (newSub instanceof OWLClass) {
r = new RemoveSuperClass(copyOnt, (OWLClass) newSub, newSup, null);
r.accept((ChangeVisitor) copyOnt);
}
}
else if (axiom instanceof OWLPropertyDomainAxiom) {
OWLPropertyDomainAxiom opd = (OWLPropertyDomainAxiom) axiom;
OWLProperty prop = opd.getProperty();
OWLProperty newProp = null;
if (prop instanceof OWLDataProperty) newProp = copyOnt.getDataProperty(prop.getURI());
else newProp = copyOnt.getObjectProperty(prop.getURI());
OWLDescription desc = opd.getDomain();
OWLDescription newDesc = desc;
if (desc instanceof OWLClass) newDesc = copyOnt.getClass(((OWLClass) desc).getURI());
RemoveDomain rd = new RemoveDomain(copyOnt, newProp, newDesc, null);
rd.accept((ChangeVisitor) copyOnt);
}
else if (axiom instanceof OWLObjectPropertyRangeAxiom) {
OWLObjectPropertyRangeAxiom opd = (OWLObjectPropertyRangeAxiom) axiom;
OWLObjectProperty prop = opd.getProperty();
OWLObjectProperty newProp = copyOnt.getObjectProperty(prop.getURI());
OWLDescription desc = opd.getRange();
OWLDescription newDesc = desc;
if (desc instanceof OWLClass) newDesc = copyOnt.getClass(((OWLClass) desc).getURI());
RemoveObjectPropertyRange ropr = new RemoveObjectPropertyRange(copyOnt, newProp, newDesc, null);
ropr.accept((ChangeVisitor) copyOnt);
}
else if (axiom instanceof OWLObjectPropertyInstance) {
OWLObjectPropertyInstance oop = (OWLObjectPropertyInstance) axiom;
OWLIndividual sub = copyOnt.getIndividual(oop.getSubject().getURI());
OWLObjectProperty prop = copyOnt.getObjectProperty(oop.getProperty().getURI());
OWLIndividual obj = copyOnt.getIndividual(oop.getObject().getURI());
RemoveObjectPropertyInstance ropi = new RemoveObjectPropertyInstance(copyOnt, sub, prop, obj, null);
ropi.accept((ChangeVisitor) copyOnt);
}
else if (axiom instanceof OWLSameIndividualsAxiom) {
OWLSameIndividualsAxiom osi = (OWLSameIndividualsAxiom) axiom;
Set newInd = new HashSet();
for (Iterator it = osi.getIndividuals().iterator(); it.hasNext();) {
newInd.add(copyOnt.getIndividual(((OWLIndividual) it.next()).getURI()));
}
OWLSameIndividualsAxiom copyInd = copyOnt.getOWLDataFactory().getOWLSameIndividualsAxiom(newInd);
RemoveIndividualAxiom ria = new RemoveIndividualAxiom(copyOnt, copyInd, null);
ria.accept((ChangeVisitor) copyOnt);
}
else if (axiom instanceof OWLDifferentIndividualsAxiom) {
OWLDifferentIndividualsAxiom osi = (OWLDifferentIndividualsAxiom) axiom;
Set newInd = new HashSet();
for (Iterator it = osi.getIndividuals().iterator(); it.hasNext();) {
newInd.add(copyOnt.getIndividual(((OWLIndividual) it.next()).getURI()));
}
OWLDifferentIndividualsAxiom copyInd = copyOnt.getOWLDataFactory().getOWLDifferentIndividualsAxiom(newInd);
RemoveIndividualAxiom ria = new RemoveIndividualAxiom(copyOnt, copyInd, null);
ria.accept((ChangeVisitor) copyOnt);
}
//TODO: more removal!
// test if copyOnt has changed
//FIXME: not working when individual obj prop assertions are actually removed
// if (copyOnt.equals(onto)) {
// System.out.println("Ontology hasn't changed after removing axiom "+axiom);
// continue;
// }
// get class in copyOnt
OWLClass cla = null;
if (swoopModel.getSelectedEntity()!=null) cla = copyOnt.getClass(swoopModel.getSelectedEntity().getURI());
// early path termination
boolean earlyTermination = false;
for (Iterator i=satPaths.iterator(); i.hasNext();) {
Set satPath = (HashSet) i.next();
if (satPath.containsAll(currPath)) {
System.out.println("EARLY PATH TERMINATION!");
earlyTermination = true;
break;
}
}
if (!earlyTermination) {
// check if there is a new mups of class
Set newMUPS = new HashSet();
String expl = "";
if (swoopModel.isUseTableau()) {
// use tableau tracing
List explList = this.getTableauSOS(copyOnt, cla);
expl = explList.get(0).toString();
newMUPS = (HashSet) explList.get(1);
}
else {
// use black box
newMUPS = this.getBlackBoxSOS(copyOnt, cla);
}
if (!newMUPS.isEmpty()) {
if (!MUPS.contains(newMUPS)) {
// print explanation for new MUPS
MUPS.add(newMUPS);
explStr.add(expl);
System.out.println("FOUND NEW MUPS - MUPS COUNT: "+MUPS.size());
// recurse!
HSTMUPS(newMUPS, copyOnt, MUPS, explStr, satPaths, currPath);
}
}
else {
satPaths.add(new HashSet(currPath));
}
}
currPath.remove(axiom);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//************************************************************
//Added for Econnections
//************************************************************
protected void renderForeignEntity(OWLEntity e) throws OWLException{
if(e instanceof OWLClass){
print("<b> OWL-ForeignClass:</b> ");
printObject(e);
print("<br><b> ForeignOntology </b> ");
print("<a href=\"" + swoopModel.getSelectedOntology().getForeignEntities().get(e).toString() + "\">" + swoopModel.shortForm(((URI)swoopModel.getSelectedOntology().getForeignEntities().get(e))) + "</a>");
}
if(e instanceof OWLObjectProperty){
if(!((OWLObjectProperty)e).isLink()){
print("<b> OWL-ForeignObjectProperty:</b> ");
printObject(e);}
else{
print("<b> OWL-ForeignLinkProperty:</b> ");
printObject(e);
}
print("<br><b> ForeignOntology </b> ");
print("<a href=\"" + swoopModel.getSelectedOntology().getForeignEntities().get(e).toString() + "\">" + swoopModel.shortForm(((URI)swoopModel.getSelectedOntology().getForeignEntities().get(e))) + "</a>");
}
if(e instanceof OWLDataProperty){
print("<b> OWL-ForeignDatatypeProperty:</b> ");
printObject(e);
print("<br><b> ForeignOntology </b> ");
print("<a href=\"" + swoopModel.getSelectedOntology().getForeignEntities().get(e).toString() + "\">" + swoopModel.shortForm(((URI)swoopModel.getSelectedOntology().getForeignEntities().get(e))) + "</a>");
}
if(e instanceof OWLIndividual){
print("<b> OWL-ForeignIndividual:</b> ");
printObject(e);
print("<br><b> ForeignOntology </b> ");
print("<a href=\"" + swoopModel.getSelectedOntology().getForeignEntities().get(e).toString() + "\">" + swoopModel.shortForm(((URI)swoopModel.getSelectedOntology().getForeignEntities().get(e))) + "</a>");
}
}
//***********************************************************
protected void renderDataProperty(OWLDataProperty prop) throws OWLException {
// check if property is in current ontology or imported
String importedLbl = "";
imported = false;
if (!prop.getOntologies().contains(swoopModel.getSelectedOntology())) {
importedLbl = "Imported ";
imported = true;
}
Iterator it = null;
List notPrinted = new ArrayList();
print("<b>"+importedLbl+"OWL-DatatypeProperty:</b> ");
printObject(prop);
if (importedLbl.length()>0) {
println();
// print("<b>Imported from Ontology(s):</b> ");
// also print where the class is imported from
Iterator ontIter = prop.getOntologies().iterator();
while (ontIter.hasNext()) {
OWLOntology ont = (OWLOntology) ontIter.next();
String ontURI = ont.getURI().toString();
String ontName = ontURI.substring(ontURI.lastIndexOf("/")+1, ontURI.length());
String propXPtrURI = prop.getURI() + XPointers.asDefinedIn + "(" + ontURI + ")";
print("See its definition in Imported Ontology: <a href=\""+escape(propXPtrURI)+"\">" + escape(ontName) + "</a>");
// print("<a href=\""+ontURI+"asDefinedIn("+ontURI+")\">"+className+"</a> ");
println();
}
println();
}
else if (editorEnabled) print(" <font color=\"red\">(<a href=\"<SwitchProp\">Switch</a>)</font>");
if (showDivisions) {
print("<table cellpadding=\"5\"><tr bgcolor=\"#FFF68F\"><FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
}
boolean printedAnn = renderAnnotations(prop);
if (!printedAnn) notPrinted.add("A-ANN");
else if (showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
int notPrintedSize = notPrinted.size();
String title = "<b>Equivalent to:</b>";
if (reasoner.equivalentPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-EQU", title);
if (!printed) notPrinted.add("P-EQU");
}
else {
if (editorEnabled) title += addTitle("P-EQU");
printCollection(reasoner.equivalentPropertiesOf(prop), title);
}
title = "<b>Subproperty of:</b>";
if (reasoner.superPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-SUB", title);
if (!printed) notPrinted.add("P-SUB");
}
else {
if (editorEnabled) title += addTitle("P-SUB");
printCollection(reasoner.superPropertiesOf(prop), title);
}
title = "<b>Superproperty of:</b>";
if (reasoner.subPropertiesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "P-SUP", title);
if (!printed) notPrinted.add("P-SUP");
}
else {
if (editorEnabled) title += addTitle("P-SUP");
printCollection(reasoner.subPropertiesOf(prop), title);
}
if ((notPrinted.size()-notPrintedSize<3) && showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
title = "<b>Has domain:</b>";
Set doms = reasoner.domainsOf(prop);
doms.addAll(prop.getDomains(swoopModel.getSelectedOntology()));
if (doms.size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "C-HASDOM", title);
if (!printed) notPrinted.add("C-HASDOM");
}
else {
if (editorEnabled) title += addTitle("C-HASDOM");
printCollection(doms, title);
}
title = "<b>Has range:</b>";
if (reasoner.rangesOf(prop).size()==0) {
boolean printed = insertAddedChanges(new HashSet(), prop, "C-HASRAN", title);
if (!printed) notPrinted.add("C-HASRAN");
}
else {
if (editorEnabled) title += addTitle("C-HASRAN");
printCollection(reasoner.rangesOf(prop), title);
}
if ((notPrinted.size()-notPrintedSize<2) && showDivisions) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
notPrintedSize = notPrinted.size();
title = "<b>Attributes</b>:";
String OWL = OWLVocabularyAdapter.OWL;
boolean printedAttribs = false;
if (prop.isFunctional(reasoner.getOntologies())) {
printedAttribs = true;
if (editorEnabled) title += addTitle("ATTRIB");
println(title);
OntologyChange isDeleted = isDeleted(prop, "P-FUN");
if (editorEnabled) {
if (isDeleted!=null) {
print("<font color=\"red\"><strike><a href=\""+OWL+"FunctionalProperty\">Functional</a></strike></font>");
addUndo(isDeleted, "Delete", title);
}
else {
print("<a href=\""+OWL+"FunctionalProperty\">Functional</a>");
addDelete(prop, "P-FUN");
}
}
else print("<a href=\""+OWL+"FunctionalProperty\">Functional</a>");
println();
}
// print temporarily added attribute changes
Map added = this.getAdded(prop, "ATTRIB");
if (!added.isEmpty()) {
if (!printedAttribs) {
printedAttribs = true;
if (editorEnabled) title += addTitle("ATTRIB");
println(title);
}
Iterator j = added.entrySet().iterator();
while(j.hasNext()) {
Map.Entry entry = (Map.Entry) j.next();
OWLObject obj = (OWLObject) entry.getKey();
Set changes = (HashSet) entry.getValue();
for (Iterator changeIter = changes.iterator(); changeIter.hasNext(); ) {
OntologyChange change = (OntologyChange) changeIter.next();
print("<font color=\"green\">");
if (change instanceof SetFunctional) print("Functional");
print("</font>");
addUndo(change, "Add", title);
println();
}
}
}
if (swoopModel.getEditorEnabled() && !printedAttribs) notPrinted.add("ATTRIB");
if (showDivisions && printedAttribs) print(HR+"<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE="+fontSize+">");
// rules stuff
if (swoopModel.getEnableRules()) {
RulesExpressivity ruleExpr = swoopModel.getRuleExpr();
Set rules = ruleExpr.getRules(prop);
pw.println("<b> Rules: </b> <br>");
for (Iterator iter = rules.iterator(); iter.hasNext();) {
String ruleDesc = ((RuleValue) iter.next()).getRule().toString();
int ptr;
ptr = ruleDesc.indexOf(">")+1;
String consequent = ruleDesc.substring(ptr,ruleDesc.indexOf("."));
ruleDesc = ruleDesc.substring(0,ptr-2)+".";
ruleDesc = consequent + " <b>:- </b> " + ruleDesc;
ptr = 0;
ruleDesc = " " + ruleDesc;
String hyperRule = ruleDesc;
while ((ptr = ruleDesc.indexOf("(", ptr))>=0) {
String name = ruleDesc.substring(ruleDesc.lastIndexOf(" ", ptr), ptr);
String uri = this.getURIForTerm(name.trim());
hyperRule = hyperRule.replaceAll(name, "<a href=\""+uri+"\">"+name+"</a>");
ptr++;
}
pw.println( hyperRule + "<br>");
}
}
// add unprinted titles at the bottom
addUnprinted(notPrinted);
}
protected void renderDataType(OWLDataType datatype) throws OWLException {
println("<b>OWL-Datatype:</b> " + shortForm(datatype.getURI()) + " ");
}
protected void println() {
pw.println("<br>");
}
public void setEditorEnabled(boolean mode) {
this.editorEnabled = mode;
//if(mode) changes = new ArrayList();
}
private void reset() {
OWLDescHash.clear();
}
public void render(OWLEntity entity, SwoopModel swoopModel, Writer writer) throws RendererException {
changes = swoopModel.getUncommittedChanges();
reset();
displayedEntity = entity;
StringWriter sw = new StringWriter();
PrintWriter buffer = new PrintWriter(sw);
super.render(entity, swoopModel, buffer);
String output = postProcess(sw.getBuffer().toString());
try {
writer.write(output);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Method that handles the Add* operation when the user clicks on the
* corresponding hyperlink in the Concise Format Pane (eg. Add SuperClass)
* It calls the appropriate PopupAdd* Java Class depending on the type of add operation
* @param hLink - code representing type of Add operation
* @return
* @throws OWLException
*/
public List handleAddLink(String hLink) throws OWLException {
OWLOntology ontology = reasoner.getOntology();
// remove the prefixed "<"
if (hLink.startsWith("<")) hLink = hLink.substring(1, hLink.length());
else System.out.println("hyperlink error: "+hLink);
// new rules addition
if ( hLink.equals( "AddRULE" ) ) {
PopupAddRule test = new PopupAddRule( swoopModel, displayedEntity );
test.show();
}
if (hLink.equals("AddA-ANN")) {
// add annotation
PopupAddAnnotation popup = new PopupAddAnnotation(swoopModel, false);
popup.setLocation(200, 200);
popup.show();
return new ArrayList();
}
if (hLink.equals("AddATTRIB")) {
// add property attribute - Functional etc
JList attribList = new JList();
//attribList.setFont(new Font("Tahoma", Font.PLAIN, 10));
List attribs = new ArrayList();
OWLProperty prop = (OWLProperty) swoopModel.getSelectedEntity();
if (!prop.isFunctional(reasoner.getOntologies())) attribs.add("Functional");
if (prop instanceof OWLObjectProperty) {
if (!((OWLObjectProperty) prop).isInverseFunctional(reasoner.getOntologies())) attribs.add("Inverse Functional");
if (!((OWLObjectProperty) prop).isTransitive(reasoner.getOntologies())) attribs.add("Transitive");
if (!((OWLObjectProperty) prop).isSymmetric(reasoner.getOntologies())) attribs.add("Symmetric");
}
if (attribs.size()==0) {
JOptionPane.showMessageDialog(null, "Property already has all possible attributes", "Unable to Add", JOptionPane.INFORMATION_MESSAGE);
return new ArrayList();
}
attribList.setListData(attribs.toArray());
int attr = JOptionPane.showConfirmDialog(
null,
new JScrollPane(attribList),
"Specify Property Attribute:",
JOptionPane.YES_NO_OPTION
);
if (attr==0) {
OntologyChange change = null;
String sel = attribList.getSelectedValue().toString();
if (sel.equals("Functional")) change = new SetFunctional(ontology, prop, true, null);
else if (sel.equals("Inverse Functional")) change = new SetInverseFunctional(ontology, (OWLObjectProperty) prop, true, null);
else if (sel.equals("Transitive")) change = new SetTransitive(ontology, (OWLObjectProperty) prop, true, null);
else if (sel.equals("Symmetric")) change = new SetSymmetric(ontology, (OWLObjectProperty) prop, true, null);
swoopModel.addUncommittedChange(change);
}
return new ArrayList();
}
if (hLink.startsWith("AddC")) {
// popup Add Class Frame
String type = hLink.substring(hLink.indexOf("-")+1, hLink.length());
PopupAddClass popup = new PopupAddClass(reasoner, type, swoopModel);
popup.setLocation(200, 200);
popup.show();
return popup.changes;
}
if (hLink.startsWith("AddP")) {
// popup Add Property Frame
boolean DP = true, OP = true;
if (hLink.startsWith("AddP-INSO")) DP = false;
if (hLink.startsWith("AddP-INSD")) OP = false;
String type = hLink.substring(hLink.indexOf("-")+1, hLink.length());
PopupAddProperty popup = new PopupAddProperty(reasoner, type, swoopModel, DP, OP);
popup.setLocation(200, 200);
popup.show();
return popup.changes;
}
if (hLink.startsWith("AddI-SAM") || hLink.startsWith("AddI-DIF") || hLink.startsWith("AddI-ONE") || hLink.startsWith("AddI-INS")) {
// popup Add Individual Frame
String type = hLink.substring(hLink.indexOf("-")+1, hLink.length());
PopupAddIndividual popup = new PopupAddIndividual(reasoner, type, swoopModel);
popup.setLocation(200, 200);
popup.show();
return popup.changes;
}
if (hLink.startsWith("AddV")) {
// add value for property
String hash = hLink.substring(hLink.indexOf(":")+1, hLink.length());
OWLProperty prop = (OWLProperty) OWLDescHash.get(hash);
//***********************************************************
//changed for Econnections
//***********************************************************
OWLEntity entit = swoopModel.getSelectedEntity();
if(prop instanceof OWLObjectProperty){
if(((OWLObjectProperty)prop).isLink()){
URI u = ((OWLObjectProperty)prop).getLinkTarget();
OWLOntology foreignOnto = swoopModel.getOntology(u);
reasoner.setOntology(foreignOnto);
swoopModel.setSelectedOntology(foreignOnto);
}
}
PopupAddValue popup = new PopupAddValue(reasoner, swoopModel, prop);
popup.setLocation(200, 200);
popup.show();
if(prop instanceof OWLObjectProperty){
if(((OWLObjectProperty)prop).isLink()){
reasoner.setOntology(ontology);
swoopModel.setSelectedOntology(ontology);
swoopModel.setSelectedEntity(entit);
}
}
return popup.changes;
}
return null;
}
public List handlePublishLink(String hLink) throws OWLException {
OWLOntology ontology = reasoner.getOntology();
// parse DELETE hyper-link
int pos1 = hLink.indexOf(":");
int pos2 = hLink.indexOf(":", pos1 + 1);
String hashCode = hLink.substring(pos1 + 1, pos2);
String titleCode = hLink.substring(pos2 + 1, hLink.length());
Object obj = OWLDescHash.get(hashCode);
OWLRule rule = (OWLRule) obj;
if ( titleCode.startsWith( "RULE" ) ) {
//System.out.println( "Deleting Rule" );
//String n3 = swoopModel.getRuleExpr().toN3();
ExternalRuleSubmitter submitter = new ExternalRuleSubmitter( swoopModel, rule );
}
//no changes to return
return null;
}
/**
*
* Returns a list of changes that are required to fufill the requirements of clicking a
* delete link. A delete operation may involve various steps of changes and may also
* cause some other changes to happen. The list will contain all the atomic changes
* required for this operation
*
* @param hLink the link clicked on the editor pane
* @return A list of OntologyChange objects
* @throws OWLException
*/
public List handleDeleteLink(String hLink) throws OWLException {
List changes = new ArrayList();
OWLOntology ontology = reasoner.getOntology();
// parse DELETE hyper-link
int pos1 = hLink.indexOf(":");
int pos2 = hLink.indexOf(":", pos1+1);
String hashCode = hLink.substring(pos1+1, pos2);
String titleCode = hLink.substring(pos2+1, hLink.length());
Object obj = OWLDescHash.get(hashCode);
if (titleCode.equals("P-FUN")) {
// Remove Functional Attribute
// *** Note: Change is effective immediately for property attribute
SetFunctional change = new SetFunctional(ontology, (OWLProperty) obj, false, null);
swoopModel.addUncommittedChange(change);
return new ArrayList();
}
if (titleCode.equals("P-IFUN")) {
// Remove InverseFunctional Attribute
// *** Note: Change is effective immediately for property attribute
SetInverseFunctional change = new SetInverseFunctional(ontology, (OWLObjectProperty) obj, false, null);
swoopModel.addUncommittedChange(change);
return new ArrayList();
}
if (titleCode.equals("P-TRA")) {
// Remove Transitive Attribute
// *** Note: Change is effective immediately for property attribute
SetTransitive change = new SetTransitive(ontology, (OWLObjectProperty) obj, false, null);
swoopModel.addUncommittedChange(change);
return new ArrayList();
}
if (titleCode.equals("P-SYM")) {
// Remove Symmetric Attribute
// *** Note: Change is effective immediately for property attribute
SetSymmetric change = new SetSymmetric(ontology, (OWLObjectProperty) obj, false, null);
swoopModel.addUncommittedChange(change);
return new ArrayList();
}
if (titleCode.equals("A-ANN")) {
// Remove Annotation Instance
OWLEntity currEntity = swoopModel.getSelectedEntity();
if (obj instanceof OWLAnnotationInstance) {
OWLAnnotationInstance oai = (OWLAnnotationInstance) obj;
RemoveAnnotationInstance change = new RemoveAnnotationInstance(ontology, currEntity, oai.getProperty(), oai.getContent(), null);
swoopModel.addUncommittedChange(change);
}
return new ArrayList();
}
if (titleCode.equals("I-SAM") || titleCode.equals("I-DIF")) {
// delete sameAs axiom
Set indSet = new HashSet();
indSet.add((OWLIndividual) displayedEntity);
indSet.add((OWLIndividual) obj);
OWLIndividualAxiom indAxiom = null;
if (titleCode.equals("I-SAM")) indAxiom = ontology.getOWLDataFactory().getOWLSameIndividualsAxiom(indSet);
else indAxiom = ontology.getOWLDataFactory().getOWLDifferentIndividualsAxiom(indSet);
RemoveIndividualAxiom change = new RemoveIndividualAxiom(ontology, indAxiom, null);
changes.add(change);
}
if (titleCode.equals("C-EQU")) {
// delete equivalent class
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
RemoveEquivalentClass change = new RemoveEquivalentClass(ontology, displayedClass, desc, null);
changes.add(change);
}
else {
Iterator descIter = ((Collection) obj).iterator();
while (descIter.hasNext()){
OWLDescription desc = (OWLDescription) descIter.next();
RemoveEquivalentClass change = new RemoveEquivalentClass(ontology, displayedClass, desc, null);
changes.add(change);
}
}
}
else if (titleCode.equals("C-DIS")) {
// delete disjoint class
OWLClass displayedClass = (OWLClass) displayedEntity;
Set disSet = new HashSet();
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
disSet.add(desc);
disSet.add(displayedClass);
}
else {
disSet.add(displayedClass);
disSet.addAll((Collection) obj);
}
OWLDisjointClassesAxiom disAxiom = ontology.getOWLDataFactory().getOWLDisjointClassesAxiom(disSet);
RemoveClassAxiom change = new RemoveClassAxiom(ontology, disAxiom, null);
changes.add(change);
}
else if (titleCode.equals("C-SUB")) {
// delete super-class
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
if (displayedClass.getSuperClasses(ontology).contains(obj)) {
// add RemoveSuperClass change in this case
RemoveSuperClass change = new RemoveSuperClass(ontology, displayedClass, desc, null);
changes.add(change);
}
else {
// remove specific axiom in the other case
OWLSubClassAxiom axiom = ontology.getOWLDataFactory().getOWLSubClassAxiom(displayedClass, desc);
RemoveClassAxiom change2 = new RemoveClassAxiom(ontology, axiom, null);
changes.add(change2);
}
}
else {
Iterator descIter = ((Collection) obj).iterator();
while (descIter.hasNext()){
OWLDescription desc = (OWLDescription) descIter.next();
if (displayedClass.getSuperClasses(ontology).contains(obj)) {
RemoveSuperClass change = new RemoveSuperClass(ontology, displayedClass, desc, null);
changes.add(change);
}
else {
// remove specific axiom if present
OWLSubClassAxiom axiom = ontology.getOWLDataFactory().getOWLSubClassAxiom(displayedClass, desc);
RemoveClassAxiom change2 = new RemoveClassAxiom(ontology, axiom, null);
changes.add(change2);
}
}
}
}
else if (titleCode.equals("C-SUP")) {
// delete super-class
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLClass) {
// super classes can be defined in two ways
// check to see what kind of change needs to be put
OWLClass desc = (OWLClass) obj;
if (desc.getSuperClasses(ontology).contains(displayedClass)) {
RemoveSuperClass change = new RemoveSuperClass(ontology, desc, displayedClass, null);
changes.add(change);
}
else {
// remove specific axiom if present
OWLSubClassAxiom axiom = ontology.getOWLDataFactory().getOWLSubClassAxiom(desc, displayedClass);
RemoveClassAxiom change2 = new RemoveClassAxiom(ontology, axiom, null);
changes.add(change2);
}
}
else {
OWLDescription desc = (OWLDescription) obj;
// remove specific axiom if present
OWLSubClassAxiom axiom = ontology.getOWLDataFactory().getOWLSubClassAxiom(desc, displayedClass);
RemoveClassAxiom change2 = new RemoveClassAxiom(ontology, axiom, null);
changes.add(change2);
}
}
else if (titleCode.equals("C-INT")) {
// delete intersection element
// remove whole intersection and add remaining elements
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
deleteFromBooleanDesc(ontology, displayedClass, desc, OWLAnd.class, changes);
}
else {
Iterator descIter = ((Collection) obj).iterator();
while (descIter.hasNext()){
OWLClass desc = (OWLClass) descIter.next();
deleteFromBooleanDesc(ontology, displayedClass, desc, OWLAnd.class, changes);
}
}
}
else if (titleCode.equals("C-UNI")) {
// delete union element
// remove whole union and add remaining elements
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
deleteFromBooleanDesc(ontology, displayedClass, desc, OWLOr.class, changes);
}
else {
Iterator descIter = ((Collection) obj).iterator();
while (descIter.hasNext()){
OWLClass desc = (OWLClass) descIter.next();
deleteFromBooleanDesc(ontology, displayedClass, desc, OWLOr.class, changes);
}
}
}
else if (titleCode.equals("C-NOT")) {
// delete complement element
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLDescription) {
BooleanElementChange change = new BooleanElementChange(OWLNot.class, "Remove", ontology, displayedClass, (OWLDescription) obj, null);
changes.add(change);
}
}
else if (titleCode.equals("I-ONE")) {
// delete one-of element
OWLClass displayedClass = (OWLClass) displayedEntity;
if (obj instanceof OWLIndividual) {
OWLIndividual desc = (OWLIndividual) obj;
updateEnumerations(ontology, displayedClass, desc, changes);
}
}
else if (titleCode.equals("I-INS")) {
// delete instance
RemoveIndividualClass change = new RemoveIndividualClass(ontology, (OWLIndividual) obj, (OWLDescription) displayedEntity, null);
changes.add(change);
}
else if (titleCode.equals("C-TYP")) {
// delete type
RemoveIndividualClass change = new RemoveIndividualClass(ontology, (OWLIndividual) displayedEntity, (OWLDescription) obj, null);
changes.add(change);
}
else if (titleCode.equals("C-HASDOM")) {
// delete property domain
OWLProperty prop = (OWLProperty) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
RemoveDomain change = new RemoveDomain(ontology, prop, desc, null);
changes.add(change);
}
}
else if (titleCode.equals("P-DOM")) {
// delete property domain
OWLClass cla = (OWLClass) displayedEntity;
if (obj instanceof OWLProperty) {
RemoveDomain change = new RemoveDomain(ontology, (OWLProperty) obj, cla, null);
changes.add(change);
}
}
else if (titleCode.equals("C-HASRAN")) {
// delete property range
// check if datatype or object property
if (displayedEntity instanceof OWLObjectProperty) {
OWLObjectProperty prop = (OWLObjectProperty) displayedEntity;
if (obj instanceof OWLDescription) {
OWLDescription desc = (OWLDescription) obj;
RemoveObjectPropertyRange change = new RemoveObjectPropertyRange(ontology, prop, desc, null);
changes.add(change);
}
}
else {
OWLDataProperty prop = (OWLDataProperty) displayedEntity;
if (obj instanceof OWLDataRange) {
OWLDataRange dran = (OWLDataRange) obj;
RemoveDataPropertyRange change = new RemoveDataPropertyRange(ontology, prop, dran, null);
changes.add(change);
}
}
}
else if (titleCode.equals("P-RAN")) {
// delete property range
OWLClass cla = (OWLClass) displayedEntity;
if (obj instanceof OWLObjectProperty) {
RemoveObjectPropertyRange change = new RemoveObjectPropertyRange(ontology, (OWLObjectProperty) obj, cla, null);
changes.add(change);
}
}
else if (titleCode.equals("P-SUB")) {
// remove super property
if (obj instanceof OWLProperty) {
if (((OWLProperty) displayedEntity).getSuperProperties(ontology).contains(obj)) {
RemoveSuperProperty change = new RemoveSuperProperty(ontology, (OWLProperty) displayedEntity, (OWLProperty) obj, null);
changes.add(change);
}
else {
// remove specific axiom if present
OWLSubPropertyAxiom axiom = ontology.getOWLDataFactory().getOWLSubPropertyAxiom((OWLProperty) displayedEntity, (OWLProperty) obj);
RemovePropertyAxiom change2 = new RemovePropertyAxiom(ontology, axiom, null);
changes.add(change2);
}
}
}
else if (titleCode.equals("P-SUP")) {
// remove sub property
if (obj instanceof OWLProperty) {
if (((OWLProperty) obj).getSuperProperties(ontology).contains(displayedEntity)) {
RemoveSuperProperty change = new RemoveSuperProperty(ontology, (OWLProperty) obj, (OWLProperty) displayedEntity, null);
changes.add(change);
}
else {
// remove specific axiom if present
OWLSubPropertyAxiom axiom = ontology.getOWLDataFactory().getOWLSubPropertyAxiom((OWLProperty) obj, (OWLProperty) displayedEntity);
RemovePropertyAxiom change2 = new RemovePropertyAxiom(ontology, axiom, null);
changes.add(change2);
}
}
}
else if (titleCode.equals("P-EQU")) {
// remove equivalent property
if (obj instanceof OWLProperty) {
Set propSet = new HashSet();
propSet.add((OWLProperty) obj);
propSet.add((OWLProperty) displayedEntity);
OWLEquivalentPropertiesAxiom axiom = ontology.getOWLDataFactory().getOWLEquivalentPropertiesAxiom(propSet);
RemovePropertyAxiom change = new RemovePropertyAxiom(ontology, axiom, null);
changes.add(change);
}
}
else if (titleCode.equals("P-INV")) {
// remove inverse property
if (obj instanceof OWLObjectProperty) {
OWLObjectProperty prop = (OWLObjectProperty) displayedEntity;
OWLObjectProperty inverse = (OWLObjectProperty) obj;
RemoveInverse change = new RemoveInverse(ontology, prop, inverse, null);
changes.add(change);
}
}
else if (titleCode.startsWith(("P-VAL"))) {
// remove property value pair
// also obtain value from hash table
String valueHashKey = titleCode.substring(titleCode.lastIndexOf(":")+1, titleCode.length());
Object value = OWLDescHash.get(valueHashKey);
if (obj instanceof OWLObjectProperty) {
RemoveObjectPropertyInstance change = new RemoveObjectPropertyInstance(ontology, (OWLIndividual) displayedEntity, (OWLObjectProperty) obj, (OWLIndividual) value, null);
changes.add(change);
}
else if (obj instanceof OWLDataProperty) {
RemoveDataPropertyInstance change = new RemoveDataPropertyInstance(ontology, (OWLIndividual) displayedEntity, (OWLDataProperty) obj, (OWLDataValue) value, null);
changes.add(change);
}
}
else if ( titleCode.startsWith( "RULE" ) ) {
System.out.println( "Deleting Rule" );
//String n3 = swoopModel.getRuleExpr().publishRulesToPychinko();
// obj is OWLRule
// go through the rulemap and remove this rule
OWLRule rule = (OWLRule) obj;
//get the rule and its friggin expressivity (exactly why are they bundled together?)
OWLRuleAtom consAtom = (OWLRuleAtom)rule.getConsequents().iterator().next();
OWLObject key = null;
if (consAtom instanceof OWLRuleClassAtom) {
key = ((OWLRuleClassAtom) consAtom).getDescription();
} else {
if (consAtom instanceof OWLRuleDataPropertyAtom) {
key = ((OWLRuleDataPropertyAtom) consAtom).getProperty();
} else {
if (consAtom instanceof OWLRuleObjectPropertyAtom) {
key = ((OWLRuleObjectPropertyAtom) consAtom)
.getProperty();
}
}
}
HashSet rulesSet = (HashSet) swoopModel.getRuleExpr().getRuleMap().get(key);
//find the rule we want to delete
RuleValue rvDelete = null;
Iterator it = rulesSet.iterator();
while (it.hasNext()) {
RuleValue rv = (RuleValue) it.next();
if (rv.getRule().equals(obj)) {
rvDelete = rv;
}
}
rulesSet.remove(rvDelete);
swoopModel.getRuleExpr().getRuleMap().put(key, rulesSet);
}
return changes;
}
/**
* Handle what happens when the reasoner supports explanation, a "Why?" link is displayed
* next to an inference and the user clicks on the link.
* In this case, we call reasoner's explanation tool to display reason
*/
public List handleWhyLink(String hLink) throws Exception {
OWLOntology ontology = reasoner.getOntology();
OWLDataFactory ontDF = ontology.getOWLDataFactory();
// parse WHY hyper-link
int pos1 = hLink.indexOf(":");
int pos2 = hLink.indexOf(":", pos1+1);
String hashCode = hLink.substring(pos1+1, pos2);
String titleCode = hLink.substring(pos2+1, hLink.length());
Object obj = OWLDescHash.get(hashCode);
OWLEntity entity = swoopModel.getSelectedEntity();
// create description of inference
String infSubj = "", infObj = "", infRel = "";
if (entity instanceof OWLNamedObject) {
infSubj = swoopModel.shortForm(((OWLNamedObject) entity).getURI());
// add entity URI to highlightSet in ConciseFormatVisitor
((ConciseFormatVisitor) visitor).highlightMap.put(((OWLNamedObject) entity).getURI(), "<font color=\"green\">");
}
if (obj instanceof OWLNamedObject) {
infObj = swoopModel.shortForm(((OWLNamedObject) obj).getURI());
// add obj URI to highlightSet in ConciseFormatVisitor
((ConciseFormatVisitor) visitor).highlightMap.put(((OWLNamedObject) obj).getURI(), "<font color=\"green\">");
}
OWLDescription satClazz = null;
List restoreChanges = new ArrayList();
Set sos = new HashSet();
if (titleCode.equals("C-SUB")) {
// explanation for why entity subClassOf obj
// check sat. of C ^ ~D
infRel = infSubj + " " + ConciseFormat.SUBSET + " "+ infObj;
Set and = new HashSet();
and.add(entity);
and.add(ontDF.getOWLNot((OWLDescription) obj));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("C-SUP")) {
// check sat. of D ^ ~C
infRel = infObj + " "+ConciseFormat.SUBSET + " "+infSubj;
Set and = new HashSet();
and.add(obj);
and.add(ontDF.getOWLNot((OWLDescription) entity));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("C-EQU")) {
// check sat. of (C ^ ~D) v (~C ^ D)
infRel = infSubj + " "+ConciseFormat.EQUIVALENT + " "+infObj;
Set and1 = new HashSet();
and1.add(entity);
and1.add(ontDF.getOWLNot((OWLDescription) obj));
Set and2 = new HashSet();
and2.add(obj);
and2.add(ontDF.getOWLNot((OWLDescription) entity));
Set or = new HashSet();
or.add(ontDF.getOWLAnd(and1));
or.add(ontDF.getOWLAnd(and2));
satClazz = ontDF.getOWLOr(or);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("C-DIS")) {
// check sat. of C ^ D
infRel = infSubj + " "+ConciseFormat.SUBSET + ConciseFormat.COMPLEMENT + " "+infObj;
Set and = new HashSet();
and.add(obj);
and.add(entity);
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("C-HASDOM")) {
// check sat. of (\exists P. Top ^ ~C)
infRel = infSubj + " rdfs:domain " + infObj;
OWLProperty prop = (OWLProperty) entity;
OWLDescription dom = (OWLDescription) obj;
OWLDescription existsPT = null;
OWLClass thing = ontDF.getOWLThing();
if (prop instanceof OWLDataProperty) existsPT = ontDF.getOWLDataCardinalityAtLeastRestriction((OWLDataProperty) prop, 1);
else existsPT = ontDF.getOWLObjectSomeRestriction((OWLObjectProperty) prop, thing);
Set and = new HashSet();
and.add(existsPT);
and.add(ontDF.getOWLNot(dom));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("P-DOM")) {
// check sat. of (\exists P. Top ^ ~C)
infRel = infObj + " rdfs:domain " + infSubj;
OWLProperty prop = (OWLProperty) obj;
OWLClass dom = (OWLClass) entity;
OWLDescription existsPT = null;
OWLClass thing = ontDF.getOWLThing();
if (prop instanceof OWLDataProperty) existsPT = ontDF.getOWLDataCardinalityAtLeastRestriction((OWLDataProperty) prop, 1);
else existsPT = ontDF.getOWLObjectSomeRestriction((OWLObjectProperty) prop, thing);
Set and = new HashSet();
and.add(existsPT);
and.add(ontDF.getOWLNot(dom));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("C-HASRAN") && entity instanceof OWLObjectProperty) {
// check sat. of (Thing ^ ~(\forall P.C))
infRel = infSubj + " rdfs:range " + infObj;
OWLObjectProperty prop = (OWLObjectProperty) entity;
OWLDescription ran = (OWLDescription) obj;
OWLDescription forallPR = null;
OWLClass thing = ontDF.getOWLThing();
forallPR = ontDF.getOWLObjectAllRestriction(prop, ran);
Set and = new HashSet();
and.add(thing);
and.add(ontDF.getOWLNot(forallPR));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("P-RAN") && obj instanceof OWLObjectProperty) {
// check sat. of (Thing ^ ~(\forall P.C))
infRel = infObj + " rdfs:range " + infSubj;
OWLObjectProperty prop = (OWLObjectProperty) obj;
OWLClass ran = (OWLClass) entity;
OWLDescription forallPR = null;
OWLClass thing = ontDF.getOWLThing();
forallPR = ontDF.getOWLObjectAllRestriction(prop, ran);
Set and = new HashSet();
and.add(thing);
and.add(ontDF.getOWLNot(forallPR));
satClazz = ontDF.getOWLAnd(and);
sos = this.getSOS(ontology, satClazz);
}
else if (titleCode.equals("I-INS")) {
infRel = infObj + " rdf:type " + infSubj;
OWLClass cla = (OWLClass) entity;
OWLIndividual ind = (OWLIndividual) obj;
OWLDescription notC = ontDF.getOWLNot(cla);
// temporarily add assertion to ontology for getting explanation
AddIndividualClass ai = new AddIndividualClass(ontology, ind, notC, null);
ai.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveIndividualClass(ontology, ind, notC, null));
satClazz = notC;
sos = this.getSOS(ontology, satClazz);
// remove type assertion from sos
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
Object axiom = iter.next();
if (axiom instanceof OWLIndividualTypeAssertion) {
OWLIndividualTypeAssertion oit = (OWLIndividualTypeAssertion) axiom;
if (oit.getIndividual().equals(ind) && oit.getType().equals(notC)) {
sos.remove(axiom);
break;
}
}
}
}
else if (titleCode.equals("C-TYP")) {
infRel = infSubj + " rdf:type " + infObj;
OWLDescription cla = (OWLDescription) obj;
OWLIndividual ind = (OWLIndividual) entity;
OWLDescription notC = ontDF.getOWLNot(cla);
// temporarily add assertion to ontology for getting explanation
AddIndividualClass ai = new AddIndividualClass(ontology, ind, notC, null);
ai.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveIndividualClass(ontology, ind, notC, null));
satClazz = notC;
sos = this.getSOS(ontology, satClazz);
// remove type assertion from sos
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
Object axiom = iter.next();
if (axiom instanceof OWLIndividualTypeAssertion) {
OWLIndividualTypeAssertion oit = (OWLIndividualTypeAssertion) axiom;
if (oit.getIndividual().equals(ind) && oit.getType().equals(notC)) {
sos.remove(axiom);
break;
}
}
}
}
else if (titleCode.startsWith(("P-INSO")) && obj instanceof List) {
// also obtain value from hash table
List pvTuple = (List) obj;
OWLIndividual value = (OWLIndividual) pvTuple.get(1);
OWLIndividual ind = (OWLIndividual) entity;
OWLObjectProperty prop = (OWLObjectProperty) pvTuple.get(0);
// \exists R \neg {o}
//TODO: infRel = infSubj + " subClassOf " + infObj;
Set one = new HashSet();
one.add(value);
OWLEnumeration oneOf = ontDF.getOWLEnumeration(one);
OWLDescription negOne = ontDF.getOWLNot(oneOf);
OWLDescription existsNeg = ontDF.getOWLObjectAllRestriction(prop, negOne);
AddIndividualClass ai = new AddIndividualClass(ontology, ind, existsNeg, null);
restoreChanges.add(new RemoveIndividualClass(ontology, ind, existsNeg, null));
ai.accept((ChangeVisitor) ontology);
satClazz = existsNeg;
sos = this.getSOS(ontology, satClazz);
// remove type assertion from sos
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
Object axiom = iter.next();
if (axiom instanceof OWLIndividualTypeAssertion) {
OWLIndividualTypeAssertion oit = (OWLIndividualTypeAssertion) axiom;
if (oit.getIndividual().equals(ind) && oit.getType().equals(existsNeg)) {
sos.remove(axiom);
break;
}
}
}
}
else if (titleCode.startsWith(("I-SAM"))) {
// add different from assertion
infRel = infSubj + " "+ConciseFormat.EQU + " "+infObj;
OWLClass temp1 = ontDF.getOWLClass(new URI("temp1"));
AddEntity ae = new AddEntity(ontology, temp1, null);
ae.accept((ChangeVisitor) ontology);
OWLClass temp2 = ontDF.getOWLClass(new URI("temp2"));
AddEntity ae2 = new AddEntity(ontology, temp2, null);
ae2.accept((ChangeVisitor) ontology);
Set enum1 = new HashSet();
enum1.add((OWLIndividual) displayedEntity);
OWLEnumeration en1 = ontDF.getOWLEnumeration(enum1);
AddEquivalentClass aec = new AddEquivalentClass(ontology, temp1, en1, null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp1, en1, null));
Set enum2 = new HashSet();
enum2.add((OWLIndividual) obj);
OWLEnumeration en2 = ontDF.getOWLEnumeration(enum2);
aec = new AddEquivalentClass(ontology, temp2, en2, null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp2, en2, null));
aec = new AddEquivalentClass(ontology, temp1, ontDF.getOWLNot(temp2), null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp1, ontDF.getOWLNot(temp2), null));
restoreChanges.add(new RemoveEntity(ontology, temp1, null));
restoreChanges.add(new RemoveEntity(ontology, temp2, null));
satClazz = temp1;
sos = this.getSOS(ontology, satClazz);
// remove axioms contains temp1 or temp2
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
if (axiom instanceof OWLEquivalentClassesAxiom) {
OWLEquivalentClassesAxiom equ = (OWLEquivalentClassesAxiom) axiom;
boolean remove = false;
for (Iterator iter2 = equ.getEquivalentClasses().iterator(); iter2.hasNext();) {
OWLDescription desc = (OWLDescription) iter2.next();
if (desc instanceof OWLClass && ( ((OWLClass) desc).getURI().equals(new URI("temp1")) || ((OWLClass) desc).getURI().equals(new URI("temp2")) )) {
remove = true;
break;
}
}
if (remove) sos.remove(axiom);
}
}
}
else if (titleCode.startsWith(("I-DIF"))) {
// add sameAs assertion
infRel = infSubj + " "+ConciseFormat.DISJOINT + " "+infObj;
OWLClass temp1 = ontDF.getOWLClass(new URI("temp1"));
AddEntity ae = new AddEntity(ontology, temp1, null);
ae.accept((ChangeVisitor) ontology);
OWLClass temp2 = ontDF.getOWLClass(new URI("temp2"));
AddEntity ae2 = new AddEntity(ontology, temp2, null);
ae2.accept((ChangeVisitor) ontology);
Set enum1 = new HashSet();
enum1.add((OWLIndividual) displayedEntity);
OWLEnumeration en1 = ontDF.getOWLEnumeration(enum1);
AddEquivalentClass aec = new AddEquivalentClass(ontology, temp1, en1, null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp1, en1, null));
Set enum2 = new HashSet();
enum2.add((OWLIndividual) obj);
OWLEnumeration en2 = ontDF.getOWLEnumeration(enum2);
aec = new AddEquivalentClass(ontology, temp2, en2, null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp2, en2, null));
aec = new AddEquivalentClass(ontology, temp1, temp2, null);
aec.accept((ChangeVisitor) ontology);
restoreChanges.add(new RemoveEquivalentClass(ontology, temp1, temp2, null));
restoreChanges.add(new RemoveEntity(ontology, temp1, null));
restoreChanges.add(new RemoveEntity(ontology, temp2, null));
satClazz = temp1;
sos = this.getSOS(ontology, satClazz);
// remove axioms containing temp1 or temp2
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
Object axiom = iter.next();
if (axiom instanceof OWLEquivalentClassesAxiom) {
OWLEquivalentClassesAxiom equ = (OWLEquivalentClassesAxiom) axiom;
boolean remove = false;
for (Iterator iter2 = equ.getEquivalentClasses().iterator(); iter2.hasNext();) {
OWLDescription desc = (OWLDescription) iter2.next();
if (desc instanceof OWLClass && ( ((OWLClass) desc).getURI().equals(new URI("temp1")) || ((OWLClass) desc).getURI().equals(new URI("temp2")) )) {
remove = true;
break;
}
}
if (remove) sos.remove(axiom);
}
}
}
else {
List sosStr = new ArrayList();
sosStr.add("No explanation support yet for this inference.");
sosStr.add("No explanation support yet for this inference.");
return sosStr;
}
// save current print writer
PrintWriter copy = new PrintWriter(pw);
// create new temp writer to render axioms
StringWriter st = new StringWriter();
PrintWriter buffer = new PrintWriter(st);
setWriter(buffer);
// Note: choice of base below only effects ordering
OWLNamedObject base = null;
if (entity instanceof OWLNamedObject) base = (OWLNamedObject) entity;
else if (obj instanceof OWLNamedObject) base = (OWLNamedObject) obj;
else base = ontDF.getOWLThing();
printExplanationSOS(sos, base, false);
String sosStr1 = st.toString();
sosStr1 = sosStr1.replaceAll("problem", "inference <br><font color=\"green\">"+infRel+"</font>");
// call printing again but turn highlighting on
st = new StringWriter();
buffer = new PrintWriter(st);
setWriter(buffer);
printExplanationSOS(sos, base, true);
String sosStr2 = st.toString();
sosStr2 = sosStr2.replaceAll("problem", "inference <br><font color=\"green\">"+infRel+"</font>");
// restore writer
this.pw = copy;
// restore highlightedSet in visitor to empty
((ConciseFormatVisitor) visitor).highlightMap.clear();
// also restore ontology to initial state if changed
for (Iterator iter = restoreChanges.iterator(); iter.hasNext();) {
OntologyChange res = (OntologyChange) iter.next();
res.accept((ChangeVisitor) ontology);
}
List sosStr = new ArrayList();
sosStr.add(sosStr1);
sosStr.add(sosStr2);
return sosStr;
}
public String getSudokuExplanation(OWLOntology gridOnt, OWLIndividual ind, OWLClass cla) {
try {
OWLOntology ontology = swoopModel.cloneOntology(gridOnt);
ind = ontology.getIndividual(ind.getURI());
cla = ontology.getClass(cla.getURI());
OWLDescription notC = ontology.getOWLDataFactory().getOWLNot(cla);
// temporarily add assertion to ontology for getting explanation
AddIndividualClass ai = new AddIndividualClass(ontology, ind, notC, null);
ai.accept((ChangeVisitor) ontology);
OWLDescription satClazz = notC;
Set sos = this.getSOS(ontology, satClazz);
// remove type assertion from sos
for (Iterator iter = new HashSet(sos).iterator(); iter.hasNext();) {
Object axiom = iter.next();
if (axiom instanceof OWLIndividualTypeAssertion || axiom instanceof OWLSubClassAxiom) {
sos.remove(axiom);
}
}
// create new temp writer to render axioms
StringWriter st = new StringWriter();
PrintWriter buffer = new PrintWriter(st);
setWriter(buffer);
// Note: choice of base below only effects ordering
OWLNamedObject base = null;
if (entity instanceof OWLNamedObject) base = (OWLNamedObject) entity;
else if (cla instanceof OWLNamedObject) base = (OWLNamedObject) cla;
else base = ontology.getOWLDataFactory().getOWLThing();
printExplanationSOS(sos, base, false);
String sosStr = st.toString();
sosStr = sosStr.replaceAll("problem", "inference");
sosStr = "<html><font face=\"Verdana\" SIZE=2>"+sosStr+"</font></html>";
return sosStr;
}
catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
public List handleEditLink( String hLink ) throws OWLException {
List changes = new ArrayList();
OWLOntology ontology = reasoner.getOntology();
// parse EDIT hyper-link
int pos1 = hLink.indexOf(":");
int pos2 = hLink.indexOf(":", pos1 + 1);
String hashCode = hLink.substring(pos1 + 1, pos2);
String titleCode = hLink.substring(pos2 + 1, hLink.length());
Object obj = OWLDescHash.get(hashCode);
//System.out.println( "CODE: " + titleCode );
if ( titleCode.startsWith( "RULE" ) ) {
System.out.println( "\nEDITING RULE\n" );
OWLRule rule = (OWLRule) obj;
PopupAddRule test = new PopupAddRule( swoopModel, rule );
test.show();
}
return changes;
}
/*
* SwoopRenderer method
*
*/
public Component getDisplayComponent( SwoopDisplayPanel panel )
{
if (!(panel instanceof TermsDisplay ))
throw new IllegalArgumentException();
return getEditorPane( this.getContentType(), (TermsDisplay)panel );
}
private void deleteFromBooleanDesc(OWLOntology ontology, OWLClass displayedClass, OWLDescription desc, Class type, List changes) throws OWLException {
BooleanElementChange change = new BooleanElementChange(type, "Remove", ontology, displayedClass, desc, null);
changes.add(change);
}
/** Accepts an ontology, class, individual (changes) ;
* Removes the enumeration on class that contains individual
* Adds a new enumeration without the individual
* Records changes
*/
private void updateEnumerations(OWLOntology ontology, OWLClass displayedClass, OWLIndividual desc, List changes) throws OWLException {
EnumElementChange change = new EnumElementChange("Remove", ontology, displayedClass, desc, null);
changes.add(change);
}
public boolean isEditableText() {
return false;
}
/*
* For debugging purposes: sort axioms in explanation set to explain trace better
*/
private List sortAxioms(URI baseURI, Map LHSmap, Map RHSmap, Set removed, int level) {
List sort = new ArrayList();
try {
for (Iterator iter = LHSmap.keySet().iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
List LHS = (List) LHSmap.get(axiom);
for (Iterator iter2 = LHS.iterator(); iter2.hasNext();) {
OWLNamedObject term = (OWLNamedObject) iter2.next();
if (baseURI==null || term.getURI().equals(baseURI)) {
// match found, add axiom to source, tag removal
if (!removed.contains(axiom)) {
sort.add(axiom);
sortLevelMap.put(axiom, String.valueOf(level));
}
removed.add(axiom);
// and remove from LHS/RHS maps
Map newLHSmap = new HashMap(LHSmap);
newLHSmap.remove(axiom);
Map newRHSmap = new HashMap(RHSmap);
newRHSmap.remove(axiom);
// now check RHS and move baseURI here if possible
List RHS = (List) RHSmap.get(axiom);
URI newBaseURI = null;
if (!RHS.isEmpty()) {
for (int rctr=0; rctr < RHS.size(); rctr++) {
newBaseURI = ((OWLNamedObject) RHS.get(rctr)).getURI();
sort.addAll(sortAxioms(newBaseURI, newLHSmap, newRHSmap, removed, level+1));
}
}
else {
// else move to element in LHS
List modLHS = new ArrayList(LHS);
modLHS.remove(term);
for (int lctr=0; lctr < modLHS.size(); lctr++) {
newBaseURI = ((OWLNamedObject) modLHS.get(lctr)).getURI();
sort.addAll(sortAxioms(newBaseURI, newLHSmap, newRHSmap, removed, level+1));
}
}
}
}
}
// // check for remaining axioms
// for (Iterator iter = removed.iterator(); iter.hasNext();) {
// OWLObject axiom = (OWLObject) iter.next();
// LHSmap.remove(axiom);
// RHSmap.remove(axiom);
// }
// if (LHSmap.keySet().size()>0) {
// sort.addAll(sortAxioms(null, LHSmap, RHSmap, new HashSet()));
// }
}
catch (Exception ex) {
ex.printStackTrace();
}
return sort;
}
/*
* Used to prune explanation set obtained from Pellet
*/
public boolean checkSatisfiability(Set axioms, OWLDescription clazz) {
// create a new ontology with axioms
// and check satisfiability of clazz
boolean sat = false;
try {
OWLOntBuilder ontBuilder = new OWLOntBuilder();
// create new ontology using axioms
// use OWLOntBuilder to build a new ontology given axioms
for (Iterator iter = axioms.iterator(); iter.hasNext();) {
OWLObject obj = (OWLObject) iter.next();
obj.accept(ontBuilder);
}
// if clazz is not in ontology, return true
OWLOntology newOnt = ontBuilder.currentOnt;
if (clazz!=null && clazz instanceof OWLClass && newOnt.getClass(((OWLClass) clazz).getURI())==null) return true;
else if (clazz!=null) {
// get clazz in newOnt
clazz = ontBuilder.visitDescription(clazz);
}
// create new instance of pellet and check sat. of clazz
PelletReasoner newPellet = new PelletReasoner();
newPellet.setOntology(newOnt, false);
if (clazz!=null) sat = newPellet.isConsistent(clazz);
else sat = newPellet.isConsistent();
// TESTING:
// also add clazz to some ind type
// try {
// OWLIndividual dummy = newOnt.getOWLDataFactory().getOWLIndividual(new URI("dummy"));
// AddEntity ae = new AddEntity(newOnt, dummy, null);
// ae.accept((ChangeVisitor) newOnt);
// AddIndividualClass aic = new AddIndividualClass(newOnt, dummy, clazz, null);
// aic.accept((ChangeVisitor) newOnt);
// }
// catch (Exception ex) {
// ex.printStackTrace();
// }
// System.out.println(clazz + "satisfiability: " + sat);
// CorrectedRDFRenderer rdf = new CorrectedRDFRenderer();
// StringWriter w = new StringWriter();
// rdf.renderOntology(newOnt, null, w);
// System.out.println(w.toString());
}
catch (Exception ex) {
System.out.println(ex.getMessage()); // clazz (description) may not be in ontology!
// ex.printStackTrace();
return true;
}
return sat;
}
private boolean checkSatisfiability(OWLOntBuilder ob, OWLDescription clazz) {
// check satisfiability of clazz in ont in ob
OWLOntology newOnt = ob.currentOnt;
boolean sat = false;
try {
if (clazz!=null && clazz instanceof OWLClass && newOnt.getClass(((OWLClass) clazz).getURI())==null) return true;
else if (clazz!=null) {
// get clazz in newOnt
clazz = ob.visitDescription(clazz);
}
// create new instance of pellet and check sat. of clazz
PelletReasoner newPellet = new PelletReasoner();
newPellet.setOntology(newOnt, false);
Timer parseTimer = new Timer("parse time");
parseTimer.start();
if (clazz != null)
sat = newPellet.isConsistent(clazz);
else
sat = newPellet.isConsistent();
parseTimer.stop();
parseTime += parseTimer.getTotal();
}
catch (Throwable ex) {
System.out.println(ex.getMessage()); // clazz (description) may not be in ontology!
ex.printStackTrace();
return true;
}
return sat;
}
/*
* check if entity is in ont, if not, create new entity and return it
*/
private OWLEntity checkEntity(OWLOntology ont, OWLEntity entity) {
try {
AddEntity ae = null;
OWLDataFactory ontDF = ont.getOWLDataFactory();
if (entity instanceof OWLClass) {
if (ont.getClass(entity.getURI())==null) {
entity = ontDF.getOWLClass(entity.getURI());
ae = new AddEntity(ont, entity, null);
}
else entity = ont.getClass(entity.getURI());
}
else if (entity instanceof OWLDataProperty) {
if (ont.getDataProperty(entity.getURI())==null) {
entity = ontDF.getOWLDataProperty(entity.getURI());
ae = new AddEntity(ont, entity, null);
}
else entity = ont.getDataProperty(entity.getURI());
}
else if (entity instanceof OWLObjectProperty) {
if (ont.getObjectProperty(entity.getURI())==null) {
entity = ontDF.getOWLObjectProperty(entity.getURI());
ae = new AddEntity(ont, entity, null);
}
else entity = ont.getObjectProperty(entity.getURI());
}
else if (entity instanceof OWLIndividual) {
if (ont.getIndividual(entity.getURI())==null) {
entity = ontDF.getOWLIndividual(entity.getURI());
ae = new AddEntity(ont, entity, null);
}
else entity = ont.getIndividual(entity.getURI());
}
if (ae!=null) ae.accept((ChangeVisitor) ont);
}
catch (Exception ex) {
ex.printStackTrace();
}
return entity;
}
/*
* Prune the explanation set and print axioms
*/
public void printExplanationSOS(Set explanationSet, OWLNamedObject entity, boolean enableHighlights) {
Set strikeSet = new HashSet();
try {
if(explanationSet != null && !explanationSet.isEmpty()) {
println("<b>Axioms causing the problem:</b>");
// need to sort axioms to explain trace better
Iterator i = explanationSet.iterator();
// create instance of object container to check contents of axiom
OWLObjectContainer owlCont = null;
owlCont = new OWLObjectContainer(entity);
Map LHSmap = new HashMap();
Map RHSmap = new HashMap();
Map objectCount = new HashMap();
while(i.hasNext()) {
OWLObject axiom = (OWLObject) i.next();
owlCont.reset();
// visit axiom
owlCont.visit(axiom);
// get contained objects, LHS and RHS of axiom
List objects = owlCont.getContainedObjects();
List LHS = owlCont.getLHS();
List RHS = owlCont.getRHS();
if (LHS.size()==0 && RHS.size()==0) LHS = objects;
LHSmap.put(axiom, LHS);
RHSmap.put(axiom, RHS);
List total = new ArrayList(LHS);
total.addAll(RHS);
updateCount(objectCount, total);
}
// highlight based on entity count
if (enableHighlights) {
for (Iterator iter=objectCount.keySet().iterator(); iter.hasNext();) {
URI objURI = (URI) iter.next();
String valStr = objectCount.get(objURI).toString();
int val = Integer.parseInt(valStr);
// System.out.println(objURI + ":"+ val);
if (val==1 && !((ConciseFormatVisitor) visitor).highlightMap.containsKey(objURI)) {
((ConciseFormatVisitor) visitor).highlightMap.put(objURI, "<strike><font color=\"red\">");
strikeSet.add(objURI);
}
}
}
// now call sorting method after computing lhs/rhs of axioms
URI baseURI = entity.getURI();
int count = 1;
sortLevelMap = new HashMap(); // reset map which stores links between sorted axioms in their resp level (recursive depth)
do {
List axioms = sortAxioms(baseURI, LHSmap, RHSmap, new HashSet(), 0);
// now print sorted axiom list
for (Iterator iter = axioms.iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
int level = Integer.parseInt(sortLevelMap.get(axiom).toString());
print("<b>" + (count++) + ")</b> ");
for (int ctr=0; ctr<level*2; ctr++) print(" ");
if (level>0) print("|_");
printObject(axiom);
println();
LHSmap.remove(axiom);
RHSmap.remove(axiom);
}
baseURI = null;
}
while ((count-1)<explanationSet.size());
}
print("<hr>");
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
// clear highlight map of all strikes
((ConciseFormatVisitor) visitor).highlightMap.keySet().removeAll(strikeSet);
}
}
/*
* Prune the explanation set and print axioms
*/
public void printRepairSOS(Set explanationSet, OWLNamedObject entity, boolean enableHighlights, RepairFrame repair) {
Set strikeSet = new HashSet();
String insFont = "<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE=3>";
String tab = "_____"; // ";
try {
if(explanationSet != null && !explanationSet.isEmpty()) {
println("<b>Axioms causing the problem:</b>");
// need to sort axioms to explain trace better
Iterator i = explanationSet.iterator();
// create instance of object container to check contents of axiom
OWLObjectContainer owlCont = null;
owlCont = new OWLObjectContainer(entity);
Map LHSmap = new HashMap();
Map RHSmap = new HashMap();
Map objectCount = new HashMap();
while(i.hasNext()) {
OWLObject axiom = (OWLObject) i.next();
owlCont.reset();
// visit axiom
owlCont.visit(axiom);
// get contained objects, LHS and RHS of axiom
List objects = owlCont.getContainedObjects();
List LHS = owlCont.getLHS();
List RHS = owlCont.getRHS();
if (LHS.size()==0 && RHS.size()==0) LHS = objects;
LHSmap.put(axiom, LHS);
RHSmap.put(axiom, RHS);
List total = new ArrayList(LHS);
total.addAll(RHS);
updateCount(objectCount, total);
}
// highlight based on entity count
if (enableHighlights) {
for (Iterator iter=objectCount.keySet().iterator(); iter.hasNext();) {
URI objURI = (URI) iter.next();
String valStr = objectCount.get(objURI).toString();
int val = Integer.parseInt(valStr);
// System.out.println(objURI + ":"+ val);
if (val==1 && !((ConciseFormatVisitor) visitor).highlightMap.containsKey(objURI)) {
((ConciseFormatVisitor) visitor).highlightMap.put(objURI, "<strike><font color=\"red\">");
strikeSet.add(objURI);
}
}
}
// now call sorting method after computing lhs/rhs of axioms
URI baseURI = entity.getURI();
int count = 1;
sortLevelMap = new HashMap(); // reset map which stores links between sorted axioms in their resp level (recursive depth)
print("</b><hr><table border=\"1\">");
print("<tr><td>"+insFont+"<b>Erroneous Axioms</b></td><td>"+insFont+"<b><a href=\":ARITY\">Arity</a></b></td><td>"+insFont+"<b><a href=\":IMPACT\">Impact</a></b></td><td>"+insFont+"<b><a href=\":USAGE\">Usage</a></b></td><td>"+insFont+"<b><a href=\":RANK\">Rank</a></b></td>"+insFont+"<b>Status</b></td></tr>");
do {
List axioms = sortAxioms(baseURI, LHSmap, RHSmap, new HashSet(), 0);
// now print sorted axiom list
for (Iterator iter = axioms.iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
if (repair.keptAxiomSet.contains(axiom)) print("<tr bgcolor=\"C3FDB8\"><td>");
else if (repair.removedAxiomSet.contains(axiom)) print("<tr bgcolor=\"FFDDDD\"><td>");
else print("<tr><td>");
print(insFont);
int level = Integer.parseInt(sortLevelMap.get(axiom).toString());
print("<b>" + (count++) + ")</b> ");
for (int ctr=0; ctr<level*2; ctr++) print(" ");
if (level>0) print("|_");
int arity = ((HashSet) repair.axiomUnsatClaMap.get(axiom)).size();
String color = "FFFFFF";
if (arity==2) color = "FFFF88";
else if (arity==3) color = "FFFF44";
else if (arity>=4) color = "FFFF22";
print("<font size = 3 style=\"BACKGROUND-COLOR:"+color+"\">");
printObject(axiom);
print("</td>");
//
String hash = String.valueOf(repair.axiomUnsatClaMap.get(axiom).hashCode());
repair.objectMap.put(hash, repair.axiomUnsatClaMap.get(axiom));
print("<td>"+insFont+"<a href=\":HASH:Arity:"+hash+"\">"+String.valueOf(arity)+"</a></td>");
int impact = 0;
Set impactSet = new HashSet();
if (repair.axiomSOSMap.containsKey(axiom)) impactSet = (HashSet) repair.axiomSOSMap.get(axiom);
impact = impactSet.size();
hash = String.valueOf(impactSet.hashCode());
repair.objectMap.put(hash, impactSet);
print("<td>"+insFont+"<a href=\":HASH:Impact:"+hash+"\">" + String.valueOf(impact)+"</a></td>");
int usage = ((HashSet) repair.axiomUsageMap.get(axiom)).size();
hash = String.valueOf(repair.axiomUsageMap.get(axiom).hashCode());
repair.objectMap.put(hash, repair.axiomUsageMap.get(axiom));
print("<td>"+insFont+"<a href=\":HASH:Usage:"+hash+"\">" + String.valueOf(usage)+"</a></td>");
String rank = "-";
if (repair.axiomRanksMap.containsKey(axiom)) rank = repair.axiomRanksMap.get(axiom).toString();
print("<td>"+insFont+rank+"</td>");
String rem = "R";
if (repair.removedAxiomSet.contains(axiom)) rem="Undo";
print("<td>"+insFont+"<font color = \"red\">[<a href=\":FORCE:"+axiom.hashCode()+"\">"+rem+"</a>] </font>");
String keep = "K";
if (repair.keptAxiomSet.contains(axiom)) keep = "Undo";
print(insFont+"<font color = \"green\">[<a href =\":BLOCK:"+axiom.hashCode()+"\">"+keep+"</a>] </font></td>");
print("</tr>");
LHSmap.remove(axiom);
RHSmap.remove(axiom);
}
baseURI = null;
}
while ((count-1)<explanationSet.size());
print("</table>");
}
print("<hr>");
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
// clear highlight map of all strikes
((ConciseFormatVisitor) visitor).highlightMap.keySet().removeAll(strikeSet);
}
}
// also used in Why? explanation in Repair Frame :/
public void printRepairSOS(Set explanationSet, OWLNamedObject entity, RepairFrame repair) {
Set strikeSet = new HashSet();
String insFont = "<FONT FACE=\""+swoopModel.getFontFace()+"\" SIZE=3>";
try {
if(explanationSet != null && !explanationSet.isEmpty()) {
println("<b>Axioms causing the problem:</b>");
// need to sort axioms to explain trace better
Iterator i = explanationSet.iterator();
// create instance of object container to check contents of axiom
OWLObjectContainer owlCont = null;
owlCont = new OWLObjectContainer(entity);
Map LHSmap = new HashMap();
Map RHSmap = new HashMap();
Map objectCount = new HashMap();
while(i.hasNext()) {
OWLObject axiom = (OWLObject) i.next();
owlCont.reset();
// visit axiom
owlCont.visit(axiom);
// get contained objects, LHS and RHS of axiom
List objects = owlCont.getContainedObjects();
List LHS = owlCont.getLHS();
List RHS = owlCont.getRHS();
if (LHS.size()==0 && RHS.size()==0) LHS = objects;
LHSmap.put(axiom, LHS);
RHSmap.put(axiom, RHS);
List total = new ArrayList(LHS);
total.addAll(RHS);
updateCount(objectCount, total);
}
// now call sorting method after computing lhs/rhs of axioms
URI baseURI = entity.getURI();
int count = 1;
sortLevelMap = new HashMap(); // reset map which stores links between sorted axioms in their resp level (recursive depth)
do {
List axioms = sortAxioms(baseURI, LHSmap, RHSmap, new HashSet(), 0);
// now print sorted axiom list
for (Iterator iter = axioms.iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
print(insFont);
int level = Integer.parseInt(sortLevelMap.get(axiom).toString());
print("<b>" + (count++) + ")</b> ");
for (int ctr=0; ctr<level*2; ctr++) print(" ");
if (level>0) print("|_");
if (repair.planSolnAxioms[0].contains(axiom)) print("<font color=\"red\"><b>[X]</b></font>");
printObject(axiom);
print("<br>");
LHSmap.remove(axiom);
RHSmap.remove(axiom);
}
baseURI = null;
}
while ((count-1)<explanationSet.size());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
// expand axiom set iteratively
public Set expandAxiomSet(Set axioms, OWLOntology ont, boolean expandMore) {
try {
Set newEntities = new HashSet();
for (Iterator iter = new HashSet(axioms).iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
if (signatureMap.containsKey(axiom)) {
newEntities.addAll((HashSet) signatureMap.get(axiom));
}
else {
Set ents = swoopModel.getAxiomSignature(axiom, ont);
signatureMap.put(axiom, ents);
newEntities.addAll(ents);
}
if (expandMore) {
// expand entity set to include usage entities
for (Iterator iter2 = new HashSet(newEntities).iterator(); iter2.hasNext();) {
Set usage = new HashSet();
OWLEntity ent = (OWLEntity) iter2.next();
// check in local cache first before using OntologyHelper
if (usageMap.containsKey(ent.getURI())) {
usage = (HashSet) usageMap.get(ent.getURI());
}
else {
usage = OntologyHelper.entityUsage(ont, ent);
usageMap.put(ent.getURI(), usage);
}
// only add entities because axioms are returned
for (Iterator it = usage.iterator(); it.hasNext();) {
Object e = it.next();
if (e instanceof OWLEntity) newEntities.add(e);
else if (e instanceof OWLObject) {
if (signatureMap.containsKey(e)) {
newEntities.addAll((HashSet) signatureMap.get(e));
}
else {
Set ents = swoopModel.getAxiomSignature((OWLObject) e, ont);
signatureMap.put(e, ents);
newEntities.addAll(ents);
}
}
}
}
}
}
// get axioms for all newEntities either from local cache or from swoopModel
Set newAxioms = new HashSet();
for (Iterator iter2 = newEntities.iterator(); iter2.hasNext();) {
OWLEntity ent = (OWLEntity) iter2.next();
if (axiomMap.containsKey(ent.getURI())) {
newAxioms.addAll((HashSet) axiomMap.get(ent.getURI()));
}
else {
Set ax = swoopModel.getAxioms(ent, ont);
axiomMap.put(ent.getURI(), ax);
newAxioms.addAll(ax);
}
}
if (axioms.containsAll(newAxioms)) {
return new HashSet();
}
else {
// determine latest axioms
Set before = new HashSet(axioms);
Set latest = new HashSet(axioms);
latest.addAll(newAxioms);
latest.removeAll(before);
// // set a limit on axioms to be added
if (latest.size()>axiomLimit) {
// only let limited entities remain in latest
Set copyLatest = new HashSet(latest);
latest.clear();
for (int ctr = 0; ctr < axiomLimit; ctr++) {
Object ax = copyLatest.iterator().next();
latest.add(ax);
copyLatest.remove(ax);
}
axiomLimit *= 1.25; // slowly increase axiom limit
}
newAxioms = latest;
axioms.addAll(newAxioms);
return newAxioms;
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return new HashSet();
}
/*
* find a single MUPS of an unsatisfiable class using the black box method
*/
public Set getBlackBoxSOS(OWLOntology ont, OWLClass cla) {
// first check if cla is indeed unsatisfiable in ont
try {
PelletReasoner newPellet = new PelletReasoner();
newPellet.setOntology(ont, false);
if (cla!=null && newPellet.isConsistent(cla)) {
System.out.println(swoopModel.shortForm(cla.getURI())+" is satisfiable in "+swoopModel.shortForm(ont.getURI()));
return new HashSet();
}
// else if (cla==null && newPellet.isConsistent()) {
// System.out.println(swoopModel.shortForm(ont.getURI())+" is consistent");
// return new HashSet();
// }
}
catch (Exception ex) {
ex.printStackTrace();
}
Set sos = new HashSet();
axiomLimit = 40;
usageMap.clear();
axiomMap.clear();
signatureMap.clear();
Timer sosTimer = new Timer("find SOS black-box");
if (!swoopModel.findAllMUPS) parseTime = 0;
sosTimer.start();
try {
// add axioms related to class
Set axioms = swoopModel.getAxioms(cla, ont);
axiomMap.put(cla.getURI(), axioms);
OWLOntBuilder ob = new OWLOntBuilder();
ob.addAxiom = true; // add axiom mode set to true
// add all base axioms to testOnt via ob
for (Iterator iter = axioms.iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
axiom.accept(ob);
}
// toggle a variable that considers entity usage while expanding axiom set
boolean expandMore = false;
// add linked references iteratively
while (checkSatisfiability(ob, cla)) {
Set newAxioms = this.expandAxiomSet(axioms, ont, expandMore);
// System.out.println("Size of axioms: "+axioms.size());
// add axioms from latest to testOnt
for (Iterator it = newAxioms.iterator(); it.hasNext();) {
OWLObject axiom = (OWLObject) it.next();
axiom.accept(ob);
}
if (newAxioms.isEmpty() && expandMore) {
System.out.println("ERROR: Could not find axioms responsible for error!");
CorrectedRDFRenderer rdfRend = new CorrectedRDFRenderer();
StringWriter st = new StringWriter();
rdfRend.renderOntology(ob.currentOnt, st);
FileWriter fw = new FileWriter("testSOS.owl");
fw.write(st.toString());
fw.close();
System.out.println("Saved Test Ontology: testSOS.owl");
return sos;
}
else if (newAxioms.isEmpty()) {
expandMore = true;
}
// System.out.println(axioms);
}
// now axioms contains cla unsatisfiable
// remove one axiom at a time and if it turns satisfiable, add it to sos
// System.out.println("Found concept unsatisfiable: #axioms = "+axioms.size());
// fast pruning
List axiomList = new ArrayList(axioms);
int pruneWindow = 10;
if (axiomList.size()>pruneWindow) {
axioms.clear();
int parts = axiomList.size() / pruneWindow;
for (int part=0; part<parts; part++) {
for (int i=part*pruneWindow; i<part*pruneWindow+pruneWindow; i++) {
ob.addAxiom = false;
((OWLObject)axiomList.get(i)).accept(ob);
}
if (checkSatisfiability(ob, cla)) {
for (int i=part*pruneWindow; i<part*pruneWindow+pruneWindow; i++) {
axioms.add(axiomList.get(i));
ob.addAxiom = true;
((OWLObject)axiomList.get(i)).accept(ob);
}
}
}
if (axiomList.size()>parts*pruneWindow) {
// add remaining from list to axioms
for (int i=parts*pruneWindow; i<axiomList.size(); i++) {
axioms.add(axiomList.get(i));
}
}
}
// System.out.println("After pruning axioms quickly: #axioms = "+axioms.size());
// slow pruning
for (Iterator iter = new HashSet(axioms).iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
axioms.remove(axiom);
ob.addAxiom = false;
axiom.accept(ob);
if (checkSatisfiability(ob, cla)) {
sos.add(axiom);
axioms.add(axiom);
ob.addAxiom = true;
axiom.accept(ob);
}
// System.out.println("Size of axioms: "+axioms.size());
}
sosTimer.stop();
if (!swoopModel.findAllMUPS) {
System.out.println(sosTimer);
System.out.println("parse time: "+parseTime);
System.out.println("net time: "+ String.valueOf(sosTimer.getTotal() - parseTime));
netTime = sosTimer.getTotal() - parseTime;
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return sos;
}
/*
* This method is mainly used by the explanations feature
* to obtain the SOS for any OWLDescription
*/
public Set getSOS(OWLOntology ontology, OWLDescription satClazz) {
Set sos = new HashSet();
if (!(satClazz instanceof OWLClass)) {
try {
// if its not an atomic class
// create an atomic class and make it equivalent to the complex class
OWLDataFactory ontDF = ontology.getOWLDataFactory();
OWLClass tempCla = ontDF.getOWLClass(new URI("tempClass"));
AddEntity ae = new AddEntity(ontology, tempCla, null);
ae.accept((ChangeVisitor) ontology);
Set equs = new HashSet();
equs.add(tempCla);
equs.add(satClazz);
OWLEquivalentClassesAxiom equAxiom = ontDF.getOWLEquivalentClassesAxiom(equs);
AddClassAxiom aca = new AddClassAxiom(ontology, equAxiom, null);
aca.accept((ChangeVisitor) ontology);
// get sos for new temp class
if (swoopModel.isUseTableau()) {
List sosExpl = getTableauSOS(ontology, tempCla);
sos = (HashSet) sosExpl.get(1);
}
else {
sos = getBlackBoxSOS(ontology, tempCla);
}
// remove equivalence axiom from sos
sos.remove(equAxiom);
// undo changes made to the ontology
RemoveClassAxiom rec = new RemoveClassAxiom(ontology, equAxiom, null);
rec.accept((ChangeVisitor) ontology);
RemoveEntity re = new RemoveEntity(ontology, tempCla, null);
re.accept((ChangeVisitor) ontology);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
else {
// directly find sos of atomic class
if (swoopModel.isUseTableau()) {
List sosExpl = getTableauSOS(ontology, (OWLClass) satClazz);
return (HashSet) sosExpl.get(1);
}
else return getBlackBoxSOS(ontology, (OWLClass) satClazz);
}
return sos;
}
/*
* For a specific ontology and clazz, use debugging version of
* Pellet to get string explanation and SOS
*/
public List getTableauSOS(OWLOntology ont, OWLDescription clazz) {
List explSOS = new ArrayList();
try {
Reasoner pelletDebug = new Reasoner();
pelletDebug.setOntology(ont);
pelletDebug.getKB().setDoExplanation(true);
pelletDebug.getKB().doDependencyTracking = true;
boolean consistent = true;
Timer timers = new Timer("Pellet Debugging Check");
timers.start();
if (clazz!=null) consistent = pelletDebug.isConsistent(clazz);
else consistent = pelletDebug.isConsistent();
timers.stop();
System.out.println(timers);
if (consistent) {
// no SOS cos ABox is consistent!
System.out.println("No SOS since ABox is consistent");
explSOS.add("No Explanation");
explSOS.add(new HashSet()); // empty SOS
return explSOS;
}
String explanation = ((PelletReasoner) reasoner).parseExplanation(this, pelletDebug.getKB().getExplanation());
Set explanationSet = pelletDebug.getKB().getExplanationSet();
// prune the axioms in case there are additional axioms
Set prunedSet = new HashSet(explanationSet);
for (Iterator iter = explanationSet.iterator(); iter.hasNext();) {
OWLObject axiom = (OWLObject) iter.next();
prunedSet.remove(axiom);
boolean sat = false;
sat = this.checkSatisfiability(prunedSet, clazz);
if (sat) prunedSet.add(axiom);
}
explanationSet = prunedSet;
// end of pruning
explSOS.add(explanation);
explSOS.add(explanationSet);
}
catch (OWLException ex) {
ex.printStackTrace();
}
return explSOS;
}
public void setWriter(Writer w) {
this.pw = (PrintWriter) w;
}
/*
* update count for each entity appearing in an axiom
*/
private void updateCount(Map objectCount, List objects) {
try {
// Set once = new HashSet();
for (Iterator iter = objects.iterator(); iter.hasNext();) {
OWLNamedObject obj = (OWLNamedObject) iter.next();
// if (once.contains(obj.getURI())) continue; ???
int val = 1;
if (objectCount.containsKey(obj.getURI())) {
String valStr = objectCount.get(obj.getURI()).toString();
val = Integer.parseInt(valStr)+1;
}
// once.add(obj.getURI());
objectCount.put(obj.getURI(), String.valueOf(val));
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void setReasoner(SwoopReasoner reas) {
this.reasoner = reas;
}
/*
* run all debugging tests w/ Pellet, RACER and KAON
* IMPORTANT NOTE: TO MAKE THIS WORK CORRECTLY ---
* Select "Debug->Use Black Box to compute MUPS"
* Open required Test Ontology in Swoop
* Select some class in ConciseFormat
* Then click on "Advanced->Run Debug Tests"
*/
public void runDebugTests() throws Exception {
// check anyway
swoopModel.useTableau = false;
swoopModel.setDebugGlass(true);
// Single MUPS
// w/ pellet
String NEWLINE = System.getProperty("line.separator");
String log = "";
// read test cases
OWLOntology ont = swoopModel.getSelectedOntology();
String fname = "testUniversity";
//// String fname = swoopModel.shortForm(ont.getURI());
List testCla = new ArrayList();
BufferedReader in = new BufferedReader(new FileReader(new File(fname+".txt")));
String line = null; //not declared within while loop
while (( line = in.readLine()) != null) {
OWLClass cla = ont.getClass(new URI(line));
if (cla!=null) testCla.add(cla);
}
// for (Iterator iter = swoopModel.getReasoner().equivalentClassesOf(swoopModel.getSelectedOntology().getOWLDataFactory().getOWLNothing()).iterator(); iter.hasNext();) {
// testCla.add(iter.next());
// }
// run tests
// useRACER = false;
// useKAON = false;
// log += runReasonerTest(ont, testCla, "Pellet")+NEWLINE;
//
// useKAON = true;
// log += runReasonerTest(ont, testCla, "KAON2")+NEWLINE;
// useRACER = true;
// useKAON = false;
log += runReasonerTest(ont, testCla, "RACER")+NEWLINE;
// System.out.println(log);
FileWriter fw = new FileWriter(new File(fname+"DebugLog.txt"));
fw.write(log);
fw.close();
System.out.println("DONE: Log File written to "+fname+"DebugLog.txt");
}
private String runReasonerTest(OWLOntology ont, List testCla, String reasStr) throws Exception {
String NEWLINE = System.getProperty("line.separator");
String log = "Reasoner: "+ reasStr + NEWLINE;
log += "Single MUPS"+NEWLINE;
swoopModel.findAllMUPS = false;
for (Iterator iter = testCla.iterator(); iter.hasNext();) {
OWLClass cla = (OWLClass) iter.next();
swoopModel.setSelectedEntity(cla);
log += "| "+cla.getURI().toString() + " | "+netTime + " |"+NEWLINE;
}
log += "All MUPS"+NEWLINE;
swoopModel.findAllMUPS = true;
for (Iterator iter = testCla.iterator(); iter.hasNext();) {
OWLClass cla = (OWLClass) iter.next();
swoopModel.setSelectedEntity(cla);
log += "| "+cla.getURI().toString() + " ("+mupsCount+") | "+netTime + " |"+NEWLINE;
}
System.out.println("--- Tests done for "+reasStr+"----");
return log;
}
public String getURIForTerm(String name) {
try {
for (Iterator iter = swoopModel.getOntologies().iterator(); iter.hasNext();) {
OWLOntology ont = (OWLOntology) iter.next();
Set allURIs = OntologyHelper.allURIs(ont);
for (Iterator iter2 = allURIs.iterator(); iter2.hasNext(); ) {
String uri = iter2.next().toString();
if (uri.endsWith("#"+name) || uri.endsWith("/"+name)) {
return uri;
}
}
}
}
catch (OWLException ex) {
ex.printStackTrace();
}
return "";
}
}