NIHVIVO-1333 Continued work on display of object properties on individual profile, including getting sparql query and template name from a config file and using it to generate and display statements.

This commit is contained in:
rjy7 2010-12-07 21:30:13 +00:00
parent 1bad0658cb
commit e4d301cf98
18 changed files with 243 additions and 59 deletions

View file

@ -55,4 +55,6 @@ public interface ObjectPropertyDao extends PropertyDao {
public List<ObjectProperty> getObjectPropertyList(Individual subject);
public List<ObjectProperty> getObjectPropertyList(String subjectUri);
public String getCustomShortView();
}

View file

@ -29,4 +29,5 @@ public interface ObjectPropertyStatementDao {
int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt );
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(Individual subject, ObjectProperty property, String query);
}

View file

@ -102,6 +102,7 @@ public class VitroVocabulary {
public static final String PROPERTY_CUSTOMENTRYFORMANNOT = vitroURI+"customEntryFormAnnot";
public static final String PROPERTY_CUSTOMDISPLAYVIEWANNOT = vitroURI+"customDisplayViewAnnot";
public static final String PROPERTY_CUSTOMSHORTVIEWANNOT = vitroURI+"customShortViewAnnot";
public static final String PROPERTY_CUSTOM_LIST_VIEW_ANNOT = vitroURI + "customListViewAnnot";
public static final String PROPERTY_SELECTFROMEXISTINGANNOT = vitroURI+"selectFromExistingAnnot";
public static final String PROPERTY_OFFERCREATENEWOPTIONANNOT = vitroURI+"offerCreateNewOptionAnnot";
public static final String PROPERTY_INPROPERTYGROUPANNOT = vitroURI+"inPropertyGroupAnnot";

View file

@ -214,4 +214,9 @@ class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectProperty
public List<ObjectProperty> getObjectPropertyList(String subjectUri) {
return innerObjectPropertyDao.getObjectPropertyList(subjectUri);
}
@Override
public String getCustomShortView() {
return innerObjectPropertyDao.getCustomShortView();
}
}

View file

@ -81,4 +81,12 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec
return innerObjectPropertyStatementDao.insertNewObjectPropertyStatement(objPropertyStmt);
}
@Override
// RY What about filtering?
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(
Individual subject, ObjectProperty property, String query) {
return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subject, property, query);
}
}

View file

@ -297,13 +297,13 @@ public class DataPropertyStatementDaoJena extends JenaBaseDao implements DataPro
QueryExecution qexec = QueryExecutionFactory.create(dataPropertyValueQuery, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect();
List<DataPropertyStatement> values = new ArrayList<DataPropertyStatement>();
List<DataPropertyStatement> statements = new ArrayList<DataPropertyStatement>();
while (results.hasNext()) {
QuerySolution sol = results.next();
Literal value = sol.getLiteral("value");
DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, propertyUri, value.getLexicalForm());
values.add(dps);
statements.add(dps);
}
return values;
return statements;
}
}

View file

@ -101,30 +101,4 @@ public class DataPropertyStatementDaoSDB extends DataPropertyStatementDaoJena
}
}
}
@Override
public List<DataPropertyStatement> getDataPropertyStatementsForIndividualByProperty(Individual subject, DataProperty property) {
log.debug("dataPropertyValueQueryString:\n" + dataPropertyValueQueryString);
log.debug("dataPropertyValueQuery:\n" + dataPropertyValueQuery);
String subjectUri = subject.getURI();
String propertyUri = property.getURI();
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add("subject", ResourceFactory.createResource(subjectUri));
bindings.add("property", ResourceFactory.createResource(propertyUri));
// Run the SPARQL query to get the properties
QueryExecution qexec = QueryExecutionFactory.create(dataPropertyValueQuery, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect();
List<DataPropertyStatement> values = new ArrayList<DataPropertyStatement>();
while (results.hasNext()) {
QuerySolution sol = results.next();
Literal value = sol.getLiteral("value");
DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, propertyUri, value.getLexicalForm());
values.add(dps);
}
return values;
}
}

View file

