diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java index bff157dac..e037dc339 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java @@ -565,12 +565,14 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } Map> fauxPropMap = new HashMap>(); - Map> subjectTypeMap = new HashMap>(); - Map> objectTypeMap = new HashMap>(); + Map vclassTypeMap = new HashMap(); + Map indVClassURIMap = new HashMap(); + Map> superClassMap = new HashMap>(); for (ObjectPropertyStatement stmt : list) { ObjectProperty prop = obtainObjectPropertyFromStatement(stmt); if (prop != null) { + FauxProperty useThisFaux = null; List fauxProps = fauxPropMap.get(prop.getURI()); if (fauxProps == null) { fauxProps = getWebappDaoFactory() @@ -581,47 +583,93 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } if (fauxProps != null && !fauxProps.isEmpty()) { - List subjectTypes = null; - List objectTypes = null; + String domainVClassURI = indVClassURIMap.get(stmt.getSubjectURI()); + String rangeVClassURI = indVClassURIMap.get(stmt.getObjectURI()); - if (stmt.getSubjectURI() != null) { - subjectTypes = subjectTypeMap.get(stmt.getSubjectURI()); - } - - if (stmt.getObjectURI() != null) { - objectTypes = objectTypeMap.get(stmt.getObjectURI()); - } - - if (subjectTypes == null) { - Individual subject = obtainSubjectFromStatement(stmt); + if (domainVClassURI == null) { + Individual subject = stmt.getSubject(); if (subject != null) { - subjectTypes = subject.getVClasses(); - subjectTypeMap.put(stmt.getSubjectURI(), subjectTypes); + domainVClassURI = subject.getVClassURI(); + indVClassURIMap.put(subject.getURI(), domainVClassURI); } } - if (objectTypes == null) { - Individual object = obtainObjectFromStatement(stmt); + if (rangeVClassURI == null) { + Individual object = stmt.getObject(); if (object != null) { - objectTypes = object.getVClasses(); - objectTypeMap.put(stmt.getObjectURI(), objectTypes); + rangeVClassURI = object.getVClassURI(); + indVClassURIMap.put(object.getURI(), rangeVClassURI); } } - if (subjectTypes != null && objectTypes != null) { + if (domainVClassURI != null && rangeVClassURI != null) { for (FauxProperty fauxProp : fauxProps) { - VClass subjectType = selectType(subjectTypes, fauxProp.getDomainURI()); - VClass objectType = selectType(objectTypes, fauxProp.getRangeURI()); - - if (subjectType != null && objectType != null) { - prop.setDomainVClass(subjectType); - prop.setDomainVClassURI(subjectType.getURI()); - prop.setRangeVClass(objectType); - prop.setRangeVClassURI(objectType.getURI()); + if (domainVClassURI.equals(fauxProp.getDomainVClassURI()) && + rangeVClassURI.equals(fauxProp.getRangeVClassURI())) { + useThisFaux = fauxProp; break; } } } + + if (useThisFaux == null) { + List domainSuperClasses = superClassMap.get(domainVClassURI); + List rangeSuperClasses = superClassMap.get(rangeVClassURI); + + if (domainSuperClasses == null) { + domainSuperClasses = getWebappDaoFactory().getVClassDao().getAllSuperClassURIs(domainVClassURI); + if (!domainSuperClasses.contains(domainVClassURI)) { + domainSuperClasses.add(domainVClassURI); + } + superClassMap.put(domainVClassURI, domainSuperClasses); + } + + if (rangeSuperClasses == null) { + rangeSuperClasses = getWebappDaoFactory().getVClassDao().getAllSuperClassURIs(rangeVClassURI); + if (!rangeSuperClasses.contains(rangeVClassURI)) { + rangeSuperClasses.add(rangeVClassURI); + } + superClassMap.put(rangeVClassURI, rangeSuperClasses); + } + + if (domainSuperClasses != null && domainSuperClasses.size() > 0) { + if (rangeSuperClasses != null && rangeSuperClasses.size() > 0) { + for (FauxProperty fauxProp : fauxProps) { + if (domainSuperClasses.contains(fauxProp.getDomainVClassURI()) && + rangeSuperClasses.contains(fauxProp.getRangeVClassURI())) { + useThisFaux = fauxProp; + break; + } + } + } + } + } + } + + if (useThisFaux != null) { + String fauxDomainVClassURI = useThisFaux.getDomainVClassURI(); + VClass fauxDomainVClass = vclassTypeMap.get(fauxDomainVClassURI); + if (fauxDomainVClass == null) { + fauxDomainVClass = getWebappDaoFactory().getVClassDao().getVClassByURI(fauxDomainVClassURI); + vclassTypeMap.put(fauxDomainVClassURI, fauxDomainVClass); + } + + String fauxRangeVClassURI = useThisFaux.getRangeVClassURI(); + VClass fauxRangeVClass = vclassTypeMap.get(fauxRangeVClassURI); + if (fauxRangeVClass == null) { + fauxRangeVClass = getWebappDaoFactory().getVClassDao().getVClassByURI(fauxRangeVClassURI); + vclassTypeMap.put(fauxRangeVClassURI, fauxRangeVClass); + } + + if (fauxDomainVClass != null && fauxDomainVClassURI != null) { + prop.setDomainVClass(fauxDomainVClass); + prop.setDomainVClassURI(fauxDomainVClassURI); + } + + if (fauxRangeVClass != null && fauxRangeVClassURI != null) { + prop.setRangeVClass(fauxRangeVClass); + prop.setRangeVClassURI(fauxRangeVClassURI); + } } } }