001package org.hl7.fhir.r5.utils;
002
003import org.hl7.fhir.r5.context.CanonicalResourceManager.CanonicalResourceProxy;
004import org.hl7.fhir.r5.model.ElementDefinition;
005import org.hl7.fhir.r5.model.Enumerations.BindingStrength;
006import org.hl7.fhir.r5.model.PackageInformation;
007import org.hl7.fhir.r5.model.StructureDefinition;
008
009public class PackageHackerR5 {
010
011  public static void fixLoadedResource(CanonicalResourceProxy r, PackageInformation packageInfo) {
012   if ("http://terminology.hl7.org/CodeSystem/v2-0391|2.6".equals(r.getUrl())) {
013     r.hack("http://terminology.hl7.org/CodeSystem/v2-0391-2.6", "2.6");
014   }
015   if ("http://terminology.hl7.org/CodeSystem/v2-0391|2.4".equals(r.getUrl())) {
016     r.hack("http://terminology.hl7.org/CodeSystem/v2-0391-2.4", "2.4");
017   }
018   if ("http://terminology.hl7.org/CodeSystem/v2-0360|2.7".equals(r.getUrl())) {
019     r.hack("http://terminology.hl7.org/CodeSystem/v2-0360-2.7", "2.7");
020   }
021
022   if ("http://terminology.hl7.org/CodeSystem/v2-0006|2.1".equals(r.getUrl())) {
023     r.hack("http://terminology.hl7.org/CodeSystem/v2-0006-2.1", "2.1");
024   }
025
026   if ("http://terminology.hl7.org/CodeSystem/v2-0360|2.7".equals(r.getUrl())) {
027     r.hack("http://terminology.hl7.org/CodeSystem/v2-0360-2.7", "2.7");
028   }
029
030   if ("http://terminology.hl7.org/CodeSystem/v2-0006|2.4".equals(r.getUrl())) {
031     r.hack("http://terminology.hl7.org/CodeSystem/v2-0006-2.4", "2.4");
032   }
033
034   if ("http://terminology.hl7.org/CodeSystem/v2-0360|2.3.1".equals(r.getUrl())) {
035     r.hack("http://terminology.hl7.org/CodeSystem/v2-0360-2.3.1", "2.3.1");
036   }
037
038   if ("http://hl7.org/fhir/StructureDefinition/iso21090-nullFlavor".equals(r.getUrl()) && "4.0.1".equals(r.getVersion())) {
039     StructureDefinition sd = (StructureDefinition) r.getResource();
040     for (ElementDefinition ed : sd.getSnapshot().getElement()) {
041       if (ed.hasBinding() && "http://terminology.hl7.org/ValueSet/v3-NullFlavor|4.0.1".equals(ed.getBinding().getValueSet())) {
042         ed.getBinding().setValueSet("http://terminology.hl7.org/ValueSet/v3-NullFlavor");
043       }
044     }
045     for (ElementDefinition ed : sd.getDifferential().getElement()) {
046       if (ed.hasBinding() && "http://terminology.hl7.org/ValueSet/v3-NullFlavor|4.0.1".equals(ed.getBinding().getValueSet())) {
047         ed.getBinding().setValueSet("http://terminology.hl7.org/ValueSet/v3-NullFlavor");
048       }
049     }
050   }
051   if ("http://hl7.org/fhir/StructureDefinition/DeviceUseStatement".equals(r.getUrl()) && "4.0.1".equals(r.getVersion())) {
052     StructureDefinition sd = (StructureDefinition) r.getResource();
053     for (ElementDefinition ed : sd.getSnapshot().getElement()) {
054       if (ed.hasRequirements()) {
055         ed.setRequirements(ed.getRequirements().replace("[http://hl7.org/fhir/StructureDefinition/bodySite](null.html)", "[http://hl7.org/fhir/StructureDefinition/bodySite](http://hl7.org/fhir/extension-bodysite.html)"));
056       }
057     }
058     for (ElementDefinition ed : sd.getDifferential().getElement()) {
059       if (ed.hasRequirements()) {
060         ed.setRequirements(ed.getRequirements().replace("[http://hl7.org/fhir/StructureDefinition/bodySite](null.html)", "[http://hl7.org/fhir/StructureDefinition/bodySite](http://hl7.org/fhir/extension-bodysite.html)"));
061       }
062     }
063   }
064   if (r.getUrl() != null && r.getUrl().startsWith("http://hl7.org/fhir/StructureDefinition/") && "StructureDefinition".equals(r.getType()) && "4.0.1".equals(r.getVersion())) {
065     // the R4 profile wrongly applies this value set to all types. Fixing it properly is too big a thing to do here, but we can at least back off the binding strength
066     StructureDefinition sd = (StructureDefinition) r.getResource();
067     if (sd.getType().equals("Observation") && ("http://hl7.org/fhir/StructureDefinition/vitalsigns".equals(sd.getUrl()) || "http://hl7.org/fhir/StructureDefinition/vitalsigns".equals(sd.getBaseDefinition()))) {
068       for (ElementDefinition ed : sd.getSnapshot().getElement()) {
069         if (ed.getPath().equals("Observation.component.value[x]") && ed.hasBinding() && "http://hl7.org/fhir/ValueSet/ucum-vitals-common|4.0.1".equals(ed.getBinding().getValueSet())) {
070           ed.getBinding().setStrength(BindingStrength.EXTENSIBLE);
071         }
072       }
073       for (ElementDefinition ed : sd.getDifferential().getElement()) {
074         if (ed.getPath().equals("Observation.component.value[x]") && ed.hasBinding() && "http://hl7.org/fhir/ValueSet/ucum-vitals-common|4.0.1".equals(ed.getBinding().getValueSet())) {
075           ed.getBinding().setStrength(BindingStrength.EXTENSIBLE);
076         }
077       }
078     }
079   }
080   if (r.hasUrl() && r.getUrl().contains("|")) {
081     assert false;
082   }
083   
084  }
085
086}