hapifhir / org.hl7.fhir.core

Apache License 2.0
156 stars 157 forks source link

org.hl7.fhir.dstu3.model.MedicationAdministration does not copy a dosage.extension of type Duration #1723

Open matheisco opened 2 months ago

matheisco commented 2 months ago

Describe the bug .copy() of org.hl7.fhir.dstu3.model.MedicationAdministration does not copy a dosage.extension of type Duration

To Reproduce

Expected behavior The copy is exactly the same.

Environment

Additional context The culprit seems to be the missing Duration.copy() implementation. As I understand it, it was fixed for R4 in https://github.com/hapifhir/hapi-fhir/issues/1820, but the issue is still present for STU3

Code to reproduce:

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser;
import org.hl7.fhir.dstu3.model.Duration;
import org.hl7.fhir.dstu3.model.Extension;
import org.hl7.fhir.dstu3.model.MedicationAdministration;
import org.hl7.fhir.dstu3.model.SimpleQuantity;

import java.util.List;

public class MedicationAdministrationCopyDefect {

    public static void main(String[] ignoreMe) throws Exception {
        IParser parser = FhirContext.forDstu3().newJsonParser().setPrettyPrint(true);
        MedicationAdministration beforeCopy = createMedAdminWithDosageDurationExtension();
        MedicationAdministration afterCopy = beforeCopy.copy();

        System.out.println("---- BEFORE COPY (BEGIN)");
        System.out.println(parser.encodeResourceToString(beforeCopy));
        System.out.println("---- BEFORE COPY (END)");
        System.out.println();
        System.out.println("---- AFTER COPY (BEGIN)");
        System.out.println(parser.encodeResourceToString(afterCopy));
        System.out.println("---- AFTER COPY (END)");
    }

    private static MedicationAdministration createMedAdminWithDosageDurationExtension() {
        MedicationAdministration resource = new MedicationAdministration();
        resource.setId("12345");
        var dosage = new MedicationAdministration.MedicationAdministrationDosageComponent();
        dosage.setDose((SimpleQuantity) new SimpleQuantity().setValue(40))
                .setExtension(List.of(new Extension()
                        .setUrl("http://duration")
                        .setValue(new Duration().setValue(5340000))));
        resource.setDosage(dosage);
        return resource;
    }
}

Output:

---- BEFORE COPY (BEGIN)
{
  "resourceType": "MedicationAdministration",
  "id": "12345",
  "dosage": {
    "extension": [ {
      "url": "http://duration",
      "valueDuration": {
        "value": 5340000
      }
    } ],
    "dose": {
      "value": 40
    }
  }
}
---- BEFORE COPY (END)

---- AFTER COPY (BEGIN)
{
  "resourceType": "MedicationAdministration",
  "id": "12345",
  "dosage": {
    "dose": {
      "value": 40
    }
  }
}
---- AFTER COPY (END)
matheisco commented 1 month ago

Please consider fixing this bug, we rely on a correct copy implementation in production.