From 89c662734062a174e0fd645ffe6fc4afb228ac59 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Mon, 2 Mar 2015 13:23:28 -0500 Subject: [PATCH] VIVO-946 VIVO-984 Hack out a way of properly filtering faux properties. --- .../vitro/webapp/beans/Individual.java | 7 ++ .../vitro/webapp/beans/IndividualImpl.java | 6 ++ .../dao/ObjectPropertyStatementDao.java | 19 +++- .../dao/filtering/IndividualFiltering.java | 10 ++ .../ObjectPropertyStatementDaoFiltering.java | 23 ++-- .../vitro/webapp/dao/jena/IndividualJena.java | 6 +- .../vitro/webapp/dao/jena/IndividualSDB.java | 4 + .../jena/ObjectPropertyStatementDaoJena.java | 101 ++++++++++++++++++ .../vitro/webapp/beans/IndividualStub.java | 6 ++ .../dao/ObjectPropertyStatementDaoStub.java | 11 +- 10 files changed, 180 insertions(+), 13 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java index c27169c04..2a91220aa 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java @@ -104,4 +104,11 @@ public interface Individual extends ResourceBean, Comparable { String getSearchSnippet(); void setSearchSnippet( String snippet ); + + /** + * This is crap. It was put in so IndividualFiltering could filter object properties properly, + * but what we really need is either: filters have a reference to a webappDaoFactory, or + * all ObjectPropertyStatements are resolved when they are created. See VIVO-946 and VIVO-984. + */ + void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java index 8e2a95842..2c6ffbe54 100755 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java @@ -345,4 +345,10 @@ public class IndividualImpl extends BaseResourceBean implements Individual, Comp public boolean hasThumb() { return getThumbUrl() != null && ! getThumbUrl().isEmpty(); } + + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + // No webappDaoFactory, so nothing to do. + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java index 7f750e7f4..7a18d6ea3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java @@ -45,6 +45,23 @@ public interface ObjectPropertyStatementDao { String rangeUri, String queryString, Set constructQueryStrings, String sortDirection); - + /** + * Inspect the elements of the statement to see whether it qualifies as a + * faux property. + * + * That is, is there a faux property definition, such that + *
    + *
  • The property URI of this statement is the base URI of the faux + * property
  • + *
  • One of the VClasses of the subject of this statement is the domain of + * the faux property
  • + *
  • One of the VClasses of the object of this statement is the range of + * the faux property
  • + *
+ * + * If that is so, then set the domain and range (and the domainURI and + * rangeURI) of the property of this statement to match the faux property. + */ + void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java index c33a9a16c..4931eb433 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java @@ -185,6 +185,9 @@ public class IndividualFiltering implements Individual { if (opStmts == null) { return Collections.emptyList(); } + for(ObjectPropertyStatement opStmt: opStmts) { + _innerIndividual.resolveAsFauxPropertyStatement(opStmt); + } ArrayList filtered = new ArrayList(); Filter.filter(opStmts, _filters.getObjectPropertyStatementFilter(), filtered); return filtered; @@ -557,4 +560,11 @@ public class IndividualFiltering implements Individual { public boolean hasThumb() { return _innerIndividual.hasThumb(); } + + + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + _innerIndividual.resolveAsFauxPropertyStatement(stmt); + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java index 9c77892e5..3d7b7e980 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java @@ -20,7 +20,6 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec final ObjectPropertyStatementDao innerObjectPropertyStatementDao; final VitroFilters filters; - public ObjectPropertyStatementDaoFiltering( ObjectPropertyStatementDao objectPropertyStatementDao, VitroFilters filters) { @@ -36,8 +35,11 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec } - protected static List filterAndWrapList(List list, VitroFilters filters){ - if( ( list ) != null ){ + private List filterAndWrapList(List list){ + if( ( list ) != null ){ + for (ObjectPropertyStatement stmt: list) { + innerObjectPropertyStatementDao.resolveAsFauxPropertyStatement(stmt); + } ArrayList ctemp = new ArrayList(); Filter.filter(list,filters.getObjectPropertyStatementFilter(),ctemp); @@ -58,25 +60,25 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec if( ind == null ) return null; else{ - ind.setObjectPropertyStatements( filterAndWrapList( ind.getObjectPropertyStatements(), filters) ); + ind.setObjectPropertyStatements( filterAndWrapList( ind.getObjectPropertyStatements()) ); return ind; } } @Override public List getObjectPropertyStatements(ObjectProperty objectProperty) { - return filterAndWrapList( innerObjectPropertyStatementDao.getObjectPropertyStatements(objectProperty), filters ); + return filterAndWrapList( innerObjectPropertyStatementDao.getObjectPropertyStatements(objectProperty) ); } @Override public List getObjectPropertyStatements(ObjectProperty objectProperty, int startIndex, int endIndex) { - return filterAndWrapList( innerObjectPropertyStatementDao.getObjectPropertyStatements(objectProperty, startIndex, endIndex) ,filters); + return filterAndWrapList( innerObjectPropertyStatementDao.getObjectPropertyStatements(objectProperty, startIndex, endIndex)); } @Override public List getObjectPropertyStatements( ObjectPropertyStatement objPropertyStmt) { - return filterAndWrapList(innerObjectPropertyStatementDao.getObjectPropertyStatements(objPropertyStmt), filters); + return filterAndWrapList(innerObjectPropertyStatementDao.getObjectPropertyStatements(objPropertyStmt)); } @Override @@ -117,7 +119,7 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec List stmtList = new ArrayList(stmtsToData.keySet()); // Apply the filters to the list of statements - List filteredStatements = filterAndWrapList(stmtList, filters); + List filteredStatements = filterAndWrapList(stmtList); // Get the data associated with the filtered statements out of the map List> filteredData = new ArrayList>(filteredStatements.size()); @@ -139,6 +141,9 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec } - + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + innerObjectPropertyStatementDao.resolveAsFauxPropertyStatement(stmt); + } } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java index 3fa488fef..17d78eb5d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java @@ -616,6 +616,10 @@ public class IndividualJena extends IndividualImpl implements Individual { log.error(e, e); } } - + + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatement(stmt); + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java index 81e3fe9d5..f76cb8775 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java @@ -1087,5 +1087,9 @@ public class IndividualSDB extends IndividualImpl implements Individual { } } + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatement(stmt); + } } 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 44bedbdd2..7ecb92dc0 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 @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import org.apache.commons.lang.StringUtils; @@ -39,10 +40,12 @@ import com.hp.hpl.jena.sparql.resultset.ResultSetMem; import com.hp.hpl.jena.util.iterator.ClosableIterator; import com.hp.hpl.jena.vocabulary.OWL; +import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatementImpl; +import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.IndividualUpdateEvent; @@ -551,4 +554,102 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } } + + /** + * If this statement qualifies as a faux property, set the range and domain + * accordingly. + */ + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + if (stmt == null) { + return; + } + + ObjectProperty prop = obtainObjectPropertyFromStatement(stmt); + if (prop == null) { + return; + } + + List fauxProps = getWebappDaoFactory() + .getFauxPropertyDao() + .getFauxPropertiesForBaseUri(prop.getURI()); + if (fauxProps.isEmpty()) { + return; + } + + Individual subject = obtainSubjectFromStatement(stmt); + if (subject == null) { + return; + } + + Individual object = obtainObjectFromStatement(stmt); + if (object == null) { + return; + } + + List subjectTypes = subject.getVClasses(); + List objectTypes = object.getVClasses(); + 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()); + return; + } + } + } + + private ObjectProperty obtainObjectPropertyFromStatement( + ObjectPropertyStatement stmt) { + ObjectProperty prop = stmt.getProperty(); + if (prop != null) { + return prop; + } + String propertyURI = stmt.getPropertyURI(); + if (propertyURI == null) { + return null; + } + return getWebappDaoFactory().getObjectPropertyDao() + .getObjectPropertyByURI(propertyURI); + } + + private Individual obtainSubjectFromStatement(ObjectPropertyStatement stmt) { + Individual subject = stmt.getSubject(); + if (subject != null) { + return subject; + } + String subjectURI = stmt.getSubjectURI(); + if (subjectURI == null) { + return null; + } + return getWebappDaoFactory().getIndividualDao().getIndividualByURI( + subjectURI); + } + + private Individual obtainObjectFromStatement(ObjectPropertyStatement stmt) { + Individual object = stmt.getObject(); + if (object != null) { + return object; + } + String objectURI = stmt.getObjectURI(); + if (objectURI == null) { + return null; + } + return getWebappDaoFactory().getIndividualDao().getIndividualByURI( + objectURI); + } + + private VClass selectType(List types, String uri) { + for (VClass type : types) { + if (Objects.equals(type.getURI(), uri)) { + return type; + } + } + return null; + } + } diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/beans/IndividualStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/beans/IndividualStub.java index 2a76fb592..f13789d1c 100644 --- a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/beans/IndividualStub.java +++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/beans/IndividualStub.java @@ -208,6 +208,11 @@ public class IndividualStub implements Individual { return new ArrayList(vClasses); } + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + // Nothing to do: no associated webappDaoFactory + } + // ---------------------------------------------------------------------- // Un-implemented methods // ---------------------------------------------------------------------- @@ -501,4 +506,5 @@ public class IndividualStub implements Individual { "IndividualStub.setRdfsLabel() not implemented."); } + } \ No newline at end of file diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDaoStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDaoStub.java index 4144631e9..ad8fb408e 100644 --- a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDaoStub.java +++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDaoStub.java @@ -216,8 +216,9 @@ public class ObjectPropertyStatementDaoStub implements @Override public List> getObjectPropertyStatementsForIndividualByProperty( - String subjectUri, String propertyUri, String objectKey, String domainUri, String rangeUri, - String query, Set constructQueries, String sortDir) { + String subjectUri, String propertyUri, String objectKey, + String domainUri, String rangeUri, String query, + Set constructQueries, String sortDir) { throw new RuntimeException( "ObjectPropertyStatementDaoStub.getObjectPropertyStatementsForIndividualByProperty() not implemented."); } @@ -229,4 +230,10 @@ public class ObjectPropertyStatementDaoStub implements "ObjectPropertyStatementDaoStub.getMostSpecificTypesInClassgroupsForIndividual() not implemented."); } + @Override + public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { + throw new RuntimeException( + "ObjectPropertyStatementDaoStub.resolveAsFauxPropertyStatement() not implemented."); + } + }