diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPreprocessor.java new file mode 100644 index 000000000..f78404315 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPreprocessor.java @@ -0,0 +1,68 @@ +package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; + +import java.util.List; +import java.util.Map; + +import edu.cornell.mannlib.vitro.webapp.beans.Individual; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; + +public class BaseObjectPropertyDataPreprocessor implements + ObjectPropertyDataPreprocessor { + + protected ObjectPropertyTemplateModel objectPropertyTemplateModel; + protected WebappDaoFactory wdf; + + public BaseObjectPropertyDataPreprocessor(ObjectPropertyTemplateModel optm, WebappDaoFactory wdf) { + this.objectPropertyTemplateModel = optm; + this.wdf = wdf; + } + + + @Override + public void process(List> data) { + for (Map map : data) { + applyStandardPreprocessing(map); + applySpecificPreprocessing(map); + } + } + + /* Standard preprocessing that applies to all views. */ + protected void applyStandardPreprocessing(Map map) { + addLinkForTarget(map); + } + + protected void applySpecificPreprocessing(Map map) { + /* Base class method is empty because this method is defined + * to apply subclass preprocessing. + */ + } + + private void addLinkForTarget(Map map) { + String linkTarget = objectPropertyTemplateModel.getLinkTarget(); + String targetUri = map.get(linkTarget); + if (targetUri != null) { + String targetUrl = getLink(targetUri); + map.put(linkTarget + "Url", targetUrl); + } + } + + + /* Preprocessor helper methods callable from any preprocessor */ + + protected String getLink(String uri) { + return UrlBuilder.getIndividualProfileUrl(uri, wdf); + } + + protected String getMoniker(String uri) { + return getIndividual(uri).getMoniker(); + } + + protected String getName(String uri) { + return getIndividual(uri).getName(); + } + + protected Individual getIndividual(String uri) { + return wdf.getIndividualDao().getIndividualByURI(uri); + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DefaultObjectPropertyDataPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DefaultObjectPropertyDataPreprocessor.java new file mode 100644 index 000000000..be4ccc7d1 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DefaultObjectPropertyDataPreprocessor.java @@ -0,0 +1,37 @@ +/* $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.Map; + +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; + +public class DefaultObjectPropertyDataPreprocessor extends + BaseObjectPropertyDataPreprocessor { + + public DefaultObjectPropertyDataPreprocessor(ObjectPropertyTemplateModel optm, WebappDaoFactory wdf) { + super(optm, wdf); + } + + @Override + /* Apply preprocessing specific to this preprocessor */ + protected void applySpecificPreprocessing(Map map) { + addName(map); + addMoniker(map); + } + + private void addName(Map map) { + String name = map.get("name"); + if (name == null) { + map.put("name", getName(map.get("object"))); + } + } + + private void addMoniker(Map map) { + String moniker = map.get("moniker"); + if (moniker == null) { + map.put("moniker", getMoniker(map.get("object"))); + } + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/ObjectPropertyDataPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyDataPreprocessor.java similarity index 74% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/ObjectPropertyDataPreprocessor.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyDataPreprocessor.java index 1e3d459df..4b35a34cf 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/ObjectPropertyDataPreprocessor.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyDataPreprocessor.java @@ -1,6 +1,6 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ -package edu.cornell.mannlib.vitro.webapp.web.templatemodels.preprocessors; +package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; import java.util.List; import java.util.Map; @@ -15,6 +15,6 @@ import java.util.Map; public interface ObjectPropertyDataPreprocessor { - public void preprocess(List> data); + public void process(List> data); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java index a4bc288c5..f1e16539b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java @@ -27,44 +27,6 @@ public class ObjectPropertyStatementTemplateModel extends BaseTemplateModel { this.data = data; } - /* This is a hopefully temporary solution to account for the fact that in the default - * object property list view we display the object's name and moniker, and these - * cannot be derived from a simple sparql query. - * - * The name is either the label, localName, or id, because context nodes do not have labels - * (and blank nodes do not have local names?). But in general we do not want to display context nodes - * in the property list view; we are only displaying them temporarily until custom list views - * are implemented. In general any object that we want to display in a custom view should have a label, - * and we can get that directly from the sparql query. Note that we can get the localName using an ARQ - * function: PREFIX afn: - * SELECT ?object (afn:localname(?object) AS ?localName) ... - * but it is harder (or impossible) to do what the individual.getName() function does in a SPARQL query. - * - * In the case of moniker, the Individual.getMoniker() returns the VClass if moniker is null. - * But moniker is a vitro namespace property which will be eliminated in a future version, - * and the get-vclass-if-no-moniker logic should be moved into the display modules where it belongs. - * In general any information that we would want to display in the custom list view should be obtained - * directly in the sparql query, and that should be generally true for custom queries and views. - * - * We could instead make these methods of the outer class that take a uri parameter, but then the template - * semantics is less intuitive: we would have ${statement.moniker(object)} rather than - * ${statement.object.name}, but the moniker is not a property of the statement. - * - * We don't want to put an Individual into the template model, because the beans wrapper used in IndividualController - * has exposure level EXPOSE_SAFE, due to the need to call methods with parameters rather than simple parameterless - * getters. We don't want to expose the Individual's setters to the template, so we wrap it in an individual that - * only has getters. - * - * RY *** Consider doing this only for the default query. The custom query can just store the data values as strings - * (uri, label, etc.). There should be no issues with label and moniker in a custom query (but is that true, or do - * some custom queries display the moniker?), and to handle url we can create a directive <@profileUrl individual=object /> - * where object is the object uri. This will get the WebappDaoFactory from the request and call - * UrlBuilder.getIndividualProfileUrl(String individualUri, WebappDaoFactory wdf). Equivalently, have a method of this - * object getProfileUrl(String uri), so in the template we call ${statement.profileUrl(object)} (but still the semantics - * is a bit weird, since the profile url doesn't belong to the statement). - */ - - /* Access methods for templates */ 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 1d1d37ca5..e79558751 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 @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; import java.io.File; +import java.lang.reflect.Constructor; import java.util.List; import java.util.Map; @@ -17,7 +18,6 @@ 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.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -25,6 +25,12 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class); private static final String TYPE = "object"; + /* NB The default preprocessor is not the same as the preprocessor for the default view. The latter + * actually defines its own preprocessor, whereas the default preprocessor is used for custom views + * that don't define a preprocessor. + */ + private static final String DEFAULT_PREPROCESSOR = + "edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.BaseObjectPropertyDataPreprocessor"; private PropertyListConfig config; @@ -66,21 +72,21 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel } } - /** Applies preprocessing to query results to prepare for template */ + /** Apply preprocessing to query results to prepare for template */ protected void preprocess(List> data, WebappDaoFactory wdf) { - /* First apply standard post-processing for all object properties */ - - // Add urls for link targets to the data - String linkTarget = config.linkTarget; - for (Map map : data) { - String targetUri = map.get(linkTarget); - if (targetUri != null) { - String targetUrl = UrlBuilder.getIndividualProfileUrl(targetUri, wdf); - map.put(linkTarget + "Url", targetUrl); - } + String preprocessorName = config.preprocessor; + if (preprocessorName == null) { + preprocessorName = DEFAULT_PREPROCESSOR; } - /* Then apply custom post-processing specified in config */ + try { + Class preprocessorClass = Class.forName(preprocessorName); + Constructor constructor = preprocessorClass.getConstructor(ObjectPropertyTemplateModel.class, WebappDaoFactory.class); + ObjectPropertyDataPreprocessor preprocessor = (ObjectPropertyDataPreprocessor) constructor.newInstance(this, wdf); + preprocessor.process(data); + } catch (Exception e) { + log.error(e, e); + } } private class PropertyListConfig { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/BaseObjectPropertyDataPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/BaseObjectPropertyDataPreprocessor.java deleted file mode 100644 index b77efecac..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/BaseObjectPropertyDataPreprocessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package edu.cornell.mannlib.vitro.webapp.web.templatemodels.preprocessors; - -import java.util.List; -import java.util.Map; - -public abstract class BaseObjectPropertyDataPreprocessor implements - ObjectPropertyDataPreprocessor { - - @Override - public abstract void preprocess(List> data); - - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/DefaultObjectPropertyDataPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/DefaultObjectPropertyDataPreprocessor.java deleted file mode 100644 index 9c8c28640..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/preprocessors/DefaultObjectPropertyDataPreprocessor.java +++ /dev/null @@ -1,17 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.web.templatemodels.preprocessors; - -import java.util.List; -import java.util.Map; - -public class DefaultObjectPropertyDataPreprocessor extends - BaseObjectPropertyDataPreprocessor { - - @Override - public void preprocess(List> data) { - // TODO Auto-generated method stub - - } - -} diff --git a/webapp/web/config/objectPropertyList-default.xml b/webapp/web/config/objectPropertyList-default.xml index f33109869..6715a2857 100644 --- a/webapp/web/config/objectPropertyList-default.xml +++ b/webapp/web/config/objectPropertyList-default.xml @@ -16,7 +16,7 @@ object - + edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.DefaultObjectPropertyDataPreprocessor \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl index 5140f8732..cca1f5628 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl @@ -35,7 +35,7 @@ <#-- data property --> <#if property.type == "data"> <#list property.statements as statement> -

${statement.value}

+
  • ${statement.value}
  • <#-- object property --> @@ -45,8 +45,7 @@ <#include "objectPropertyList-statements.ftl"> - - + - + diff --git a/webapp/web/templates/freemarker/body/partials/individual/shortView-default.ftl b/webapp/web/templates/freemarker/body/partials/individual/shortView-default.ftl index 808bde3c7..51f6228b4 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/shortView-default.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/shortView-default.ftl @@ -2,4 +2,4 @@ <#-- Default object property statement short view template --> -${statement.name!"object name here"} ${statement.moniker!"moniker here"} +${statement.name!} ${statement.moniker!}