Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,27 +112,29 @@ public static List<Bundle.BundleEntryComponent> transformImportBundle(
switch (resource.getResourceType()) {
case ValueSet:
var valueSet = (ValueSet) resource;
List<UsageContext> conditionsList = new ArrayList<>();
List<UsageContext> genericContextList = new ArrayList<>();
List<UsageContext> 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
Expand Down Expand Up @@ -249,10 +251,10 @@ static List<CanonicalType> removeProfileFromList(List<CanonicalType> profiles, S
.collect(Collectors.toList());
}

static void extractPrioritiesAndConditions(
static void extractUsageContexts(
List<UsageContext> contexts,
List<UsageContext> priorityList,
List<UsageContext> conditionsList,
List<UsageContext> genericContextList,
String valueSetCanonicalUrl) {

if (contexts == null || contexts.isEmpty()) return;
Expand All @@ -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 */
Expand Down Expand Up @@ -360,16 +362,16 @@ private static void prepareRCTCLibrary(Library rctcLibrary, Set<RelatedArtifact>
}

private static RelatedArtifact relatedArtifactFromGrouperUrl(
String grouperUrl, List<UsageContext> conditions, List<UsageContext> priorities) {
String grouperUrl, List<UsageContext> genericContexts, List<UsageContext> priorities) {
var relatedArtifact = new RelatedArtifact();
relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.COMPOSEDOF);
relatedArtifact.setResource(grouperUrl);
var isOwnedExtension = new Extension();
isOwnedExtension.setUrl(TransformProperties.crmiIsOwned);
isOwnedExtension.setValue(new BooleanType(true));
var extensions = new ArrayList<Extension>();
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);
Expand All @@ -378,13 +380,13 @@ private static RelatedArtifact relatedArtifactFromGrouperUrl(
}

private static RelatedArtifact relatedArtifactFromLeafUrl(
String leafUrl, List<UsageContext> conditions, List<UsageContext> priorities) {
String leafUrl, List<UsageContext> genericContexts, List<UsageContext> priorities) {
var relatedArtifact = new RelatedArtifact();
relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.DEPENDSON);
relatedArtifact.setResource(leafUrl);
var extensions = new ArrayList<Extension>();
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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")));
Expand All @@ -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<UsageContext> priorities = new ArrayList<>();
List<UsageContext> conditions = new ArrayList<>();
List<UsageContext> 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")));
Expand All @@ -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<UsageContext> priorities = new ArrayList<>();
List<UsageContext> conditions = new ArrayList<>();
List<UsageContext> 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
Expand Down
Loading