From 66b02af3e800194c74fd783551140b96e032400d Mon Sep 17 00:00:00 2001 From: ryounes Date: Mon, 2 May 2011 19:45:25 +0000 Subject: [PATCH] NIHVIVO-2573 Collated object property statement deduping must preserve the ordering by subclass of the remaining statements, since the collate method assumes statements are ordered by subclass, and will otherwise result in dropping statements. --- .../CollatedObjectPropertyTemplateModel.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) 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 042e3fc79..4a4b4c9e4 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 @@ -67,12 +67,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM postprocess(statementData, wdf); /* Collate the data */ - Map> unsortedSubclasses = - collate(subjectUri, propertyUri, statementData, vreq, policyHelper); - - /* Sort by subclass name */ - subclasses = new TreeMap>(); - subclasses.putAll(unsortedSubclasses); + subclasses = collate(subjectUri, propertyUri, statementData, vreq, policyHelper); for (List list : subclasses.values()) { postprocessStatementList(list); @@ -129,7 +124,9 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM logData(statementData); } - List> filteredList = new ArrayList>(); + // Compile a list of the statements with less specific subclasses, which should be removed + // from the statement data + List> statementsToRemove = new ArrayList>(); Set processedObjects = new HashSet(); for (Map outerMap : statementData) { String objectUri = outerMap.get(objectVariableName); @@ -144,12 +141,17 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM } } // Sort the data for this object from most to least specific subclass, with nulls at end - Collections.sort(dataForThisObject, new SubclassComparator(wdf)); - filteredList.add(dataForThisObject.get(0)); + Collections.sort(dataForThisObject, new SubclassComparator(wdf)); + dataForThisObject.remove(0); // Keep only the first one (most specific subclass) + statementsToRemove.addAll(dataForThisObject); } - statementData.clear(); - statementData.addAll(filteredList); + // We remove statements from the original list, rather than returning a new list, + // in order to preserve the subclass orderings, since the collation depends on the + // statements being ordered first by subclass. + for (Map map : statementsToRemove) { + statementData.remove(map); + } if (log.isDebugEnabled()) { log.debug("Data after subclass filtering"); @@ -201,11 +203,13 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM } } - private Map> collate(String subjectUri, String propertyUri, + // Collate the statements by subclass. NB It is assumed that the statements in statementData + // are ordered by subclass. + private SortedMap> collate(String subjectUri, String propertyUri, List> statementData, VitroRequest vreq, EditingPolicyHelper policyHelper) { - Map> subclassMap = - new HashMap>(); + SortedMap> subclassMap = + new TreeMap>(); String currentSubclassUri = null; List currentList = null; String objectKey = getObjectKey();