diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducer.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducer.java index 13179386b..b81373f27 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducer.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducer.java @@ -112,27 +112,29 @@ public static List transformImportBundle( switch (resource.getResourceType()) { case ValueSet: var valueSet = (ValueSet) resource; - List conditionsList = new ArrayList<>(); + List genericContextList = new ArrayList<>(); List priorityList = new ArrayList<>(); valueSet.setIdentifier(fixIdentifiers(valueSet.getIdentifier())); var valueSetCanonicalUrl = adapterFactory .createKnowledgeArtifactAdapter(valueSet) .getCanonical(); - extractPrioritiesAndConditions( - valueSet.getUseContext(), priorityList, conditionsList, valueSetCanonicalUrl); + extractUsageContexts( + valueSet.getUseContext(), priorityList, genericContextList, valueSetCanonicalUrl); if (hasGrouperCompose(valueSet)) { prepareGrouperValueSet(valueSet, appAuthoritativeUrl); - groupers.add( - relatedArtifactFromGrouperUrl(valueSetCanonicalUrl, conditionsList, priorityList)); + groupers.add(relatedArtifactFromGrouperUrl( + valueSetCanonicalUrl, genericContextList, priorityList)); } else { prepareLeafValueSet(valueSet); - leafs.add(relatedArtifactFromLeafUrl(valueSetCanonicalUrl, conditionsList, priorityList)); + leafs.add( + relatedArtifactFromLeafUrl(valueSetCanonicalUrl, genericContextList, priorityList)); } // Remove conditions and priority from useContext of leaf valuesets and groupers var cleanedContext = valueSet.getUseContext().stream() .filter(ctx -> ctx.hasCode() && !(ctx.getCode().getCode().equals("focus") - || ctx.getCode().getCode().equals("priority"))) + || ctx.getCode().getCode().equals("priority") + || ctx.getCode().getCode().equals("reporting"))) .collect(Collectors.toList()); valueSet.setUseContext(cleanedContext); // Check if ValueSet already exists @@ -249,10 +251,10 @@ static List removeProfileFromList(List profiles, S .collect(Collectors.toList()); } - static void extractPrioritiesAndConditions( + static void extractUsageContexts( List contexts, List priorityList, - List conditionsList, + List genericContextList, String valueSetCanonicalUrl) { if (contexts == null || contexts.isEmpty()) return; @@ -262,7 +264,7 @@ static void extractPrioritiesAndConditions( if (!isValidUsageContext) continue; switch (context.getCode().getCode()) { - case "focus" -> conditionsList.add(context); + case "focus", "reporting" -> genericContextList.add(context); case "priority" -> handlePriorityContext(context, priorityList, valueSetCanonicalUrl); default -> { /* ignore other usage contexts */ @@ -360,7 +362,7 @@ private static void prepareRCTCLibrary(Library rctcLibrary, Set } private static RelatedArtifact relatedArtifactFromGrouperUrl( - String grouperUrl, List conditions, List priorities) { + String grouperUrl, List genericContexts, List priorities) { var relatedArtifact = new RelatedArtifact(); relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.COMPOSEDOF); relatedArtifact.setResource(grouperUrl); @@ -368,8 +370,8 @@ private static RelatedArtifact relatedArtifactFromGrouperUrl( isOwnedExtension.setUrl(TransformProperties.crmiIsOwned); isOwnedExtension.setValue(new BooleanType(true)); var extensions = new ArrayList(); - extensions.addAll( - processUsageContextMapForLibrary(conditions, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); + extensions.addAll(processUsageContextMapForLibrary( + genericContexts, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); extensions.addAll( processUsageContextMapForLibrary(priorities, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); extensions.add(isOwnedExtension); @@ -378,13 +380,13 @@ private static RelatedArtifact relatedArtifactFromGrouperUrl( } private static RelatedArtifact relatedArtifactFromLeafUrl( - String leafUrl, List conditions, List priorities) { + String leafUrl, List genericContexts, List priorities) { var relatedArtifact = new RelatedArtifact(); relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.DEPENDSON); relatedArtifact.setResource(leafUrl); var extensions = new ArrayList(); - extensions.addAll( - processUsageContextMapForLibrary(conditions, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); + extensions.addAll(processUsageContextMapForLibrary( + genericContexts, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); extensions.addAll( processUsageContextMapForLibrary(priorities, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL)); relatedArtifact.setExtension(extensions); diff --git a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducerTest.java b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducerTest.java index 7e9b5da73..54b1ff8d5 100644 --- a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducerTest.java +++ b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducerTest.java @@ -147,7 +147,7 @@ void testRootLibraryImport() throws FhirResourceExistsException { conditionUsageContext.getValueCodeableConcept().getText()); UsageContext priorityUsageContext = - (UsageContext) ra.get(0).getExtension().get(1).getValue(); + (UsageContext) ra.get(0).getExtension().get(2).getValue(); assertEquals("priority", priorityUsageContext.getCode().getCode()); assertEquals( "routine", @@ -248,8 +248,8 @@ void testImportOperation() { } @Test - void testExtractPrioritiesAndConditionsPopulatesLists() { - // focus usage context goes to conditions + void testExtractUsageContextsPopulatesLists() { + // focus usage context goes to genericUseContexts UsageContext context1 = new UsageContext(); context1.setCode(new Coding().setCode("focus")); context1.setValue(new CodeableConcept().setText("Condition1").addCoding(new Coding().setCode("condition1"))); @@ -259,24 +259,38 @@ void testExtractPrioritiesAndConditionsPopulatesLists() { context2.setCode(new Coding().setCode("priority")); context2.setValue(new CodeableConcept().addCoding(new Coding().setCode("routine"))); + // reporting usage context goes to genericUseContexts + UsageContext context3 = new UsageContext(); + context3.setCode(new Coding().setCode("reporting")); + context3.setValue(new CodeableConcept().addCoding(new Coding().setCode("triggering"))); + List priorities = new ArrayList<>(); - List conditions = new ArrayList<>(); + List genericUseContexts = new ArrayList<>(); // Execute - R4ImportBundleProducer.extractPrioritiesAndConditions( - Arrays.asList(context1, context2), priorities, conditions, "fakeUrl"); + R4ImportBundleProducer.extractUsageContexts( + Arrays.asList(context1, context2, context3), priorities, genericUseContexts, "fakeUrl"); // Verify assertEquals(1, priorities.size()); assertEquals( "routine", priorities.get(0).getValueCodeableConcept().getCodingFirstRep().getCode()); - assertEquals(1, conditions.size()); - assertEquals("Condition1", conditions.get(0).getValueCodeableConcept().getText()); + assertEquals(2, genericUseContexts.size()); + assertEquals( + "Condition1", + genericUseContexts.get(0).getValueCodeableConcept().getText()); + assertEquals( + "triggering", + genericUseContexts + .get(1) + .getValueCodeableConcept() + .getCodingFirstRep() + .getCode()); } @Test - void testExtractPrioritiesAndConditionsConflictingPrioritiesThrows() { + void testExtractUsageContextsConflictingPrioritiesThrows() { UsageContext context1 = new UsageContext(); context1.setCode(new Coding().setCode("priority")); context1.setValue(new CodeableConcept().addCoding(new Coding().setCode("urgent"))); @@ -285,13 +299,17 @@ void testExtractPrioritiesAndConditionsConflictingPrioritiesThrows() { context2.setCode(new Coding().setCode("priority")); context2.setValue(new CodeableConcept().addCoding(new Coding().setCode("routine"))); + UsageContext context3 = new UsageContext(); + context3.setCode(new Coding().setCode("reporting")); + context3.setValue(new CodeableConcept().addCoding(new Coding().setCode("triggering"))); + List priorities = new ArrayList<>(); - List conditions = new ArrayList<>(); + List genericUseContexts = new ArrayList<>(); assertThrows( UnprocessableEntityException.class, - () -> R4ImportBundleProducer.extractPrioritiesAndConditions( - Arrays.asList(context1, context2), priorities, conditions, "http://example.com/fhir")); + () -> R4ImportBundleProducer.extractUsageContexts( + Arrays.asList(context1, context2), priorities, genericUseContexts, "http://example.com/fhir")); } @Test