fix special case r5 loading of terminology to fix validation error on ExampleScenario

This commit is contained in:
Grahame Grieve 2024-10-30 21:04:05 +10:30
parent b683b0f778
commit 1100fe2855
1 changed files with 45 additions and 27 deletions

View File

@ -174,44 +174,62 @@ public class R5ExtensionsLoader {
for (ElementDefinition ed : sd.getSnapshot().getElement()) { for (ElementDefinition ed : sd.getSnapshot().getElement()) {
if (ed.hasBinding() && ed.getBinding().hasValueSet()) { if (ed.hasBinding() && ed.getBinding().hasValueSet()) {
String vsu = ed.getBinding().getValueSet(); String vsu = ed.getBinding().getValueSet();
ValueSet vs = context.fetchResource(ValueSet.class, vsu); ValueSet vs = valueSets.containsKey(vsu) ? valueSets.get(vsu).getResource() : null;
if (vs == null) { if (vs != null) {
loadValueSet(vsu, context, valueSets, codeSystems); vsu = makeR5Url(vsu);
} else if (vs.hasVersion()) { ed.getBinding().setValueSet(vsu);
ed.getBinding().setValueSet(vs.getUrl()+"|"+vs.getVersion()); if (!context.hasResource(ValueSet.class, vsu)) {
vs.setUrl(removeVersion(vsu));
loadValueSet(vs, context, valueSets, codeSystems);
}
} }
} }
} }
} }
private void loadValueSet(String url, IWorkerContext context, Map<String, Loadable<ValueSet>> valueSets, Map<String, Loadable<CodeSystem>> codeSystems) throws FHIRFormatError, FileNotFoundException, IOException { private String removeVersion(String url) {
if (valueSets.containsKey(url)) { if (url.contains("|")) {
ValueSet vs = valueSets.get(url).getResource(); url = url.substring(0, url.indexOf("|"));
context.cacheResourceFromPackage(vs, vs.getSourcePackage()); }
for (ConceptSetComponent inc : vs.getCompose().getInclude()) { return url;
for (CanonicalType t : inc.getValueSet()) { }
ValueSet vsi = context.fetchResource(ValueSet.class, t.getValue());
if (vsi == null) { private String makeR5Url(String url) {
loadValueSet(t.asStringValue(), context, valueSets, codeSystems); return url.replace("/fhir/", "/fhir/5.0/");
}
private void loadValueSet(ValueSet vs, IWorkerContext context, Map<String, Loadable<ValueSet>> valueSets, Map<String, Loadable<CodeSystem>> codeSystems) throws FHIRFormatError, FileNotFoundException, IOException {
context.cacheResourceFromPackage(vs, vs.getSourcePackage());
for (ConceptSetComponent inc : vs.getCompose().getInclude()) {
for (CanonicalType t : inc.getValueSet()) {
String vsu = t.getValue();
ValueSet vsi = valueSets.containsKey(vsu) ? valueSets.get(vsu).getResource() : null;
if (vsi != null) {
vsu = makeR5Url(vsu);
t.setValue(vsu);
vsi.setUrl(vsu);
if (!context.hasResource(ValueSet.class, vsu)) {
loadValueSet(vsi, context, valueSets, codeSystems);
} }
} }
if (inc.hasSystem()) { }
if (!inc.hasVersion()) { if (inc.hasSystem()) {
if (codeSystems.containsKey(inc.getSystem())) { CodeSystem cs;
CodeSystem cs = codeSystems.get(inc.getSystem()).getResource(); if (inc.hasVersion()) {
CodeSystem csAlready = context.fetchCodeSystem(inc.getSystem()); cs = codeSystems.containsKey(inc.getSystem()+"|"+inc.getVersion()) ? codeSystems.get(inc.getSystem()+"|"+inc.getVersion()).getResource() : null;
if (csAlready == null) { } else {
context.cacheResourceFromPackage(cs, cs.getSourcePackage()); cs = codeSystems.containsKey(inc.getSystem()) ? codeSystems.get(inc.getSystem()).getResource() : null;
} }
} if (cs != null) {
} else if (context.fetchResource(CodeSystem.class, inc.getSystem(), inc.getVersion()) == null && codeSystems.containsKey(inc.getSystem()+"|"+inc.getVersion())) { String csu = makeR5Url(inc.getSystem());
CodeSystem cs1 = codeSystems.get(inc.getSystem()+"|"+inc.getVersion()).getResource(); cs.setUrl(csu);
context.cacheResourceFromPackage(cs1, cs1.getSourcePackage()); inc.setSystem(csu);
if (!context.hasResource(CodeSystem.class, csu)) {
context.cacheResourceFromPackage(cs, cs.getSourcePackage());
} }
} }
} }
} }
} }
private boolean survivesStrippingTypes(StructureDefinition sd, IWorkerContext context, List<String> typeNames) { private boolean survivesStrippingTypes(StructureDefinition sd, IWorkerContext context, List<String> typeNames) {