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:
parent
1bad0658cb
commit
e4d301cf98
18 changed files with 243 additions and 59 deletions
|
@ -54,5 +54,7 @@ public interface ObjectPropertyDao extends PropertyDao {
|
|||
|
||||
public List<ObjectProperty> getObjectPropertyList(Individual subject);
|
||||
|
||||
public List<ObjectProperty> getObjectPropertyList(String subjectUri);
|
||||
public List<ObjectProperty> getObjectPropertyList(String subjectUri);
|
||||
|
||||
public String getCustomShortView();
|
||||
}
|
||||
|
|
|
@ -28,5 +28,6 @@ public interface ObjectPropertyStatementDao {
|
|||
Individual fillExistingObjectPropertyStatements( Individual entity );
|
||||
|
||||
int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt );
|
||||
|
||||
|
||||
public List<ObjectPropertyStatement> getObjectPropertyStatementsForIndividualByProperty(Individual subject, ObjectProperty property, String query);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
@ -851,6 +857,11 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp
|
|||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getCustomShortView() {
|
||||
//return getPropertyStringValue(, PROPERTY_CUSTOM_LIST_VIEW_ANNOT);
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,42 +2,106 @@
|
|||
|
||||
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 {
|
||||
|
||||
private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class);
|
||||
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>();
|
||||
|
||||
// get the statements from the db via sparql query
|
||||
private PropertyListConfig config;
|
||||
|
||||
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 */
|
||||
|
||||
public String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
public boolean isCollatedBySubclass() {
|
||||
return false;
|
||||
public String getTemplate() {
|
||||
return config.templateName;
|
||||
}
|
||||
|
||||
public abstract boolean isCollatedBySubclass();
|
||||
|
||||
@Override
|
||||
public String getAddLink() {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -30,6 +32,10 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
|
|||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getUri() {
|
||||
return uri;
|
||||
}
|
||||
|
||||
public abstract String getAddLink();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
11
webapp/web/views/objectPropertyList-default.xml
Normal file
11
webapp/web/views/objectPropertyList-default.xml
Normal 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>
|
Loading…
Add table
Add a link
Reference in a new issue