@ -73,6 +73,7 @@ public class JenaBaseDaoCon {
protected AnnotationProperty PROPERTY_CUSTOMENTRYFORMANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMENTRYFORMANNOT);
protected AnnotationProperty PROPERTY_CUSTOMDISPLAYVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMDISPLAYVIEWANNOT);
protected AnnotationProperty PROPERTY_CUSTOMSHORTVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSHORTVIEWANNOT);
protected AnnotationProperty PROPERTY_CUSTOM_LIST_VIEW_ANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOM_LIST_VIEW_ANNOT);
protected AnnotationProperty PROPERTY_CUSTOMSEARCHVIEWANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_CUSTOMSEARCHVIEWANNOT);
//protected AnnotationProperty PROPERTY_FORCESTUBDELETIONANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_FORCESTUBDELETIONANNOT);
protected AnnotationProperty PROPERTY_SELECTFROMEXISTINGANNOT = _constModel.createAnnotationProperty(VitroVocabulary.PROPERTY_SELECTFROMEXISTINGANNOT);

View file

@ -18,8 +18,11 @@ import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.ontology.ProfileException;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Property;
@ -35,6 +38,9 @@ import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
@ -852,5 +858,10 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp
return properties;
}
@Override
public String getCustomShortView() {
//return getPropertyStringValue(, PROPERTY_CUSTOM_LIST_VIEW_ANNOT);
return null;
}
}

View file

@ -8,6 +8,13 @@ import java.util.List;
import java.util.Map;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
@ -228,4 +235,40 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec
return 0;
}
@Override
/*
* SPARQL-based method for getting the individual's values for a single data property.
*/
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(Individual subject, ObjectProperty property, String queryString) {
log.debug("Object property query string: " + queryString);
Query query = null;
try {
query = QueryFactory.create(queryString);
} catch(Throwable th){
log.error("could not create SPARQL query for query string " + th.getMessage());
log.error(queryString);
}
String subjectUri = subject.getURI();
String propertyUri = property.getURI();
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add("subject", ResourceFactory.createResource(subjectUri));
bindings.add("property", ResourceFactory.createResource(propertyUri));
// Run the SPARQL query to get the properties
QueryExecution qexec = QueryExecutionFactory.create(query, getOntModelSelector().getFullModel(), bindings);
ResultSet results = qexec.execSelect();
List<ObjectPropertyStatement> statements = new ArrayList<ObjectPropertyStatement>();
while (results.hasNext()) {
QuerySolution sol = results.next();
Resource resource = sol.getResource("object");
ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(subjectUri, propertyUri, resource.getURI());
statements.add(ops);
}
return statements;
}
}

View file

@ -8,7 +8,9 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel {
@ -16,8 +18,8 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
private List<SubclassList> subclassList;
CollatedObjectPropertyTemplateModel(ObjectProperty property) {
super(property);
CollatedObjectPropertyTemplateModel(ObjectProperty property, Individual subject, WebappDaoFactory wdf) {
super(property, subject, wdf);
subclassList = new ArrayList<SubclassList>();
}

View file

@ -2,31 +2,93 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import java.util.ArrayList;
import java.util.List;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class ObjectPropertyTemplateModel extends PropertyTemplateModel {
public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel {
private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class);
private static final String TYPE = "object";
private List<ObjectPropertyStatementTemplateModel> statements;
ObjectPropertyTemplateModel(ObjectProperty property) {
super(property);
statements = new ArrayList<ObjectPropertyStatementTemplateModel>();
private PropertyListConfig config;
// get the statements from the db via sparql query
ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
super(op);
// Get the config for this object property
config = new PropertyListConfig(op);
}
protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op) {
return op.getCollateBySubclass() ? new CollatedObjectPropertyTemplateModel(op)
: new ObjectPropertyTemplateModel(op);
protected String getQueryString() {
return config.queryString;
}
protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
return op.getCollateBySubclass() ? new CollatedObjectPropertyTemplateModel(op, subject, wdf)
: new UncollatedObjectPropertyTemplateModel(op, subject, wdf);
}
private class PropertyListConfig {
private static final String DEFAULT_CONFIG_FILE = "objectPropertyList-default.xml";
private static final String CONFIG_FILE_PATH = "/views/";
private static final String NODE_NAME_QUERY = "query";
private static final String NODE_NAME_TEMPLATE = "template";
private String queryString;
private String templateName;
PropertyListConfig(ObjectProperty op) {
String filename = DEFAULT_CONFIG_FILE;;
// Get the config filename from ObjectPropertyDaoJena by looking for the custom property list view annotation.
// If there is none, use the default config filename.
// do stuff here to get the custom config filename ***
String configFilename = getConfigFilename(filename);
try {
File config = new File(configFilename);
if (configFilename != DEFAULT_CONFIG_FILE && ! config.exists()) {
log.warn("Can't find config file " + configFilename + " for object property " + op.getURI() + "\n" +
". Using default config file instead.");
configFilename = getConfigFilename(DEFAULT_CONFIG_FILE);
// Should we test for the existence of the default, and throw an error if it doesn't exist?
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(configFilename);
queryString = getConfigValue(doc, NODE_NAME_QUERY);
templateName = getConfigValue(doc, NODE_NAME_TEMPLATE);
} catch (Exception e) {
log.error("Error processing config file " + configFilename + " for object property " + op.getURI(), e);
// What should we do here?
}
}
private String getConfigValue(Document doc, String nodeName) {
NodeList nodes = doc.getElementsByTagName(nodeName);
Element element = (Element) nodes.item(0);
String value = element.getChildNodes().item(0).getNodeValue();
log.debug("Value of config parameter " + nodeName + " = " + value);
return value;
}
private String getConfigFilename(String filename) {
return servletContext.getRealPath(CONFIG_FILE_PATH + filename);
}
}
/* Access methods for templates */
@ -35,10 +97,12 @@ public class ObjectPropertyTemplateModel extends PropertyTemplateModel {
return TYPE;
}
public boolean isCollatedBySubclass() {
return false;
public String getTemplate() {
return config.templateName;
}
public abstract boolean isCollatedBySubclass();
@Override
public String getAddLink() {
// TODO Auto-generated method stub
@ -58,9 +122,4 @@ public class ObjectPropertyTemplateModel extends PropertyTemplateModel {
// TODO Auto-generated method stub
return null;
}
public List<ObjectPropertyStatementTemplateModel> getStatements() {
// TODO Auto-generated method stub
return null;
}
}

View file

@ -31,7 +31,7 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel {
for (Property p : propertyList) {
if (p instanceof ObjectProperty) {
ObjectProperty op = (ObjectProperty)p;
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op));
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, wdf));
} else {
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, wdf));
}

