From 675adfab19042604a5d431ab1a831377236c9cc3 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Mon, 3 Jan 2011 22:34:17 +0000 Subject: [PATCH] NIHVIVO-1491 Display of overview and research areas on person profile page --- .../freemarker/FreemarkerHttpServlet.java | 7 ++++ .../freemarker/IndividualController.java | 3 +- .../individual/DataPropertyTemplateModel.java | 6 +++ .../individual/GroupedPropertyList.java | 38 ++++++++---------- .../individual/IndividualTemplateModel.java | 6 ++- .../freemarker/body/individual/individual.ftl | 27 +++++++++---- .../individual/individual-properties.ftl | 39 +++---------------- .../partials/individual/lib-properties.ftl | 37 ++++++++++++++++++ .../individual/propStatement-simple.ftl | 5 +++ 9 files changed, 102 insertions(+), 66 deletions(-) create mode 100644 webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl create mode 100644 webapp/web/templates/freemarker/body/partials/individual/propStatement-simple.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index d96eb23df..1ff0649da 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -325,6 +325,12 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { return map; } + protected Map getMethods() { + Map map = new HashMap(); + map.put("url", new edu.cornell.mannlib.vitro.webapp.web.functions.IndividualProfileUrlMethod()); + return map; + } + // Add variables that should be available only to the page's root map, not to the body. // RY This is protected instead of private so FreeMarkerComponentGenerator can access. // Once we don't need that (i.e., jsps have been eliminated) we can make it private. @@ -356,6 +362,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { map.put("currentPage", vreq.getServletPath().replaceFirst("/", "")); map.putAll(getDirectives()); + map.putAll(getMethods()); map.put("tabMenu", getTabMenu(vreq)); map.put("menu", getDisplayModelMenu(vreq)); 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 4c55d8b4c..1fb9e19ac 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 @@ -128,8 +128,7 @@ public class IndividualController extends FreemarkerHttpServlet { * into the data model: no real data can be modified. */ 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/web/templatemodels/individual/DataPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java index a9f366f76..17ba27135 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java @@ -63,5 +63,11 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { public List getStatements() { return statements; } + + // Allows the template to display a data value for a single property, when there is expected to be + // only a single value for the property. + public String getValue() { + return statements.get(0).getValue(); + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java index 183c9fe8a..4c96cc9f5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java @@ -30,7 +30,11 @@ import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; /* public class GroupedPropertyList extends ArrayList { If this class extends a List type, Freemarker does not let the templates call methods -on it. +on it. Since the class must then contain a list rather than be a list, the template +syntax is less idiomatic: e.g., groups.all rather than simply groups. An alternative +is to make the get methods (getProperty and getPropertyAndRemoveFromList) methods +of the IndividualTemplateModel. Then this class doesn't need methods, and can extend +a List type. */ public class GroupedPropertyList extends BaseTemplateModel { @@ -385,43 +389,35 @@ public class GroupedPropertyList extends BaseTemplateModel { } public PropertyTemplateModel getProperty(String propertyUri) { - - PropertyTemplateModel propertyTemplateModel = null; - - groupLoop: for (PropertyGroupTemplateModel pgtm : groups) { + + for (PropertyGroupTemplateModel pgtm : groups) { List properties = pgtm.getProperties(); for (PropertyTemplateModel ptm : properties) { if (propertyUri.equals(ptm.getUri())) { - propertyTemplateModel = ptm; - break groupLoop; + return ptm; } } - } - - return propertyTemplateModel; + } + return null; } public PropertyTemplateModel getPropertyAndRemoveFromList(String propertyUri) { - - PropertyTemplateModel propertyTemplateModel = null; - - groupLoop: for (PropertyGroupTemplateModel pgtm : groups) { + + for (PropertyGroupTemplateModel pgtm : groups) { List properties = pgtm.getProperties(); for (PropertyTemplateModel ptm : properties) { - if (propertyUri.equals(ptm.getUri())) { - propertyTemplateModel = ptm; + if (propertyUri.equals(ptm.getUri())) { // Remove the property from the group properties.remove(ptm); // If this is the only property in the group, remove the group as well if (properties.size() == 0) { - groups.remove(pgtm); + groups.remove(pgtm); } - break groupLoop; + return ptm; } } - } - - return propertyTemplateModel; + } + return null; } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java index 7f272e678..df5eb668b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java @@ -31,6 +31,7 @@ public class IndividualTemplateModel extends BaseTemplateModel { protected Individual individual; protected VitroRequest vreq; protected UrlBuilder urlBuilder; + protected GroupedPropertyList propertyList = null; public IndividualTemplateModel(Individual individual, VitroRequest vreq) { this.individual = individual; @@ -123,7 +124,10 @@ public class IndividualTemplateModel extends BaseTemplateModel { } public GroupedPropertyList getPropertyList() { - return new GroupedPropertyList(individual, vreq); + if (propertyList == null) { + propertyList = new GroupedPropertyList(individual, vreq); + } + return propertyList; } /* These methods simply forward to the methods of the wrapped individual. It would be desirable to diff --git a/webapp/web/templates/freemarker/body/individual/individual.ftl b/webapp/web/templates/freemarker/body/individual/individual.ftl index dde474fe8..8a008c50c 100644 --- a/webapp/web/templates/freemarker/body/individual/individual.ftl +++ b/webapp/web/templates/freemarker/body/individual/individual.ftl @@ -2,7 +2,11 @@ <#-- Template for individual profile page --> +<#-- RY This is actually the person profile page, but we cannot move it to its proper location until selection of template by +annotaiton has been implemented. --> + <#import "lib-list.ftl" as l> +<#import "lib-properties.ftl" as p> <#assign editingClass> <#if editStatus.showEditLinks>editing<#else> @@ -70,15 +74,22 @@ -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed est erat, tristique non bibendum eu, mollis non est. Cras vehicula velit quis elit porta vel molestie tellus blandit. Donec eget magna dolor. Phasellus faucibus mollis lorem at dapibus. Sed ultricies lobortis mauris in volutpat. Cras mattis neque ut sapien pellentesque fringilla. Mauris posuere dui quis massa mattis id mollis nibh accumsan. [+]

