diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java index 6570984ee..5327d3df2 100755 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java @@ -13,7 +13,9 @@ public interface ObjectPropertyDao extends PropertyDao { public abstract List getAllObjectProperties(); - public ObjectProperty getObjectPropertyByURI(String objectPropertyURI); + public ObjectProperty getObjectPropertyByURI(String objectPropertyURI); + + public ObjectProperty getObjectPropertyByURIAndRangeURI(String objectPropertyURI, String rangeURI); public List getObjectPropertiesForObjectPropertyStatements(List /*of ObjectPropertyStatement */ objectPropertyStatements); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java index f12c64858..7e8704582 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java @@ -48,6 +48,11 @@ class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectProperty ObjectProperty newOprop=innerObjectPropertyDao.getObjectPropertyByURI(objectPropertyURI); return (newOprop == null) ? null : new ObjectPropertyFiltering(newOprop, filters); } + + public ObjectProperty getObjectPropertyByURIAndRangeURI(String objectPropertyURI, String rangeURI) { + ObjectProperty newOprop=innerObjectPropertyDao.getObjectPropertyByURIAndRangeURI(objectPropertyURI, rangeURI); + return (newOprop == null) ? null : new ObjectPropertyFiltering(newOprop, filters); + } public List getStatementsUsingObjectProperty(ObjectProperty op) { return ObjectPropertyStatementDaoFiltering.filterAndWrapList(innerObjectPropertyDao.getStatementsUsingObjectProperty(op),filters); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java index af4f50119..870a74f85 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java @@ -28,6 +28,8 @@ import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; @@ -281,6 +283,65 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp getOntModel().leaveCriticalSection(); } } + + public ObjectProperty getObjectPropertyByURIAndRangeURI(String propertyURI, String rangeURI) { + ObjectProperty op = getObjectPropertyByURI(propertyURI); + if (op == null) { + return op; + } + op.setRangeVClassURI(rangeURI); + String propQuery = "PREFIX rdfs: \n" + + "PREFIX config: \n" + + "PREFIX vitro: \n" + + "SELECT ?range ?label ?group ?customForm ?displayLevel ?updateLevel WHERE { \n" + + " ?context config:configContextFor <" + propertyURI + "> . \n" + + " ?context config:qualifiedBy <" + rangeURI + "> . \n" + + " ?context config:hasConfiguration ?configuration . \n" + + " OPTIONAL { ?configuration config:propertyGroup ?group } \n" + + " OPTIONAL { ?configuration config:displayName ?label } \n" + + " OPTIONAL { ?configuration vitro:customEntryFormAnnot ?customForm } \n" + + " OPTIONAL { ?configuration vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel } \n" + + " OPTIONAL { ?configuration vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel } \n" + + "}"; + + Query q = QueryFactory.create(propQuery); + QueryExecution qe = QueryExecutionFactory.create(q, getOntModelSelector().getDisplayModel()); + try { + ResultSet rs = qe.execSelect(); + if (rs.hasNext()) { + QuerySolution qsoln = rs.nextSolution(); + log.debug(qsoln); + Resource groupRes = qsoln.getResource("group"); + if (groupRes != null) { + op.setGroupURI(groupRes.getURI()); + } + Resource displayLevelRes = qsoln.getResource("displayLevel"); + if (displayLevelRes != null) { + op.setHiddenFromDisplayBelowRoleLevel( + BaseResourceBean.RoleLevel.getRoleByUri( + displayLevelRes.getURI())); + } + Resource updateLevelRes = qsoln.getResource("updateLevel"); + if (updateLevelRes != null) { + op.setProhibitedFromUpdateBelowRoleLevel( + BaseResourceBean.RoleLevel.getRoleByUri( + updateLevelRes.getURI())); + } + Literal labelLit = qsoln.getLiteral("label"); + if (labelLit != null) { + op.setDomainPublic(labelLit.getLexicalForm()); + } + Literal customFormLit = qsoln.getLiteral("customForm"); + if (customFormLit != null) { + op.setCustomEntryForm(customFormLit.getLexicalForm()); + } + } + } finally { + qe.close(); + } + return op; + } + public List getObjectPropertiesForObjectPropertyStatements(List objPropertyStmts) { if( objPropertyStmts == null || objPropertyStmts.size() < 1) return new ArrayList(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java index e34797ba7..ddf4b9cdd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java @@ -30,6 +30,7 @@ import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; @@ -706,55 +707,27 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { // make the PropertyInstance objects for (String propertyURI : applicableProperties.keySet()) { - OntProperty op = ontModel - .getOntProperty(propertyURI); - if (op == null) { - continue; - } - String domainURIStr = getURIStr(op.getDomain()); - Resource[] foundRanges = applicableProperties.get(propertyURI); - Resource rangeRes = (foundRanges[0] != null) - ? foundRanges[0] - : (op.getRange() == null && foundRanges[1] != null) - ? foundRanges[1] - : op.getRange(); - PropertyInstance pi = new PropertyInstance(); - if (rangeRes != null) { - String rangeClassURI; - if (rangeRes.isAnon()) { - rangeClassURI = PSEUDO_BNODE_NS + rangeRes.getId() - .toString(); - } else { - rangeClassURI = rangeRes.getURI(); - } - pi.setRangeClassURI(rangeClassURI); - VClass range = getWebappDaoFactory().getVClassDao() - .getVClassByURI(rangeClassURI); - if (range == null) { - range = new VClass(); - range.setURI(rangeClassURI); - range.setName(range.getLocalName()); - } - pi.setRangeClassName(range.getName()); - } else { - pi.setRangeClassURI(OWL.Thing.getURI()); // TODO see above - } - pi.setDomainClassURI(domainURIStr); - VClass domain = getWebappDaoFactory().getVClassDao() - .getVClassByURI(domainURIStr); - if (domain == null) { - domain = new VClass(); - domain.setURI(domainURIStr); - domain.setName(domain.getLocalName()); - } - pi.setDomainClassName(domain.getName()); - pi.setSubjectSide(true); - pi.setPropertyURI(op.getURI()); - pi.setPropertyName(getLabelOrId(op)); // TODO - pi.setRangePublic(getLabelOrId(op)); - pi.setDomainPublic(getLabelOrId(op)); - propInsts.add(pi); - } + OntProperty op = ontModel + .getOntProperty(propertyURI); + if (op == null) { + continue; + } + Resource[] foundRanges = applicableProperties.get(propertyURI); + Resource rangeRes = (foundRanges[0] != null) + ? foundRanges[0] + : (op.getRange() == null && foundRanges[1] != null) + ? foundRanges[1] + : op.getRange(); + propInsts.add(getPropInstForPropertyAndRange(op, rangeRes, applicableProperties)); + List additionalFauxSubpropertyRangeURIs = getAdditionalFauxSubpropertyRangeURIsForPropertyURI(propertyURI); + for (String rangeURI : additionalFauxSubpropertyRangeURIs) { + if (getWebappDaoFactory().getVClassDao().isSubClassOf(rangeURI, rangeRes.getURI())) { + propInsts.add(getPropInstForPropertyAndRange( + op, ResourceFactory.createResource(rangeURI), applicableProperties)); + } + } + } + } finally { ontModel.leaveCriticalSection(); } @@ -762,6 +735,72 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { return propInsts; } + + private PropertyInstance getPropInstForPropertyAndRange(OntProperty op, Resource rangeRes, + Map applicableProperties) { + PropertyInstance pi = new PropertyInstance(); + String domainURIStr = getURIStr(op.getDomain()); + if (rangeRes != null) { + String rangeClassURI; + if (rangeRes.isAnon()) { + rangeClassURI = PSEUDO_BNODE_NS + rangeRes.getId() + .toString(); + } else { + rangeClassURI = rangeRes.getURI(); + } + pi.setRangeClassURI(rangeClassURI); + VClass range = getWebappDaoFactory().getVClassDao() + .getVClassByURI(rangeClassURI); + if (range == null) { + range = new VClass(); + range.setURI(rangeClassURI); + range.setName(range.getLocalName()); + } + pi.setRangeClassName(range.getName()); + } else { + pi.setRangeClassURI(OWL.Thing.getURI()); // TODO see above + } + pi.setDomainClassURI(domainURIStr); + VClass domain = getWebappDaoFactory().getVClassDao() + .getVClassByURI(domainURIStr); + if (domain == null) { + domain = new VClass(); + domain.setURI(domainURIStr); + domain.setName(domain.getLocalName()); + } + pi.setDomainClassName(domain.getName()); + pi.setSubjectSide(true); + pi.setPropertyURI(op.getURI()); + pi.setPropertyName(getLabelOrId(op)); // TODO + pi.setRangePublic(getLabelOrId(op)); + pi.setDomainPublic(getLabelOrId(op)); + return pi; + } + + private List getAdditionalFauxSubpropertyRangeURIsForPropertyURI(String propertyURI) { + List rangeURIs = new ArrayList(); + String propQuery = "PREFIX rdfs: \n" + + "PREFIX config: \n" + + "PREFIX vitro: \n" + + "SELECT ?range WHERE { \n" + + " ?context config:configContextFor <" + propertyURI + "> . \n" + + " ?context config:qualifiedBy ?range . \n" + + "}"; + + Query q = QueryFactory.create(propQuery); + QueryExecution qe = QueryExecutionFactory.create(q, getOntModelSelector().getDisplayModel()); + try { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + QuerySolution qsoln = rs.nextSolution(); + Resource rangeRes = qsoln.getResource("range"); + rangeURIs.add(rangeRes.getURI()); + } + } finally { + qe.close(); + } + return rangeURIs; + } private String getURIStr(Resource res) { String URIStr; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SimpleOntModelSelector.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SimpleOntModelSelector.java index f3d150ac3..562b45f2b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SimpleOntModelSelector.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SimpleOntModelSelector.java @@ -47,6 +47,7 @@ public class SimpleOntModelSelector implements OntModelSelector { this.applicationMetadataModel = ontModel; this.tboxModel = ontModel; this.userAccountsModel = ontModel; + this.displayModel = ontModel; } public void setABoxModel(OntModel m) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java index 58dd2cf92..b7e1f1438 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java @@ -183,7 +183,7 @@ public class GroupedPropertyList extends BaseTemplateModel { if (pi != null) { if (!alreadyOnObjectPropertyList( populatedObjectPropertyList, pi)) { - addObjectPropertyToPropertyList(pi.getPropertyURI(), + addObjectPropertyToPropertyList(pi.getPropertyURI(), pi.getRangeClassURI(), propertyList); } } else { @@ -199,7 +199,7 @@ public class GroupedPropertyList extends BaseTemplateModel { // constitute a special case (i.e., included in piDao.getAllPossiblePropInstForIndividual()). for (String propertyUri : VITRO_PROPS_TO_ADD_TO_LIST) { if (!alreadyOnPropertyList(propertyList, propertyUri)) { - addObjectPropertyToPropertyList(propertyUri, propertyList); + addObjectPropertyToPropertyList(propertyUri, null, propertyList); } } } @@ -217,10 +217,10 @@ public class GroupedPropertyList extends BaseTemplateModel { return false; } - private void addObjectPropertyToPropertyList(String propertyUri, + private void addObjectPropertyToPropertyList(String propertyUri, String rangeUri, List propertyList) { ObjectPropertyDao opDao = wdf.getObjectPropertyDao(); - ObjectProperty op = opDao.getObjectPropertyByURI(propertyUri); + ObjectProperty op = opDao.getObjectPropertyByURIAndRangeURI(propertyUri, rangeUri); if (op == null) { log.error("ObjectProperty op returned null from opDao.getObjectPropertyByURI(" + propertyUri + ")"); } else if (op.getURI() == null) { diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java index 37a0428f5..8bcdf87ef 100644 --- a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java +++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java @@ -65,6 +65,11 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao { } return opMap.get(objectPropertyURI); } + + @Override + public ObjectProperty getObjectPropertyByURIAndRangeURI(String objectPropertyURI, String rangeURI) { + return getObjectPropertyByURI(objectPropertyURI); + } @Override public String getCustomListViewConfigFileName(ObjectProperty objectProperty) {