From 54f43f56d3a80195cf370e325000d98b6aca54ac Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Thu, 20 Jun 2013 12:43:53 -0400 Subject: [PATCH] ongoing work on VIVO-60 application ontology support for property/class combinations --- .../VTwo/EditConfigurationUtils.java | 16 +++++++++++++- .../IndividualsViaObjectPropetyOptions.java | 18 ++++++++++++++++ .../DefaultObjectPropertyFormGenerator.java | 10 ++++----- .../EditRequestDispatchController.java | 19 +++++++++++++++-- ...ApplicationConfigurationOntologyUtils.java | 2 ++ .../edit/EditConfigurationTemplateModel.java | 21 +++++++++++++++---- 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java index dc7d07b74..45c5deb58 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java @@ -21,6 +21,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; +import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; @@ -57,6 +58,10 @@ public class EditConfigurationUtils { return vreq.getParameter("rangeUri"); } + public static VClass getRangeVClass(VitroRequest vreq) { + return vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(getRangeUri(vreq)); + } + //get individual public static Individual getSubjectIndividual(VitroRequest vreq) { @@ -93,7 +98,8 @@ public class EditConfigurationUtils { public static ObjectProperty getObjectProperty(VitroRequest vreq) { //gets the predicate uri from the request String predicateUri = getPredicateUri(vreq); - return getObjectPropertyForPredicate(vreq, predicateUri); + String rangeUri = getRangeUri(vreq); + return getObjectPropertyForPredicate(vreq, predicateUri, rangeUri); } public static DataProperty getDataProperty(VitroRequest vreq) { @@ -102,8 +108,16 @@ public class EditConfigurationUtils { } public static ObjectProperty getObjectPropertyForPredicate(VitroRequest vreq, String predicateUri) { + return getObjectPropertyForPredicate(vreq, predicateUri, null); + } + + public static ObjectProperty getObjectPropertyForPredicate(VitroRequest vreq, String predicateUri, String rangeUri) { WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectProperty objectProp = wdf.getObjectPropertyDao().getObjectPropertyByURI(predicateUri); + if (rangeUri != null) { + objectProp.setRangeVClassURI(rangeUri); + // TODO implement this in the DAO? + } return objectProp; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java index 6c7f925c3..39095ba3f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java @@ -17,6 +17,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo; public class IndividualsViaObjectPropetyOptions implements FieldOptions { @@ -76,6 +77,10 @@ public class IndividualsViaObjectPropetyOptions implements FieldOptions { //get all vclasses applicable to the individual subject HashSet vclassesURIs = getApplicableVClassURIs(subject, wDaoFact); + + if (rangeUri != null) { + vclassesURIs = filterToSubclassesOfRange(vclassesURIs, rangeUri, wDaoFact); + } if (vclassesURIs.size() == 0) { return optionsMap; @@ -138,6 +143,19 @@ public class IndividualsViaObjectPropetyOptions implements FieldOptions { return vclassesURIs; } + private HashSet filterToSubclassesOfRange(HashSet vclassesURIs, + String rangeUri, + WebappDaoFactory wDaoFact) { + HashSet filteredVClassesURIs = new HashSet(); + VClassDao vcDao = wDaoFact.getVClassDao(); + for (String vclass : vclassesURIs) { + if (vclass.equals(rangeUri) || vcDao.isSubClassOf(vclass, rangeUri)) { + filteredVClassesURIs.add(vclass); + } + } + return filteredVClassesURIs; + } + // copied from OptionsForPropertyTag.java in the thought that class may be deprecated private static List removeIndividualsAlreadyInRange(List individuals, List stmts, String predicateUri, String objectUriBeingEdited){ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java index 044ede2d2..8ffa4e04c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java @@ -106,7 +106,7 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene String predicateUri = EditConfigurationUtils.getPredicateUri(vreq); String rangeUri = EditConfigurationUtils.getRangeUri(vreq); if (rangeUri != null) { - types.add(rangeUri); + types.add(rangeUri); return types; } //Get all vclasses applicable to subject @@ -144,11 +144,10 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene }else{ query.setQuery( VitroSearchTermNames.RDFTYPE + ":" + type); } - query.setRows(0); - + query.setRows(0); QueryResponse rsp = solrServer.query(query); SolrDocumentList docs = rsp.getResults(); - long found = docs.getNumFound(); + long found = docs.getNumFound(); count = count + found; if( count > maxNonACRangeIndividualCount ) break; @@ -471,7 +470,8 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene boolean rangeIndividualsFound = false; for( String type:types){ //solr for type count. - SolrQuery query = new SolrQuery(); + SolrQuery query = new SolrQuery(); + query.setQuery( VitroSearchTermNames.RDFTYPE + ":" + type); query.setRows(0); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java index 07d61bce0..fba13b869 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/controller/EditRequestDispatchController.java @@ -217,7 +217,7 @@ public class EditRequestDispatchController extends FreemarkerHttpServlet { }else if( predicateUri != null && !predicateUri.isEmpty() ){ Property prop = getProperty( predicateUri, vreq); if (prop != null && rangeUri != null) { - // get the custom form out of the application ontology data + editConfGeneratorName = getCustomEntryFormForPropertyAndRange(prop, rangeUri); } else if( prop != null && prop.getCustomEntryForm() != null ){ //there is a custom form, great! let's use it. editConfGeneratorName = prop.getCustomEntryForm(); @@ -247,7 +247,22 @@ public class EditRequestDispatchController extends FreemarkerHttpServlet { return editConfGeneratorName; } - private Property getProperty(String predicateUri, VitroRequest vreq) { + private String getCustomEntryFormForPropertyAndRange(Property prop, String rangeUri){ + String entryFormName = null; + // = ApplicationConfigurationOntologyUtils.getEntryForm(prop.getURI(), rangeUri); + if (entryFormName == null) { + if (prop.getCustomEntryForm() != null) { + return prop.getCustomEntryForm(); + } else { + return DEFAULT_OBJ_FORM; + } + } else { + prop.setCustomEntryForm(entryFormName); + return entryFormName; + } + } + + private Property getProperty(String predicateUri, VitroRequest vreq) { Property p = null; try{ p = vreq.getWebappDaoFactory().getObjectPropertyDao().getObjectPropertyByURI(predicateUri); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ApplicationConfigurationOntologyUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ApplicationConfigurationOntologyUtils.java index ce680b0da..9aab09eab 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ApplicationConfigurationOntologyUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ApplicationConfigurationOntologyUtils.java @@ -37,6 +37,8 @@ public class ApplicationConfigurationOntologyUtils { return getAdditionalFauxSubpropertiesForList(propList, displayModel, tboxModel); } + + public static List getAdditionalFauxSubpropertiesForList(List propList, Model displayModel, Model tboxModel) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java index ef75d5ae3..f4306cb17 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java @@ -180,6 +180,7 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { Individual objectIndividual = EditConfigurationUtils.getObjectIndividual(vreq); ObjectProperty prop = EditConfigurationUtils.getObjectProperty(vreq); Individual subject = EditConfigurationUtils.getSubjectIndividual(vreq); + VClass rangeClass = EditConfigurationUtils.getRangeVClass(vreq); if(objectIndividual != null) { propertyTitle = prop.getDomainPublic(); } else { @@ -187,8 +188,9 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { if ( prop.getOfferCreateNewOption() ) { //Try to get the name of the class to select from VClass classOfObjectFillers = null; - - if( prop.getRangeVClassURI() == null ) { + if (rangeClass != null) { + classOfObjectFillers = rangeClass; + } else if( prop.getRangeVClassURI() == null ) { // If property has no explicit range, try to get classes List classes = wdf.getVClassDao().getVClassesForProperty(subject.getVClassURI(), prop.getURI()); if( classes == null || classes.size() == 0 || classes.get(0) == null ){ @@ -515,12 +517,23 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { Individual sub = wdf.getIndividualDao().getIndividualByURI(editConfig.getSubjectUri()); + VClass rangeClass = EditConfigurationUtils.getRangeVClass(vreq); + List vclasses = null; List subjectVClasses = sub.getVClasses(); if( subjectVClasses == null ) { vclasses = wdf.getVClassDao().getAllVclasses(); - } - else { + } else if (rangeClass != null) { + vclasses = new ArrayList(); + vclasses.add(rangeClass); + List subURIs = wdf.getVClassDao().getSubClassURIs(rangeClass.getURI()); + for (String subClassURI : subURIs) { + VClass subClass = wdf.getVClassDao().getVClassByURI(subClassURI); + if (subClass != null) { + vclasses.add(subClass); + } + } + } else { //this hash is used to make sure there are no duplicates in the vclasses //a more elegant method may look at overriding equals/hashcode to enable a single hashset of VClass objects HashSet vclassesURIs = new HashSet();