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();