@@ -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