VIVO-396 Obtain preferred title from VCard

This commit is contained in:
j2blake 2013-10-28 11:58:00 -04:00
parent 13feddac3d
commit 7bff226f00
4 changed files with 178 additions and 17 deletions

View file

@ -0,0 +1,87 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.individuallist;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
/**
* Wrap an Individual in a JSON object for display by the script.
*
* This overrides the Vitro version so we can have more info in the display.
*/
public class IndividualJsonWrapper {
private static final Log log = LogFactory
.getLog(IndividualJsonWrapper.class);
private static String VCARD_DATA_QUERY = ""
+ "PREFIX obo: <http://purl.obolibrary.org/obo/> \n"
+ "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n"
+ "SELECT DISTINCT ?title \n" + "WHERE { \n"
+ " ?subject obo:ARG_2000028 ?vIndividual . \n"
+ " ?vIndividual vcard:hasTitle ?vTitle . \n"
+ " ?vTitle vcard:title ?title . \n" + "} ";
static JSONObject packageIndividualAsJson(VitroRequest vreq, Individual ind)
throws JSONException {
// need an unfiltered dao to get firstnames and lastnames
WebappDaoFactory fullWdf = vreq.getUnfilteredWebappDaoFactory();
JSONObject jo = new JSONObject();
jo.put("URI", ind.getURI());
jo.put("label", ind.getRdfsLabel());
jo.put("name", ind.getName());
jo.put("thumbUrl", ind.getThumbUrl());
jo.put("imageUrl", ind.getImageUrl());
jo.put("profileUrl", UrlBuilder.getIndividualProfileUrl(ind, vreq));
jo.put("mostSpecificTypes", getMostSpecificTypes(ind, fullWdf));
jo.put("preferredTitle", findPreferredTitle(vreq, ind));
return jo;
}
private static String findPreferredTitle(VitroRequest vreq, Individual ind) {
String queryStr = QueryUtils.subUriForQueryVar(VCARD_DATA_QUERY,
"subject", ind.getURI());
log.debug("queryStr = " + queryStr);
String value = "";
try {
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
String t = QueryUtils.nodeToString(soln.get("title"));
if (StringUtils.isNotBlank(t)) {
value = t;
}
}
} catch (Exception e) {
log.error(e, e);
}
return value;
}
public static Collection<String> getMostSpecificTypes(
Individual individual, WebappDaoFactory wdf) {
ObjectPropertyStatementDao opsDao = wdf.getObjectPropertyStatementDao();
Map<String, String> mostSpecificTypes = opsDao
.getMostSpecificTypesInClassgroupsForIndividual(individual
.getURI());
return mostSpecificTypes.values();
}
}

View file

@ -2,28 +2,60 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist; package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.BaseListedIndividual; import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividual;
public class ListedIndividual extends BaseListedIndividual { public class ListedIndividual extends BaseListedIndividual {
private static final Log log = LogFactory.getLog(ListedIndividual.class); private static final Log log = LogFactory.getLog(ListedIndividual.class);
private static final String CORE = "http://vivoweb.org/ontology/core#"; private static String VCARD_DATA_QUERY = ""
+ "PREFIX obo: <http://purl.obolibrary.org/obo/> \n"
+ "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n"
+ "SELECT DISTINCT ?title \n"
+ "WHERE { \n"
+ " ?subject obo:ARG_2000028 ?vIndividual . \n"
+ " ?vIndividual vcard:hasTitle ?vTitle . \n"
+ " ?vTitle vcard:title ?title . \n"
+ "} " ;
private final String title;
public ListedIndividual(Individual individual, VitroRequest vreq) { public ListedIndividual(Individual individual, VitroRequest vreq) {
super(individual, vreq); super(individual, vreq);
title = findPreferredTitle();
}
private String findPreferredTitle() {
String queryStr = QueryUtils.subUriForQueryVar(VCARD_DATA_QUERY, "subject", individual.getURI());
log.debug("queryStr = " + queryStr);
String value = "";
try {
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
String t = QueryUtils.nodeToString( soln.get("title"));
if (StringUtils.isNotBlank(t)) {
value = t;
}
}
} catch (Exception e) {
log.error(e, e);
}
return value;
} }
/* Template properties */ /* Template properties */
public String getPreferredTitle() { public String getPreferredTitle() {
return cleanTextForDisplay( individual.getDataValue(CORE + "preferredTitle") ); return title;
} }
} }

View file

@ -2,33 +2,73 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.searchresult; package edu.cornell.mannlib.vitro.webapp.web.templatemodels.searchresult;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
public class IndividualSearchResult extends BaseIndividualSearchResult { public class IndividualSearchResult extends BaseIndividualSearchResult {
private static final Log log = LogFactory.getLog(IndividualSearchResult.class); private static final Log log = LogFactory.getLog(IndividualSearchResult.class);
private static final String CORE = "http://vivoweb.org/ontology/core#"; private static String VCARD_DATA_QUERY = ""
+ "PREFIX obo: <http://purl.obolibrary.org/obo/> \n"
+ "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n"
+ "SELECT DISTINCT ?email ?title \n"
+ "WHERE { \n"
+ " ?subject obo:ARG_2000028 ?vIndividual . \n"
+ " OPTIONAL { ?vIndividual vcard:hasEmail ?vEmail . \n"
+ " ?vEmail vcard:email ?email . \n"
+ " } \n"
+ " OPTIONAL { ?vIndividual vcard:hasTitle ?vTitle . \n"
+ " ?vTitle vcard:title ?title . \n"
+ " } \n"
+ "} " ;
private String email = "";
private String title = "";
public IndividualSearchResult(Individual individual, VitroRequest vreq) { public IndividualSearchResult(Individual individual, VitroRequest vreq) {
super(individual, vreq); super(individual, vreq);
log.debug("Called Individual Search Result"); log.debug("Called Individual Search Result");
findVcardInfo();
} }
private void findVcardInfo() {
String queryStr = QueryUtils.subUriForQueryVar(VCARD_DATA_QUERY, "subject", individual.getURI());
log.debug("queryStr = " + queryStr);
try {
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
String t = QueryUtils.nodeToString( soln.get("title"));
if (StringUtils.isNotBlank(t)) {
title = t;
}
String em = QueryUtils.nodeToString( soln.get("email"));
if (StringUtils.isNotBlank(em)) {
email = em;
}
}
} catch (Exception e) {
log.error(e, e);
}
}
/* Access methods for templates */ /* Access methods for templates */
public String getPreferredTitle() { public String getPreferredTitle() {
log.debug("Called get Title"); return title;
return individual.getDataValue(CORE + "preferredTitle");
} }
public String getEmail() { public String getEmail() {
log.debug("Called get Email"); return email;
return individual.getDataValue(CORE + "email");
} }
} }

View file

@ -67,11 +67,13 @@ mydomain:facultyPreferredTitleDG
a datagetters:SparqlQueryDataGetter ; a datagetters:SparqlQueryDataGetter ;
display:saveToVar "extra" ; display:saveToVar "extra" ;
display:query """ display:query """
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX vivo: <http://vivoweb.org/ontology/core#> PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
SELECT ?pt SELECT DISTINCT ?pt
WHERE { WHERE {
?individualUri <http://vivoweb.org/ontology/core#preferredTitle> ?pt ?individualUri obo:ARG_2000028 ?vIndividual .
?vIndividual vcard:hasTitle ?vTitle .
?vTitle vcard:title ?pt .
} }
LIMIT 1 LIMIT 1
""" . """ .