From 5ee3ecd89ef58b6e00b397170aa611f96c620248 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Tue, 21 Dec 2010 20:30:13 +0000 Subject: [PATCH] NIHVIVO-1341, NIHVIVO-1336 Implement strategies for handling missing linked individual in custom list views. --- .../freemarker/IndividualController.java | 2 ++ .../jena/ObjectPropertyStatementDaoJena.java | 6 ++-- .../functions/IndividualLocalNameMethod.java | 36 +++++++++++++++++++ .../ObjectPropertyTemplateModel.java | 8 +++-- webapp/web/config/listViewConfig-default.xml | 4 +-- 5 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/web/functions/IndividualLocalNameMethod.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java index 699a91b65..4c55d8b4c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java @@ -56,6 +56,7 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQueryWrapper; import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper; import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapperFactory; import edu.cornell.mannlib.vitro.webapp.web.ContentType; +import edu.cornell.mannlib.vitro.webapp.web.functions.IndividualLocalNameMethod; import edu.cornell.mannlib.vitro.webapp.web.functions.IndividualProfileUrlMethod; import edu.cornell.mannlib.vitro.webapp.web.jsptags.StringProcessorTag; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.IndividualTemplateModel; @@ -129,6 +130,7 @@ public class IndividualController extends FreemarkerHttpServlet { body.put("individual", getNonDefaultBeansWrapper(BeansWrapper.EXPOSE_SAFE).wrap(ind)); body.put("url", new IndividualProfileUrlMethod()); + body.put("localName", new IndividualLocalNameMethod()); String template = getIndividualTemplate(individual); 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 3e40e5509..23f6ec7bb 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 @@ -4,7 +4,6 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -19,9 +18,8 @@ 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.query.Syntax; import com.hp.hpl.jena.rdf.model.Property; -import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; @@ -257,7 +255,7 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec Query query = null; try { - query = QueryFactory.create(queryString); + query = QueryFactory.create(queryString, Syntax.syntaxARQ); } catch(Throwable th){ log.error("could not create SPARQL query for query string " + th.getMessage()); log.error(queryString); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/functions/IndividualLocalNameMethod.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/functions/IndividualLocalNameMethod.java new file mode 100644 index 000000000..7bc07b868 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/functions/IndividualLocalNameMethod.java @@ -0,0 +1,36 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.functions; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +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.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import freemarker.core.Environment; +import freemarker.template.TemplateMethodModel; +import freemarker.template.TemplateModelException; + +public class IndividualLocalNameMethod implements TemplateMethodModel { + + @Override + public String exec(List args) throws TemplateModelException { + if (args.size() != 1) { + throw new TemplateModelException("Wrong number of arguments"); + } + + String uri = (String) args.get(0); + Environment env = Environment.getCurrentEnvironment(); + HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); + VitroRequest vreq = new VitroRequest(request); + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); + IndividualDao iDao = wdf.getIndividualDao(); + Individual individual = iDao.getIndividualByURI(uri); + return individual.getLocalName(); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index 92e34c5df..15a92a916 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -111,7 +111,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel String configFilePath = getConfigFilePath(configFileName); try { File config = new File(configFilePath); - if (configFileName != DEFAULT_CONFIG_FILE && ! config.exists()) { + if ( ! isDefaultConfig(configFileName) && ! config.exists() ) { log.warn("Can't find config file " + configFilePath + " for object property " + op.getURI() + "\n" + ". Using default config file instead."); configFilePath = getConfigFilePath(DEFAULT_CONFIG_FILE); @@ -124,7 +124,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel // What should we do here? } - if ( ! configFileName.equals(DEFAULT_CONFIG_FILE) ) { + if ( ! isDefaultConfig(configFileName) ) { String invalidConfigMessage = checkForInvalidConfig(vreq); if ( StringUtils.isNotEmpty(invalidConfigMessage) ) { log.warn("Invalid list view config for object property " + op.getURI() + @@ -136,6 +136,10 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel } } + private boolean isDefaultConfig(String configFileName) { + return configFileName.equals(DEFAULT_CONFIG_FILE); + } + private String checkForInvalidConfig(VitroRequest vreq) { String invalidConfigMessage = null; diff --git a/webapp/web/config/listViewConfig-default.xml b/webapp/web/config/listViewConfig-default.xml index 3fbe49483..e98279fdd 100644 --- a/webapp/web/config/listViewConfig-default.xml +++ b/webapp/web/config/listViewConfig-default.xml @@ -11,8 +11,8 @@ sending it to the template Query requirements: - - WHERE clause must contain a statement ?subject ?property ?objectvariable, with the variables - ?subject and ?property named as such. The objectvariable can be given any name, but it must be + - WHERE clause must contain a statement ?subject ?property ?object, with the variables + ?subject and ?property named as such. The object can be given any name, but it must be included in the SELECT terms retrieved by the query. This is the statement that will be edited from the edit links. -->