Skip to content

Commit d86ef5f

Browse files
Merge pull request #1947 from hapifhir/2025-03-gg-valueset-expansion
2025 03 gg valueset expansion
2 parents 811d981 + e56ffed commit d86ef5f

File tree

8 files changed

+288
-55
lines changed

8 files changed

+288
-55
lines changed

org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv43_50/resources43_50/Resource43_50.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ public org.hl7.fhir.r5.model.Resource convertResource(org.hl7.fhir.r4b.model.Res
248248
return StructureDefinition43_50.convertStructureDefinition((org.hl7.fhir.r4b.model.StructureDefinition) src);
249249
if (src instanceof org.hl7.fhir.r4b.model.StructureMap)
250250
return StructureMap43_50.convertStructureMap((org.hl7.fhir.r4b.model.StructureMap) src);
251+
if (src instanceof org.hl7.fhir.r4b.model.Subscription)
252+
return Subscription43_50.convertSubscription((org.hl7.fhir.r4b.model.Subscription) src);
251253
if (src instanceof org.hl7.fhir.r4b.model.SubscriptionStatus)
252254
return SubscriptionStatus43_50.convertSubscriptionStatus((org.hl7.fhir.r4b.model.SubscriptionStatus)src);
253255
if (src instanceof org.hl7.fhir.r4b.model.SubscriptionTopic)
@@ -486,6 +488,8 @@ public org.hl7.fhir.r4b.model.Resource convertResource(org.hl7.fhir.r5.model.Res
486488
return StructureDefinition43_50.convertStructureDefinition((org.hl7.fhir.r5.model.StructureDefinition) src);
487489
if (src instanceof org.hl7.fhir.r5.model.StructureMap)
488490
return StructureMap43_50.convertStructureMap((org.hl7.fhir.r5.model.StructureMap) src);
491+
if (src instanceof org.hl7.fhir.r5.model.Subscription)
492+
return Subscription43_50.convertSubscription((org.hl7.fhir.r5.model.Subscription) src);
489493
if (src instanceof org.hl7.fhir.r5.model.SubscriptionStatus)
490494
return SubscriptionStatus43_50.convertSubscriptionStatus((org.hl7.fhir.r5.model.SubscriptionStatus)src);
491495
if (src instanceof org.hl7.fhir.r5.model.SubscriptionTopic)
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package org.hl7.fhir.convertors.conv43_50.resources43_50;
2+
3+
import org.hl7.fhir.convertors.context.ConversionContext43_50;
4+
import org.hl7.fhir.convertors.conv43_50.datatypes43_50.general43_50.ContactPoint43_50;
5+
import org.hl7.fhir.convertors.conv43_50.datatypes43_50.primitive43_50.Instant43_50;
6+
import org.hl7.fhir.convertors.conv43_50.datatypes43_50.primitive43_50.String43_50;
7+
import org.hl7.fhir.exceptions.FHIRException;
8+
import org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus;
9+
import org.hl7.fhir.r5.model.Enumeration;
10+
import org.hl7.fhir.r5.model.Enumerations;
11+
import org.hl7.fhir.r5.model.Enumerations.SubscriptionStatusCodes;
12+
13+
/*
14+
Copyright (c) 2011+, HL7, Inc.
15+
All rights reserved.
16+
17+
Redistribution and use in source and binary forms, with or without modification,
18+
are permitted provided that the following conditions are met:
19+
20+
* Redistributions of source code must retain the above copyright notice, this
21+
list of conditions and the following disclaimer.
22+
* Redistributions in binary form must reproduce the above copyright notice,
23+
this list of conditions and the following disclaimer in the documentation
24+
and/or other materials provided with the distribution.
25+
* Neither the name of HL7 nor the names of its contributors may be used to
26+
endorse or promote products derived from this software without specific
27+
prior written permission.
28+
29+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
30+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32+
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
34+
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
35+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38+
POSSIBILITY OF SUCH DAMAGE.
39+
40+
*/
41+
// Generated on Sun, Feb 24, 2019 11:37+1100 for FHIR v4.0.0
42+
public class Subscription43_50 {
43+
44+
45+
public static org.hl7.fhir.r5.model.Subscription convertSubscription(org.hl7.fhir.r4b.model.Subscription src) throws FHIRException {
46+
if (src == null)
47+
return null;
48+
org.hl7.fhir.r5.model.Subscription tgt = new org.hl7.fhir.r5.model.Subscription();
49+
50+
ConversionContext43_50.INSTANCE.getVersionConvertor_43_50().copyDomainResource(src, tgt);
51+
52+
for (org.hl7.fhir.r4b.model.ContactPoint t : src.getContact()) {
53+
tgt.addContact(ContactPoint43_50.convertContactPoint(t));
54+
}
55+
56+
if (src.hasStatus()) {
57+
tgt.setStatusElement(convertStatus(src.getStatusElement()));
58+
}
59+
if (src.hasEnd()) {
60+
tgt.setEndElement(Instant43_50.convertInstant(src.getEndElement()));
61+
}
62+
if (src.hasReason()) {
63+
tgt.setReasonElement(String43_50.convertString(src.getReasonElement()));
64+
}
65+
66+
return tgt;
67+
}
68+
69+
70+
public static org.hl7.fhir.r4b.model.Subscription convertSubscription(org.hl7.fhir.r5.model.Subscription src) throws FHIRException {
71+
if (src == null)
72+
return null;
73+
org.hl7.fhir.r4b.model.Subscription tgt = new org.hl7.fhir.r4b.model.Subscription();
74+
75+
ConversionContext43_50.INSTANCE.getVersionConvertor_43_50().copyDomainResource(src, tgt);
76+
77+
for (org.hl7.fhir.r5.model.ContactPoint t : src.getContact()) {
78+
tgt.addContact(ContactPoint43_50.convertContactPoint(t));
79+
}
80+
81+
82+
if (src.hasStatus()) {
83+
tgt.setStatusElement(convertStatus(src.getStatusElement()));
84+
}
85+
if (src.hasEnd()) {
86+
tgt.setEndElement(Instant43_50.convertInstant(src.getEndElement()));
87+
}
88+
if (src.hasReason()) {
89+
tgt.setReasonElement(String43_50.convertString(src.getReasonElement()));
90+
}
91+
92+
return tgt;
93+
}
94+
95+
96+
private static Enumeration<SubscriptionStatusCodes> convertStatus(org.hl7.fhir.r4b.model.Enumeration<SubscriptionStatus> src) {
97+
if (src == null || src.isEmpty())
98+
return null;
99+
Enumeration<Enumerations.SubscriptionStatusCodes> tgt = new Enumeration<>(new Enumerations.SubscriptionStatusCodesEnumFactory());
100+
ConversionContext43_50.INSTANCE.getVersionConvertor_43_50().copyElement(src, tgt);
101+
if (src.getValue() == null) {
102+
tgt.setValue(null);
103+
} else {
104+
switch (src.getValue()) {
105+
case REQUESTED:
106+
tgt.setValue(Enumerations.SubscriptionStatusCodes.REQUESTED);
107+
break;
108+
case ACTIVE:
109+
tgt.setValue(Enumerations.SubscriptionStatusCodes.ACTIVE);
110+
break;
111+
case ERROR:
112+
tgt.setValue(Enumerations.SubscriptionStatusCodes.ERROR);
113+
break;
114+
case OFF:
115+
tgt.setValue(Enumerations.SubscriptionStatusCodes.OFF);
116+
break;
117+
default:
118+
tgt.setValue(Enumerations.SubscriptionStatusCodes.NULL);
119+
break;
120+
}
121+
}
122+
return tgt;
123+
}
124+
125+
private static org.hl7.fhir.r4b.model.Enumeration<SubscriptionStatus> convertStatus(Enumeration<SubscriptionStatusCodes> src) {
126+
if (src == null || src.isEmpty())
127+
return null;
128+
org.hl7.fhir.r4b.model.Enumeration<SubscriptionStatus> tgt = new org.hl7.fhir.r4b.model.Enumeration<>(new org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatusEnumFactory());
129+
ConversionContext43_50.INSTANCE.getVersionConvertor_43_50().copyElement(src, tgt);
130+
if (src.getValue() == null) {
131+
tgt.setValue(null);
132+
} else {
133+
switch (src.getValue()) {
134+
case REQUESTED:
135+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.REQUESTED);
136+
break;
137+
case ACTIVE:
138+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.ACTIVE);
139+
break;
140+
case ERROR:
141+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.ERROR);
142+
break;
143+
case OFF:
144+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.OFF);
145+
break;
146+
case ENTEREDINERROR:
147+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.OFF);
148+
break;
149+
default:
150+
tgt.setValue(org.hl7.fhir.r4b.model.Enumerations.SubscriptionStatus.NULL);
151+
break;
152+
}
153+
}
154+
return tgt;
155+
}
156+
157+
}

