diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/mapping/ResourceMapperInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/mapping/ResourceMapperInstrumentedTest.kt index d036cc5859..269d964478 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/mapping/ResourceMapperInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/mapping/ResourceMapperInstrumentedTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -116,7 +116,7 @@ class ResourceMapperInstrumentedTest { val dateTimeType = patient .getExtensionByUrl( - "http://fhir.org/guides/who/core/StructureDefinition/who-patient#Patient.birthTime", + "http://hl7.org/fhir/StructureDefinition/patient-birthTime", ) .value as DateTimeType val expectedDateTimeType = DateTimeType("2022-02-07T13:28:17-05:00") @@ -138,7 +138,7 @@ class ResourceMapperInstrumentedTest { assertThat(patient).isNotNull() assertThat( patient.getExtensionByUrl( - "http://fhir.org/guides/who/core/StructureDefinition/who-patient#Patient.birthTime", + "http://hl7.org/fhir/StructureDefinition/patient-birthTime", ), ) .isEqualTo(null) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt index f1f47495e9..f2d75829e2 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt @@ -43,6 +43,7 @@ import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.DecimalType import org.hl7.fhir.r4.model.DomainResource +import org.hl7.fhir.r4.model.ElementDefinition import org.hl7.fhir.r4.model.Enumeration import org.hl7.fhir.r4.model.Expression import org.hl7.fhir.r4.model.Extension @@ -476,41 +477,46 @@ object ResourceMapper { questionnaireItem.definition.lastIndexOf("#") + 1, questionnaireItem.definition.lastIndexOf("."), ) - if ( - isExtensionSupportedByProfile( + val extensionElementDefinition = + getExtensionElementDefinitionOrNull( structureDefinition = it, extensionForType = extensionForType, fieldName = fieldName, ) - ) { - addDefinitionBasedCustomExtension(questionnaireItem, questionnaireResponseItem, base) - return - } else { + if (extensionElementDefinition == null) { Timber.w( "Extension for field '$fieldName' is not defined in StructureDefinition of ${base.fhirType()}, so field is ignored", ) + } else { + addDefinitionBasedCustomExtension( + questionnaireItem, + questionnaireResponseItem, + base, + fieldName, + extensionElementDefinition, + ) } } } } } -private fun isExtensionSupportedByProfile( +private fun getExtensionElementDefinitionOrNull( structureDefinition: StructureDefinition, extensionForType: String, fieldName: String, -): Boolean { +): ElementDefinition? { // Partial ElementDefinition from StructureDefinition to check extension is // "id": "Patient.address.extension:address-preferred", // "path": "Patient.address.extension", val listOfElementDefinition = structureDefinition.snapshot.element.filter { it.path.equals("$extensionForType.extension") } listOfElementDefinition.forEach { - if (it.id.substringAfterLast(":").equals(fieldName)) { - return true + if (it.id.substringAfterLast(":") == fieldName) { + return it } } - return false + return null } /** @@ -519,6 +525,8 @@ private fun isExtensionSupportedByProfile( * @param questionnaireItem QuestionnaireItemComponent with details for extension * @param questionnaireResponseItem QuestionnaireResponseItemComponent for response value * @param base + * @param fieldName + * @param elementDefinition * - resource's Base class instance See * https://hapifhir.io/hapi-fhir/docs/model/profiles_and_extensions.html#extensions for more on * custom extensions @@ -527,22 +535,24 @@ private fun addDefinitionBasedCustomExtension( questionnaireItem: Questionnaire.QuestionnaireItemComponent, questionnaireResponseItem: QuestionnaireResponse.QuestionnaireResponseItemComponent, base: Base, + fieldName: String, + elementDefinition: ElementDefinition, ) { + // Create an extension + val extension = + Extension().apply { + url = + elementDefinition.type?.firstOrNull()?.profile?.firstOrNull()?.valueAsString + ?: questionnaireItem.definition + setValue(questionnaireResponseItem.answer.first().value) + } + if (base is Type) { - // Create an extension - val ext = Extension() - ext.url = questionnaireItem.definition - ext.setValue(questionnaireResponseItem.answer.first().value) // Add the extension to the resource - base.addExtension(ext) + base.addExtension(extension) } if (base is DomainResource) { - // Create an extension - val ext = Extension() - ext.url = questionnaireItem.definition - ext.setValue(questionnaireResponseItem.answer.first().value) - // Add the extension to the resource - base.addExtension(ext) + base.addExtension(extension) } }