Fixed MockMetadataConverter issue where multiple metadatavalues for a single metadatafield would get lost due to sorting issues

This commit is contained in:
Raf Ponsaerts
2019-10-25 13:54:08 +02:00
parent 11745fe69f
commit d66c3da752

View File

@@ -9,6 +9,7 @@ package org.dspace.app.rest.converter;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.SortedSet; import java.util.SortedSet;
@@ -42,26 +43,26 @@ public class MockMetadataConverter implements Converter<List<MockMetadataValue>,
@Override @Override
public MetadataRest convert(List<MockMetadataValue> metadataValueList) { public MetadataRest convert(List<MockMetadataValue> metadataValueList) {
// Convert each value to a DTO while retaining place order in a map of key -> SortedSet // Convert each value to a DTO while retaining place order in a map of key -> SortedSet
Map<String, SortedSet<MetadataValueRest>> mapOfSortedSets = new HashMap<>(); Map<String, List<MetadataValueRest>> mapOfLists = new HashMap<>();
for (MockMetadataValue metadataValue : metadataValueList) { for (MockMetadataValue metadataValue : metadataValueList) {
String key = metadataValue.getSchema() + "." + metadataValue.getElement(); String key = metadataValue.getSchema() + "." + metadataValue.getElement();
if (StringUtils.isNotBlank(metadataValue.getQualifier())) { if (StringUtils.isNotBlank(metadataValue.getQualifier())) {
key += "." + metadataValue.getQualifier(); key += "." + metadataValue.getQualifier();
} }
SortedSet<MetadataValueRest> set = mapOfSortedSets.get(key); List<MetadataValueRest> list = mapOfLists.get(key);
if (set == null) { if (list == null) {
set = new TreeSet<>(Comparator.comparingInt(MetadataValueRest::getPlace)); list = new LinkedList();
mapOfSortedSets.put(key, set); mapOfLists.put(key, list);
} }
set.add(valueConverter.convert(metadataValue)); list.add(valueConverter.convert(metadataValue));
} }
MetadataRest metadataRest = new MetadataRest(); MetadataRest metadataRest = new MetadataRest();
// Populate MetadataRest's map of key -> List while respecting SortedSet's order // Populate MetadataRest's map of key -> List while respecting SortedSet's order
Map<String, List<MetadataValueRest>> mapOfLists = metadataRest.getMap(); Map<String, List<MetadataValueRest>> metadataRestMap = metadataRest.getMap();
for (Map.Entry<String, SortedSet<MetadataValueRest>> entry : mapOfSortedSets.entrySet()) { for (Map.Entry<String, List<MetadataValueRest>> entry : mapOfLists.entrySet()) {
mapOfLists.put(entry.getKey(), entry.getValue().stream().collect(Collectors.toList())); metadataRestMap.put(entry.getKey(), entry.getValue().stream().collect(Collectors.toList()));
} }
return metadataRest; return metadataRest;