diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index 585344575..b6d9353aa 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -12,6 +12,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.ontology.AnnotationProperty; +import com.hp.hpl.jena.ontology.ConversionException; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; @@ -155,7 +156,7 @@ public class SimpleReasoner extends StatementListener { } catch (Exception e) { // don't stop the edit if there's an exception - log.error("Exception while computing inferences: ",e); + log.error("Exception while computing inferences: " + e.getMessage()); } } @@ -356,8 +357,14 @@ public class SimpleReasoner extends StatementListener { cls = tboxModel.getOntClass(stmt.getObject().asResource().getURI()); if (cls != null) { - List parents = (cls.listSuperClasses(false)).toList(); - parents.addAll((cls.listEquivalentClasses()).toList()); + List parents = null; + try { + parents = (cls.listSuperClasses(false)).toList(); + parents.addAll((cls.listEquivalentClasses()).toList()); + } catch (ConversionException ce) { + parents = getParents(cls,tboxModel); + } + Iterator parentIt = parents.iterator(); if (parentIt.hasNext()) { @@ -1252,7 +1259,42 @@ public class SimpleReasoner extends StatementListener { return; } + + + protected List getParents(OntClass cls, OntModel tboxModel) { + List parents = new ArrayList(); + + tboxModel.enterCriticalSection(Lock.READ); + try { + StmtIterator iter = tboxModel.listStatements(cls, RDFS.subClassOf, (RDFNode) null); + while (iter.hasNext()) { + Statement stmt = iter.next(); + if (!stmt.getObject().isAnon() && stmt.getObject().canAs(OntClass.class)) { + if (!parents.contains(stmt.getObject().as(OntClass.class))) { + parents.add(stmt.getObject().as(OntClass.class)); + } + } + } + + iter = tboxModel.listStatements(cls, OWL.equivalentClass, (RDFNode) null); + while (iter.hasNext()) { + Statement stmt = iter.next(); + if (!stmt.getObject().isAnon() && stmt.getObject().canAs(OntClass.class)) { + if (!parents.contains(stmt.getObject().as(OntClass.class))) { + parents.add(stmt.getObject().as(OntClass.class)); + } + } + } + } catch (Exception e) { + log.error("problem computing type inferences for: " + cls.getURI() + e.getMessage()); + } finally { + tboxModel.leaveCriticalSection(); + } + + return parents; + } + // system-configured reasoning modules (plugins) protected boolean isInterestedInRemovedStatement(Statement stmt) {