+ <#-- Overview --> + <#assign overview = propertyGroups.getPropertyAndRemoveFromList("http://vivoweb.org/ontology/core#overview")> + <#if overview?has_content> +

${overview.value}

+ -

Research Areas

- - + <#-- Research Areas --> + <#assign researchAreas = propertyGroups.getPropertyAndRemoveFromList("http://vivoweb.org/ontology/core#hasResearchArea")> + <#if researchAreas?has_content> +

Research Areas

+ +
    + <@p.objectProperty researchAreas /> +
+ + 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 23dff1ec7..1685cf6fe 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl @@ -2,6 +2,8 @@ <#-- Template for property listing on individual profile page --> +<#import "lib-properties.ftl" as p> + <#list propertyGroups.all as group> <#assign groupname = group.name(nameForOtherGroup)> @@ -28,13 +30,13 @@
    <#-- data property --> <#if property.type == "data"> - <@dataPropertyList property.statements /> + <@p.dataPropertyList property.statements /> <#-- object property --> <#elseif property.collatedBySubclass> <#-- collated --> - <@collatedObjectPropertyList property /> + <@p.collatedObjectPropertyList property /> <#else> <#-- uncollated --> - <@objectPropertyList property.statements property.template /> + <@p.objectPropertyList property.statements property.template />
@@ -42,34 +44,3 @@ -<#----------------------------------------------------------------------------- - Macros for generating property lists -------------------------------------------------------------------------------> - -<#macro dataPropertyList statements> - <#list statements as statement> - <@propertyListItem>${statement.value} - - - -<#macro collatedObjectPropertyList property> - <#assign subclasses = property.subclasses> - <#list subclasses?keys as subclass> -
  • -

    ${subclass?lower_case}

    -
      - <@objectPropertyList subclasses[subclass] property.template /> -
    -
  • - - - -<#macro objectPropertyList statements template> - <#list statements as statement> - <@propertyListItem><#include "${template}"> - - - -<#macro propertyListItem> -
  • <#nested>
  • - \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl new file mode 100644 index 000000000..3fe59fedd --- /dev/null +++ b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl @@ -0,0 +1,37 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#----------------------------------------------------------------------------- + Macros for generating property lists +------------------------------------------------------------------------------> + +<#macro dataPropertyList statements> + <#list statements as statement> + <@propertyListItem>${statement.value} + + + +<#macro collatedObjectPropertyList property> + <#assign subclasses = property.subclasses> + <#list subclasses?keys as subclass> +
  • +

    ${subclass?lower_case}

    +
      + <@objectPropertyList subclasses[subclass] property.template /> +
    +
  • + + + +<#macro objectProperty property> + <@objectPropertyList property.statements "propStatement-simple.ftl" /> + + +<#macro objectPropertyList statements template> + <#list statements as statement> + <@propertyListItem><#include "${template}"> + + + +<#macro propertyListItem> +
  • <#nested>
  • + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/individual/propStatement-simple.ftl b/webapp/web/templates/freemarker/body/partials/individual/propStatement-simple.ftl new file mode 100644 index 000000000..e1bffd918 --- /dev/null +++ b/webapp/web/templates/freemarker/body/partials/individual/propStatement-simple.ftl @@ -0,0 +1,5 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- Simple object property statement template --> + +${statement.name!}