Skip to content

Commit f5a5c22

Browse files
authored
Retain term definitions order in ADL1.4 converter (#769)
1 parent b3802be commit f5a5c22

1 file changed

Lines changed: 23 additions & 20 deletions

File tree

aom/src/main/java/com/nedap/archie/adl14/ADL14NodeIDConverter.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -152,29 +152,32 @@ private List<String> findUnnecessaryCodes(CObject cObject, Map<String, Archetype
152152
* Replace old id's in term definition with the new codes
153153
*/
154154
public static void convertTermDefinitions(Archetype archetype, Map<String, ConvertedCodeResult> convertedCodes, List<String> unnecessaryCodes) {
155-
//process the codes in alphabetical order, high to low, to prevent overwriting codes
156-
//even better would probably be to create an empty terminology and separate all new+converted codes and old codes
157-
//instead of doing this in place. Worth a refactor perhaps?
158-
ArrayList<ConvertedCodeResult> sortedCodes = new ArrayList<>(convertedCodes.values());
159-
Comparator<ConvertedCodeResult> comparator = Comparator.comparing(ConvertedCodeResult::getOriginalCode);
160-
sortedCodes.sort(comparator.reversed());
161-
162-
for (ConvertedCodeResult convertedCode : sortedCodes) {
163-
for (String language : archetype.getTerminology().getTermDefinitions().keySet()) {
164-
Map<String, ArchetypeTerm> terms = archetype.getTerminology().getTermDefinitions().get(language);
165-
ArchetypeTerm term = terms.remove(convertedCode.getOriginalCode());
166-
if (term != null && !unnecessaryCodes.contains(convertedCode.getOriginalCode())) {
167-
for (String newCode : convertedCode.getConvertedCodes()) {
168-
ArchetypeTerm newTerm = new ArchetypeTerm();
169-
newTerm.setCode(newCode);
170-
newTerm.setText(term.getText());
171-
newTerm.setDescription(term.getDescription());
172-
newTerm.putAll(term.getOtherItems());
173-
terms.put(newCode, term);
155+
archetype.getTerminology().getTermDefinitions().replaceAll((language, terms) -> {
156+
Map<String, ArchetypeTerm> newTerms = new LinkedHashMap<>();
157+
158+
for (Map.Entry<String, ArchetypeTerm> entry : terms.entrySet()) {
159+
String oldCode = entry.getKey();
160+
if (!unnecessaryCodes.contains(oldCode)) {
161+
ArchetypeTerm term = entry.getValue();
162+
ConvertedCodeResult convertedCode = convertedCodes.get(oldCode);
163+
if (convertedCode != null) {
164+
for (String newCode : convertedCode.getConvertedCodes()) {
165+
ArchetypeTerm newTerm = new ArchetypeTerm();
166+
newTerm.setCode(newCode);
167+
newTerm.setText(term.getText());
168+
newTerm.setDescription(term.getDescription());
169+
newTerm.putAll(term.getOtherItems());
170+
newTerms.put(newCode, newTerm);
171+
}
172+
} else {
173+
// Code is not converted, copy it.
174+
newTerms.put(oldCode, term);
174175
}
175176
}
176177
}
177-
}
178+
179+
return newTerms;
180+
});
178181

179182
//the terminology can still contain old unused codes now. The archetype validation will warn about that later
180183
}

0 commit comments

Comments
 (0)