View file

@ -16,10 +16,12 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
private static final Log log = LogFactory.getLog(PropertyTemplateModel.class);
private String name;
protected Property property;
private String uri;
protected Property property; // needed to get the edit links
PropertyTemplateModel(Property property) {
this.name = property.getLabel();
this.uri = property.getURI();
this.property = property;
}
@ -31,6 +33,10 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
return name;
}
public String getUri() {
return uri;
}
public abstract String getAddLink();
public abstract String getEditLink();

View file

@ -0,0 +1,47 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel {
private static final Log log = LogFactory.getLog(UncollatedObjectPropertyTemplateModel.class);
private List<ObjectPropertyStatementTemplateModel> statements;
UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) {
super(op, subject, wdf);
ObjectPropertyStatementDao opDao = wdf.getObjectPropertyStatementDao();
List<ObjectPropertyStatement> opStatements = opDao.getObjectPropertyStatementsForIndividualByProperty(subject, op, getQueryString());
statements = new ArrayList<ObjectPropertyStatementTemplateModel>();
for (ObjectPropertyStatement ops : opStatements) {
statements.add(new ObjectPropertyStatementTemplateModel(ops));
}
}
public List<ObjectPropertyStatementTemplateModel> getStatements() {
return statements;
}
// public List<SubclassList> getStatements() {
// return subclassList;
// }
/* Access methods for templates */
@Override
public boolean isCollatedBySubclass() {
return false;
}
}

View file

@ -36,13 +36,16 @@
<#-- List the statements for each property -->
<#if property.type == "data"> <#-- data property -->
<#list property.statements as statement>
<div class="dataprop-value">
<div class="data-prop-stmt-value">
${statement.value}
</div> <!-- end dataprop-value -->
</div> <!-- end data-prop-stmt-value -->
</#list>
<#else> <#-- object property -->
<p>Collated? ${property.collatedBySubclass?string("yes", "no")}</p>
<#if ! property.collatedBySubclass> <#-- temporary, till we handle collated props -->
<#include "${property.template}">
</#if>
</#if>
</div> <!-- end property -->
</#list>

View file

@ -0,0 +1,10 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Default object property list template -->
<#list property.statements as statement>
<div class="obj-prop-stmt-obj">
<#-- ${statement.object.name} -->
statement ${statement_index +1}
</div> <!-- end obj-prop-stmt-obj -->
</#list>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<view-config>
<query>
SELECT ?object WHERE {
?subject ?property ?object .
}
</query>
<template>objectPropertyList-default.ftl</template>
</view-config>