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 f5d09d689..c6fed81c7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java @@ -34,4 +34,6 @@ public interface ObjectPropertyStatementDao { public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String objectKey, String query); public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String objectKey, String query, Set constructQueries); + + public List getMostSpecificTypesForIndividual(String subjectUri); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java index 37ab827a3..62e2b266b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java @@ -41,7 +41,7 @@ public class VitroVocabulary { public static final String DISPLAY = DisplayVocabulary.DISPLAY_NS; // properties found on the beans - + public static final String DESCRIPTION = vitroURI+"description"; public static final String DESCRIPTION_ANNOT = vitroURI + "descriptionAnnot"; public static final String PUBLIC_DESCRIPTION_ANNOT = vitroURI + "publicDescriptionAnnot"; @@ -56,6 +56,8 @@ public class VitroVocabulary { //public static final String PROHIBITED_FROM_CREATE_BELOW_ROLE_LEVEL_ANNOT = vitroURI+"prohibitedFromCreateBelowRoleLevelAnnot"; public static final String PROHIBITED_FROM_UPDATE_BELOW_ROLE_LEVEL_ANNOT = vitroURI+"prohibitedFromUpdateBelowRoleLevelAnnot"; //public static final String PROHIBITED_FROM_DELETE_BELOW_ROLE_LEVEL_ANNOT = vitroURI+"prohibitedFromDeleteBelowRoleLevelAnnot"; + + public static final String MOST_SPECIFIC_TYPE = vitroURI + "mostSpecificType"; // roles public static final String PUBLIC = "http://vitro.mannlib.cornell.edu/ns/vitro/role#public"; 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 4371b41f7..05bed6541 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 @@ -82,28 +82,22 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec return innerObjectPropertyStatementDao.insertNewObjectPropertyStatement(objPropertyStmt); } - @Override - // RY What about filtering? public List> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, String objectKey, String query) { return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query); } @Override - // RY What about filtering? public List> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, String objectKey, String query, Set queryStrings) { return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, queryStrings); } - - -// @Override -// // RY What about filtering? -// public Map>> getCollatedObjectPropertyStatementsForIndividual( -// String subjectUri, String propertyUri, String query) { -// return innerObjectPropertyStatementDao.getCollatedObjectPropertyStatementsForIndividual(subjectUri, propertyUri, query); -// } + @Override + public List getMostSpecificTypesForIndividual(String subjectUri) { + return innerObjectPropertyStatementDao.getMostSpecificTypesForIndividual(subjectUri); + } + } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java index a21e386be..19904eba3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java @@ -778,7 +778,7 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements } log.debug("Data property query string:\n" + query); - Iterator results = getPropertyQueryResults(subjectUri, query); + Iterator results = getPropertyQueryResults(query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution sol = results.next(); 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 762be2cc2..4b7f7135a 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 @@ -871,7 +871,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp } log.debug("Object property query:\n" + query); - Iterator results = getPropertyQueryResults(subjectUri, query); + Iterator results = getPropertyQueryResults(query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution soln = results.next(); 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 5436edd1b..5dcf03435 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.List; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,6 +39,7 @@ 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.dao.ObjectPropertyStatementDao; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.IndividualUpdateEvent; public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements ObjectPropertyStatementDao { @@ -359,7 +361,6 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec initialBindings.add( "property", ResourceFactory.createResource(propertyUri)); - List> list = new ArrayList>(); DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); @@ -383,4 +384,58 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } + protected static final String MOST_SPECIFIC_TYPE_QUERY = + "PREFIX rdfs: <" + VitroVocabulary.RDFS + "> \n" + + "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + + "SELECT ?label WHERE { \n" + + " ?subject vitro:mostSpecificType ?type . \n" + + " ?type rdfs:label ?label \n" + + "} ORDER BY ?label "; + + @Override + /** + * Finds all mostSpecificTypes of an individual. + * Returns a list of type labels. + * **/ + public List getMostSpecificTypesForIndividual(String subjectUri) { + + String queryString = subUriForQueryVar(MOST_SPECIFIC_TYPE_QUERY, "subject", subjectUri); + + log.debug("Query string for vitro:mostSpecificType : " + queryString); + + Query query = null; + try { + query = QueryFactory.create(queryString, Syntax.syntaxARQ); + } catch(Throwable th){ + log.error("Could not create SPARQL query for query string. " + th.getMessage()); + log.error(queryString); + return Collections.emptyList(); + } + + List types = new ArrayList(); + DatasetWrapper w = dwf.getDatasetWrapper(); + Dataset dataset = w.getDataset(); + dataset.getLock().enterCriticalSection(Lock.READ); + try { + + QueryExecution qexec = QueryExecutionFactory.create(query, dataset); + ResultSet results = qexec.execSelect(); + while (results.hasNext()) { + QuerySolution soln = results.nextSolution(); + RDFNode node = soln.get("label"); + if (node.isLiteral()) { + String label = node.asLiteral().getLexicalForm(); + if (! StringUtils.isBlank(label)) { + types.add(label); + } + } + } + + } finally { + dataset.getLock().leaveCriticalSection(); + w.close(); + } + + return types; + } } 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 07c16ae21..5be1a58dd 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 @@ -404,7 +404,7 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { return classSet; } - protected Iterator getPropertyQueryResults(String subjectUri, Query query) { + protected Iterator getPropertyQueryResults(Query query) { log.debug("SPARQL query:\n" + query.toString()); // RY Removing prebinding due to Jena bug: when isLiteral(?object) or diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrAutocompleteController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrAutocompleteController.java index 560ab69cd..499d5efe0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrAutocompleteController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrAutocompleteController.java @@ -116,9 +116,6 @@ public class SolrAutocompleteController extends VitroAjaxController { Collections.sort(results); - // map.put("results", results); - // writeTemplate(TEMPLATE_DEFAULT, map, config, vreq, response); - JSONArray jsonArray = new JSONArray(); for (SearchResult result : results) { jsonArray.put(result.toMap()); @@ -157,7 +154,7 @@ public class SolrAutocompleteController extends VitroAjaxController { query.setFields(VitroLuceneTermNames.NAME_RAW, VitroLuceneTermNames.URI); // fields to retrieve - // Can't sort on multivalued field, so sort results in Java when we get them + // Can't sort on multivalued field, so we sort the results in Java when we get them. // query.setSortField(VitroLuceneTermNames.NAME_LOWERCASE, SolrQuery.ORDER.asc); return query; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrPagedSearchController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrPagedSearchController.java index 6b92dbea2..02c55a0b0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrPagedSearchController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SolrPagedSearchController.java @@ -168,7 +168,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet { if( startIndex >= DEFAULT_MAX_HIT_COUNT - hitsPerPage ) maxHitCount = startIndex + DEFAULT_MAX_HIT_COUNT ; - log.debug("maxHitSize is " + maxHitCount); + log.debug("maxHitCount is " + maxHitCount); String qtxt = vreq.getParameter(VitroQuery.QUERY_PARAMETER_NAME); @@ -363,7 +363,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet { } } catch(Exception e) { log.error("problem getting VClassGroups from search hits " - + e.getMessage()); + + e.getMessage() ); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseIndividualTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseIndividualTemplateModel.java index af8c8c2a0..4da55a204 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseIndividualTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseIndividualTemplateModel.java @@ -2,8 +2,11 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -20,8 +23,8 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; +import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; -import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; @@ -146,10 +149,12 @@ public abstract class BaseIndividualTemplateModel extends BaseTemplateModel { return individual.getName(); } - public String getMoniker() { - return individual.getMoniker(); + public List getMostSpecificTypes() { + ObjectPropertyStatementDao opsDao = vreq.getWebappDaoFactory().getObjectPropertyStatementDao(); + return opsDao.getMostSpecificTypesForIndividual(getUri()); } + public String getUri() { return individual.getURI(); } diff --git a/webapp/web/css/individual/individual.css b/webapp/web/css/individual/individual.css index 1be32a0ff..21ba8dd63 100644 --- a/webapp/web/css/individual/individual.css +++ b/webapp/web/css/individual/individual.css @@ -39,7 +39,7 @@ #individual-intro h1 { padding-bottom: 8px; } -#individual-intro span.preferred-title { +#individual-intro span.most-specific-type { padding-left: 10px; margin-left: 10px; } @@ -188,7 +188,7 @@ ul#additional-emails li { #individual-info.withThumb { width: 78%; } -h1.fn .preferred-title { +h1.fn .most-specific-type { padding-left: 10px; margin-left: 10px; } diff --git a/webapp/web/templates/freemarker/body/individual/individual-vitro.ftl b/webapp/web/templates/freemarker/body/individual/individual-vitro.ftl index f3ffe0795..2670cfb9a 100644 --- a/webapp/web/templates/freemarker/body/individual/individual-vitro.ftl +++ b/webapp/web/templates/freemarker/body/individual/individual-vitro.ftl @@ -31,10 +31,8 @@ <#-- Label --> <@p.label individual editable /> - <#-- Moniker --> - <#if individual.moniker?has_content> - ${individual.moniker} - + <#-- Most-specific types --> + <@p.mostSpecificTypes individual /> diff --git a/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl index 47f27fff0..9a2009ce0 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl @@ -240,3 +240,11 @@ name will be used as the label. --> <@editingLinks "label" label editable /> +<#-- Most specific types --> +<#macro mostSpecificTypes individual> + <#local types = individual.mostSpecificTypes /> + <#list types as type> + ${type} + + + diff --git a/webapp/web/themes/vitro/css/vitroTheme.css b/webapp/web/themes/vitro/css/vitroTheme.css index c881a14c6..80f783106 100644 --- a/webapp/web/themes/vitro/css/vitroTheme.css +++ b/webapp/web/themes/vitro/css/vitroTheme.css @@ -1151,7 +1151,7 @@ ul#alpha-browse-individuals .count-classes { font-size: 1.375em; color: #47B6D0; } -#individual-intro span.preferred-title { +#individual-intro span.most-specific-type { font-size: .825em; color: #5e6363; border-left: 1px solid #A6B1B0; @@ -1224,7 +1224,7 @@ ul.individual-urls-people li a { color: #006279; line-height: 1.3em; } -h1.fn .preferred-title { +h1.fn .most-specific-type { font-size: .825em; color: #5e6363; border-left: 1px solid #a6b1b0;