org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java

Lines changed: 94 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ private void generateExpansion(RenderingStatus status, ResourceWrapper res, Xhtm
317317
tr.td().b().addText(designations.get(url));
318318
}
319319
for (String lang : langs) {
320-
tr.td().b().addText(describeLang(lang));
320+
tr.td().b().addText(describeVSLang(lang, displang));
321321
}
322322
}
323323
}
@@ -355,6 +355,67 @@ private void generateExpansion(RenderingStatus status, ResourceWrapper res, Xhtm
355355

356356
}
357357

358+
protected String describeVSLang(String lang, String displang) {
359+
360+
// special cases:
361+
if ("fr-CA".equals(lang)) {
362+
return "French (Canadian)"; // this one was omitted from the value set
363+
}
364+
ValueSet v = getContext().getWorker().findTxResource(ValueSet.class, "http://hl7.org/fhir/ValueSet/languages");
365+
if (v != null) {
366+
ConceptReferenceComponent l = null;
367+
for (ConceptReferenceComponent cc : v.getCompose().getIncludeFirstRep().getConcept()) {
368+
if (cc.getCode().equals(lang))
369+
l = cc;
370+
}
371+
if (l == null) {
372+
if (lang.contains("-")) {
373+
lang = lang.substring(0, lang.indexOf("-"));
374+
}
375+
for (ConceptReferenceComponent cc : v.getCompose().getIncludeFirstRep().getConcept()) {
376+
if (cc.getCode().equals(lang)) {
377+
l = cc;
378+
break;
379+
}
380+
}
381+
if (l == null) {
382+
for (ConceptReferenceComponent cc : v.getCompose().getIncludeFirstRep().getConcept()) {
383+
if (cc.getCode().startsWith(lang+"-")) {
384+
l = cc;
385+
break;
386+
}
387+
}
388+
}
389+
}
390+
if (l != null) {
391+
if (lang.contains("-"))
392+
lang = lang.substring(0, lang.indexOf("-"));
393+
String en = l.getDisplay();
394+
String nativelang = null;
395+
for (ConceptReferenceDesignationComponent cd : l.getDesignation()) {
396+
if (cd.getLanguage().equals(lang))
397+
nativelang = cd.getValue();
398+
}
399+
return context.formatPhrase(langsMatch(lang, displang) ? RenderingContext.VALUE_SET_OTHER_DISPLAY : RenderingContext.TX_DISPLAY_LANG, nativelang == null ? en : nativelang);
400+
}
401+
}
402+
return lang;
403+
}
404+
405+
406+
private boolean langsMatch(String lang, String displang) {
407+
if (lang == null) {
408+
return displang == null;
409+
} else if (lang.equals(displang)) {
410+
return true;
411+
} else if (displang == null) {
412+
return false;
413+
} else {
414+
String l1 = lang.contains("-") ? lang.substring(0, lang.indexOf("-")) : lang;
415+
String l2 = displang.contains("-") ? displang.substring(0, displang.indexOf("-")) : displang;
416+
return l1.equals(l2);
417+
}
418+
}
358419

