From 6d06c76e05eb7fc15fce9f3e929eaeae8195ede0 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Wed, 22 Dec 2010 22:17:07 +0000 Subject: [PATCH] NIHVIVO-1335, NIHVIVO-1510 Working on authorship list view and collated object properties: some reorganization to handle collated properties, but not displaying as collated yet. --- .../CollatedObjectPropertyTemplateModel.java | 74 +++++++++++++++---- .../ObjectPropertyTemplateModel.java | 7 ++ webapp/web/config/listViewConfig-default.xml | 2 + .../freemarker/body/individual/individual.ftl | 12 ++- .../individual/individual-properties.ftl | 37 +++++++++- .../objectPropertyList-collated.ftl | 7 +- .../objectPropertyList-statements.ftl | 2 +- .../objectPropertyList-uncollated.ftl | 6 ++ 8 files changed, 118 insertions(+), 29 deletions(-) create mode 100644 webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-uncollated.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java index 04411bf7b..9ec7b8723 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java @@ -2,9 +2,13 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; +import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,17 +20,24 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; +import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel { private static final Log log = LogFactory.getLog(CollatedObjectPropertyTemplateModel.class); - private Map> subclasses; + private SortedMap> subclasses; CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) throws Exception { super(op, subject, vreq); + // RY Temporarily throw an error because collation hasn't been implemented yet. + boolean error = true; + if (error) { + throw new Exception("Collated object property not implemented yet"); + } + /* Change the approach to collation: * Custom views can get the subclasses in the query. Must use a term ?subclass - throw error if not. * Default view: we may be able to figure out the class to get subclasses of by inspecting the property. @@ -36,27 +47,58 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM * in the query. (The reverse is okay - uncollated property with a subclass term in the query. */ - // RY Temporarily throw an error because collation hasn't been implemented yet. - boolean error = true; - if (error) { - throw new Exception("Collated object property not implemented yet"); - } - WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectPropertyStatementDao opDao = wdf.getObjectPropertyStatementDao(); String subjectUri = subject.getURI(); String propertyUri = op.getURI(); List> statementData = opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getQueryString()); - subclasses = new HashMap>(statementData.size()); -// for (Map map : statementData) { -// statements.add(new ObjectPropertyStatementTemplateModel(subjectUri, propertyUri, map, wdf)); -// } -// if (statementData.size() > 0) { -// String collationTarget = getCollationTarget(); -// List vclasses = getDirectVClasses(collationTarget, statementData); -// } + Map> unsortedSubclasses = hasCustomListView() ? + collateCustomListView(subjectUri, propertyUri, statementData, vreq) : + collateDefaultListView(subjectUri, propertyUri, statementData, vreq); + + /* Sort by subclass name */ + Comparator comparer = new Comparator() { + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + }}; + subclasses = new TreeMap>(comparer); + subclasses.putAll(unsortedSubclasses); + } + + private Map> collateCustomListView(String subjectUri, + String propertyUri, List> statementData, VitroRequest vreq) { + + Map> unsortedSubclasses = + new HashMap>(); + String currentSubclassUri = null; + List currentList = null; + for (Map map : statementData) { + String subclassUri = map.get("subclass"); + if (!subclassUri.equals(currentSubclassUri)) { + currentSubclassUri = subclassUri; + currentList = new ArrayList(); + String subclassName = getSubclassName(subclassUri, vreq); + unsortedSubclasses.put(subclassName, currentList); + } + currentList.add(new ObjectPropertyStatementTemplateModel(subjectUri, propertyUri, map)); + } + return unsortedSubclasses; + } + + private Map> collateDefaultListView(String subjectUri, + String propertyUri, List> statementData, VitroRequest vreq) { + Map> unsortedSubclasses = + new HashMap>(); + return unsortedSubclasses; + } + + private String getSubclassName(String subclassUri, VitroRequest vreq) { + VClassDao vclassDao = vreq.getWebappDaoFactory().getVClassDao(); + VClass vclass = vclassDao.getVClassByURI(subclassUri); + return vclass.getName(); } private String getCollationTargetError() { @@ -84,7 +126,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM /* Access methods for templates */ - public Map> getCollatedStatements() { + public Map> getSubclasses() { return subclasses; } 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 15a92a916..7fb3b3145 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 @@ -53,6 +53,10 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel return config.collationTarget; } + protected boolean hasCustomListView() { + return !config.isDefaultConfig; + } + protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) { if (op.getCollateBySubclass()) { try { @@ -92,6 +96,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private static final String NODE_NAME_COLLATION_TARGET = "collation-target"; private static final String NODE_NAME_POSTPROCESSOR = "postprocessor"; + private boolean isDefaultConfig; private String queryString; private String templateName; private String collationTarget; @@ -134,6 +139,8 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel setValuesFromConfigFile(configFilePath); } } + + isDefaultConfig = isDefaultConfig(configFileName); } private boolean isDefaultConfig(String configFileName) { diff --git a/webapp/web/config/listViewConfig-default.xml b/webapp/web/config/listViewConfig-default.xml index 97767e403..d8b272141 100644 --- a/webapp/web/config/listViewConfig-default.xml +++ b/webapp/web/config/listViewConfig-default.xml @@ -15,6 +15,8 @@ ?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. + - Each assertion or set of optional assertions must reference a different graph variable, so that + we do not impose a requirement about which assertions are in the same graph. --> diff --git a/webapp/web/templates/freemarker/body/individual/individual.ftl b/webapp/web/templates/freemarker/body/individual/individual.ftl index 0af2975b1..b2f0fc6c9 100644 --- a/webapp/web/templates/freemarker/body/individual/individual.ftl +++ b/webapp/web/templates/freemarker/body/individual/individual.ftl @@ -37,13 +37,11 @@ <#-- Links --> 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 e0b416b11..81a030310 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl @@ -7,7 +7,11 @@ <#assign groupname = group.name(nameForOtherGroup)>
- + <#-- Display the group heading --> <#if groupname?has_content> @@ -24,16 +28,41 @@
    <#-- data property --> <#if property.type == "data"> - <#include "dataPropertyList-statements.ftl"> + <@dataPropertyList property.statements /> <#-- object property --> <#elseif property.collatedBySubclass> - <#include "objectPropertyList-collated.ftl"> + <@objectPropertySubclassList property /> <#else> - <#include "objectPropertyList-statements.ftl"> + <@objectPropertyList property.statements property.template />
+ +<#----------------------------------------------------------------------------- + Macros for generating property lists +------------------------------------------------------------------------------> + +<#macro dataPropertyList statements> + <#list statements as statement> +
  • ${statement.value}
  • + + + +<#macro objectPropertySubclassList property> + <#list property.subclasses as subclass> +

    ${subclass}

    + <@objectPropertyList subclass.statements property.template /> + + + +<#macro objectPropertyList statements template> + <#list statements as statement> +
  • + <#include "${template}"> +
  • + + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-collated.ftl b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-collated.ftl index 4b694457e..4e776ec34 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-collated.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-collated.ftl @@ -2,4 +2,9 @@ <#-- Template for collated object property statement list --> -

    Display of collated object property statements is in progress.

    \ No newline at end of file +

    Display of collated object property statements is in progress.

    + +<#list property.subclasses as subclass> +

    ${subclass}

    + <@listStatements subclass.statements /> + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-statements.ftl b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-statements.ftl index ed5f5607d..e1eff4079 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-statements.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-statements.ftl @@ -2,7 +2,7 @@ <#-- Template to list statements for an object property --> -<#list property.statements as statement> +<#list statements as statement>
  • <#include "${property.template}">
  • diff --git a/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-uncollated.ftl b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-uncollated.ftl new file mode 100644 index 000000000..a4d6c1a31 --- /dev/null +++ b/webapp/web/templates/freemarker/body/partials/individual/objectPropertyList-uncollated.ftl @@ -0,0 +1,6 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- Template for uncollated object property statement list --> + +<#assign statements = property.statements> +<#include "objectPropertyList-statements.ftl"> \ No newline at end of file