359420
private void scanForProperties(ValueSetExpansionComponent exp, List<String> langs, Map<String, String> properties) {
360421
properties.clear();
@@ -679,32 +740,32 @@ private String formatSCTDate(String ds) {
679740

680741
private String describeModule(String module) {
681742
switch (module) {
682-
case "900000000000207008" : context.formatPhrase(RenderingContext.VALUE_SET_INT);
683-
case "449081005" : context.formatPhrase(RenderingContext.VALUE_SET_SPAN);
684-
case "11000221109" : context.formatPhrase(RenderingContext.VALUE_SET_AR);
685-
case "32506021000036107" : context.formatPhrase(RenderingContext.VALUE_SET_AUS);
686-
case "11000234105" : context.formatPhrase(RenderingContext.VALUE_SET_AT);
687-
case "11000172109" : context.formatPhrase(RenderingContext.VALUE_SET_BE);
688-
case "20621000087109" : context.formatPhrase(RenderingContext.VALUE_SET_CA_EN);
689-
case "20611000087101" : context.formatPhrase(RenderingContext.VALUE_SET_CA_FR);
690-
case "554471000005108" : context.formatPhrase(RenderingContext.VALUE_SET_DANISH);
691-
case "11000181102 " : context.formatPhrase(RenderingContext.VALUE_SET_EE);
692-
case "11000229106" : context.formatPhrase(RenderingContext.VALUE_SET_FI);
693-
case "11000274103" : context.formatPhrase(RenderingContext.VALUE_SET_DE);
694-
case "1121000189102" : context.formatPhrase(RenderingContext.VALUE_SET_IN);
695-
case "11000220105" : context.formatPhrase(RenderingContext.VALUE_SET_IE);
696-
case "11000146104" : context.formatPhrase(RenderingContext.VALUE_SET_DUTCH);
697-
case "21000210109" : context.formatPhrase(RenderingContext.VALUE_SET_NZ);
698-
case "51000202101 " : context.formatPhrase(RenderingContext.VALUE_SET_NO);
699-
case "11000267109" : context.formatPhrase(RenderingContext.VALUE_SET_KR);
700-
case "900000001000122104" : context.formatPhrase(RenderingContext.VALUE_ES_ES);
701-
case "45991000052106" : context.formatPhrase(RenderingContext.VALUE_SET_SWEDISH);
702-
case "2011000195101" : context.formatPhrase(RenderingContext.VALUE_SET_CH);
703-
case "83821000000107" : context.formatPhrase(RenderingContext.VALUE_SET_UK);
704-
case "999000021000000109" : context.formatPhrase(RenderingContext.VALUE_SET_UK_CLIN);
705-
case "5631000179106" : context.formatPhrase(RenderingContext.VALUE_SET_UY);
706-
case "731000124108" : context.formatPhrase(RenderingContext.VALUE_SET_US);
707-
case "5991000124107" : context.formatPhrase(RenderingContext.VALUE_SET_US_ICD10CM);
743+
case "900000000000207008" : return context.formatPhrase(RenderingContext.VALUE_SET_INT);
744+
case "449081005" : return context.formatPhrase(RenderingContext.VALUE_SET_SPAN);
745+
case "11000221109" : return context.formatPhrase(RenderingContext.VALUE_SET_AR);
746+
case "32506021000036107" : return context.formatPhrase(RenderingContext.VALUE_SET_AUS);
747+
case "11000234105" : return context.formatPhrase(RenderingContext.VALUE_SET_AT);
748+
case "11000172109" : return context.formatPhrase(RenderingContext.VALUE_SET_BE);
749+
case "20621000087109" : return context.formatPhrase(RenderingContext.VALUE_SET_CA_EN);
750+
case "20611000087101" : return context.formatPhrase(RenderingContext.VALUE_SET_CA_FR);
751+
case "554471000005108" : return context.formatPhrase(RenderingContext.VALUE_SET_DANISH);
752+
case "11000181102 " : return context.formatPhrase(RenderingContext.VALUE_SET_EE);
753+
case "11000229106" : return context.formatPhrase(RenderingContext.VALUE_SET_FI);
754+
case "11000274103" : return context.formatPhrase(RenderingContext.VALUE_SET_DE);
755+
case "1121000189102" : return context.formatPhrase(RenderingContext.VALUE_SET_IN);
756+
case "11000220105" : return context.formatPhrase(RenderingContext.VALUE_SET_IE);
757+
case "11000146104" : return context.formatPhrase(RenderingContext.VALUE_SET_DUTCH);
758+
case "21000210109" : return context.formatPhrase(RenderingContext.VALUE_SET_NZ);
759+
case "51000202101 " : return context.formatPhrase(RenderingContext.VALUE_SET_NO);
760+
case "11000267109" : return context.formatPhrase(RenderingContext.VALUE_SET_KR);
761+
case "900000001000122104" : return context.formatPhrase(RenderingContext.VALUE_ES_ES);
762+
case "45991000052106" : return context.formatPhrase(RenderingContext.VALUE_SET_SWEDISH);
763+
case "2011000195101" : return context.formatPhrase(RenderingContext.VALUE_SET_CH);
764+
case "83821000000107" : return context.formatPhrase(RenderingContext.VALUE_SET_UK);
765+
case "999000021000000109" : return context.formatPhrase(RenderingContext.VALUE_SET_UK_CLIN);
766+
case "5631000179106" : return context.formatPhrase(RenderingContext.VALUE_SET_UY);
767+
case "731000124108" : return context.formatPhrase(RenderingContext.VALUE_SET_US);
768+
case "5991000124107" : return context.formatPhrase(RenderingContext.VALUE_SET_US_ICD10CM);
708769
default:
709770
return module;
710771
}
@@ -831,8 +892,10 @@ private void scanForDesignations(ValueSetExpansionContainsComponent c, List<Stri
831892
}
832893
for (ConceptReferenceDesignationComponent d : c.getDesignation()) {
833894
String lang = d.getLanguage();
834-
if (!Utilities.noString(lang) && !langs.contains(lang)) {
835-
langs.add(lang);
895+
if (!Utilities.noString(lang)) {
896+
if (!langs.contains(lang)) {
897+
langs.add(lang);
898+
}
836899
} else {
837900
// can we present this as a designation that we know?
838901
String disp = getDisplayForDesignation(d);
@@ -1208,6 +1271,8 @@ private String getDisplayForUrl(String url) {
12081271
return context.formatPhrase(RenderingContext.VALUE_SET_SPEC_NAME);
12091272
case "http://snomed.info/sct#900000000000013009":
12101273
return context.formatPhrase(RenderingContext.VALUE_SET_SYNONYM);
1274+
case "http://terminology.hl7.org/CodeSystem/designation-usage#display":
1275+
return context.formatPhrase(RenderingContext.VALUE_SET_OTHER_DISPLAY);
12111276
default:
12121277
// As specified in http://www.hl7.org/fhir/valueset-definitions.html#ValueSet.compose.include.concept.designation.use and in http://www.hl7.org/fhir/codesystem-definitions.html#CodeSystem.concept.designation.use the terminology binding is extensible.
12131278
return url;

org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/TerminologyCache.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,14 @@ public class SystemNameKeyGenerator {
214214
public String getNameForSystem(String system) {
215215
final int lastPipe = system.lastIndexOf('|');
216216
final String systemBaseName = lastPipe == -1 ? system : system.substring(0,lastPipe);
217-
final String systemVersion = lastPipe == -1 ? null : system.substring(lastPipe + 1);
217+
String systemVersion = lastPipe == -1 ? null : system.substring(lastPipe + 1);
218218

219+
if (systemVersion != null) {
220+
if (systemVersion.startsWith("http://snomed.info/sct/")) {
221+
systemVersion = systemVersion.substring(23);
222+
}
223+
systemVersion = systemVersion.replace(":", "").replace("/", "").replace("\\", "").replace("?", "").replace("$", "").replace("*", "").replace("#", "").replace("%", "");
224+
}
219225
if (systemBaseName.equals(SNOMED_SCT_CODESYSTEM_URL))
220226
return getVersionedSystem("snomed", systemVersion);
221227
if (systemBaseName.equals(RXNORM_CODESYSTEM_URL))

org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/i18n/RenderingI18nContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,7 @@ public class RenderingI18nContext extends I18nBase {
968968
public static final String DATA_REND_NIGHT = "DATA_REND_NIGHT";
969969
public static final String DATA_REND_AFTER_SLEEP = "DATA_REND_AFTER_SLEEP";
970970
public static final String DATA_REND_IMMEDIATE = "DATA_REND_IMMEDIATE";
971+
public static final String VALUE_SET_OTHER_DISPLAY = "VALUE_SET_OTHER_DISPLAY";
971972

972973
protected String getMessagesSourceFileName() {
973974
return "rendering-phrases";

0 commit comments

Comments
 (0)