Skip to content

Commit 6e63d02

Browse files
committed
Bug Fix ProfileMustHaveChecker Does Not Strip Versions
1 parent f7e9408 commit 6e63d02

File tree

4 files changed

+50
-48
lines changed

4 files changed

+50
-48
lines changed

src/main/java/de/medizininformatikinitiative/torch/management/StructureDefinitionHandler.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import de.medizininformatikinitiative.torch.util.CompiledStructureDefinition;
44
import de.medizininformatikinitiative.torch.util.ResourceReader;
5+
import de.medizininformatikinitiative.torch.util.ResourceUtils;
56
import jakarta.annotation.PostConstruct;
67
import org.hl7.fhir.r4.model.StructureDefinition;
78

@@ -60,7 +61,7 @@ public void processDirectory() throws IOException {
6061
* @return true if the profile is known, false otherwise
6162
*/
6263
public boolean known(String profile) {
63-
return definitions.containsKey(stripVersion(profile));
64+
return definitions.containsKey(ResourceUtils.stripVersion(profile));
6465
}
6566

6667
/**
@@ -71,7 +72,7 @@ public boolean known(String profile) {
7172
* @return CompiledStructureDefinition corresponding to the base URL (ignores version)
7273
*/
7374
public Optional<CompiledStructureDefinition> getDefinition(String url) {
74-
return Optional.ofNullable(definitions.get(stripVersion(url)));
75+
return Optional.ofNullable(definitions.get(ResourceUtils.stripVersion(url)));
7576
}
7677

7778
/**
@@ -83,7 +84,7 @@ public Optional<CompiledStructureDefinition> getDefinition(String url) {
8384
*/
8485
public List<CompiledStructureDefinition> getDefinitions(Set<String> urls) {
8586
return urls.stream()
86-
.map(this::stripVersion)
87+
.map(ResourceUtils::stripVersion)
8788
.map(definitions::get)
8889
.filter(Objects::nonNull).toList();
8990
}
@@ -99,16 +100,6 @@ private void readStructureDefinition(String filePath) throws IOException {
99100
definitions.put(structureDefinition.getUrl(), CompiledStructureDefinition.fromStructureDefinition(structureDefinition));
100101
}
101102

102-
/**
103-
* Strips version information from a FHIR canonical URL.
104-
*
105-
* @param url the potentially versioned URL
106-
* @return the URL with version information removed
107-
*/
108-
private String stripVersion(String url) {
109-
int pipeIndex = url.indexOf('|');
110-
return pipeIndex == -1 ? url : url.substring(0, pipeIndex);
111-
}
112103

113104
@Override
114105
public String toString() {

src/main/java/de/medizininformatikinitiative/torch/util/ProfileMustHaveChecker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public boolean fulfilled(Resource src, AnnotatedAttributeGroup group) {
2727
return false;
2828
}
2929
DomainResource resource = (DomainResource) src;
30-
List<String> profiles = src.getMeta().getProfile().stream().map(CanonicalType::getValue).toList();
30+
List<String> profiles = src.getMeta().getProfile().stream().map(CanonicalType::getValue).map(ResourceUtils::stripVersion).toList();
3131

3232
if (resource.getResourceType().toString().equals("Patient") || profiles.contains(group.groupReference())) {
3333
if (group.hasMustHave()) {

src/main/java/de/medizininformatikinitiative/torch/util/ResourceUtils.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ public static String patientId(DomainResource resource) throws PatientIdNotFound
4343

4444
}
4545

46+
/**
47+
* Strips version information from a FHIR canonical URL.
48+
*
49+
* @param url the potentially versioned URL
50+
* @return the URL with version information removed
51+
*/
52+
public static String stripVersion(String url) {
53+
int pipeIndex = url.indexOf('|');
54+
return pipeIndex == -1 ? url : url.substring(0, pipeIndex);
55+
}
56+
4657

4758
private static String getPatientIdViaReflection(DomainResource resource) throws PatientIdNotFoundException {
4859

@@ -88,8 +99,8 @@ public static String getPatientIdFromBundle(Bundle bundle) throws PatientIdNotFo
8899
throw new PatientIdNotFoundException("Bundle is isEmpty or null");
89100
}
90101
Resource resource = bundle.getEntryFirstRep().getResource();
91-
if (resource instanceof DomainResource) {
92-
return patientId((DomainResource) resource);
102+
if (resource instanceof DomainResource domainResource) {
103+
return patientId(domainResource);
93104
}
94105
throw new PatientIdNotFoundException("First entry in bundle is not a DomainResource");
95106
}

src/test/java/de/medizininformatikinitiative/torch/util/ProfileMustHaveCheckerTest.java

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,101 +18,101 @@
1818

1919
class ProfileMustHaveCheckerTest {
2020

21-
private static IntegrationTestSetup INTEGRATION_TEST_SETUP;
22-
private static final Observation src = new Observation();
21+
private static final Observation validObservation = new Observation();
22+
private static IntegrationTestSetup integrationTestSetup;
2323

2424
@BeforeAll
2525
static void setup() throws IOException {
26-
INTEGRATION_TEST_SETUP = new IntegrationTestSetup();
26+
integrationTestSetup = new IntegrationTestSetup();
2727
Meta meta = new Meta();
28-
meta.setProfile(List.of(new CanonicalType("Invalid"), new CanonicalType("Test")));
29-
src.setMeta(meta);
30-
src.setSubject(new Reference("Patient/123"));
31-
src.setId("1243");
28+
meta.setProfile(List.of(new CanonicalType("Invalid"), new CanonicalType("Test|123")));
29+
validObservation.setMeta(meta);
30+
validObservation.setSubject(new Reference("Patient/123"));
31+
validObservation.setId("1243");
3232
}
3333

3434
@Test
3535
void groupNoMustHave() {
3636
AnnotatedAttribute effective = new AnnotatedAttribute("Observation.effective", "Observation.effective", "Observation.effective", false);
3737
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(effective), List.of(), null);
38-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
38+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
3939

40-
assertThat(checker.fulfilled(src, group)).isTrue();
40+
assertThat(checker.fulfilled(validObservation, group)).isTrue();
4141
}
4242

4343
@Test
4444
void groupMustHave() {
4545
AnnotatedAttribute effective = new AnnotatedAttribute("Observation.id", "Observation.id", "Observation.id", true);
4646
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(effective), List.of(), null);
47-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
47+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
4848

49-
assertThat(checker.fulfilled(src, group)).isTrue();
49+
assertThat(checker.fulfilled(validObservation, group)).isTrue();
5050
}
5151

5252
@Test
5353
void groupMustHaveFail() {
54-
Observation src = new Observation();
55-
src.setSubject(new Reference("Patient/123"));
54+
Observation observation = new Observation();
55+
observation.setSubject(new Reference("Patient/123"));
5656
AnnotatedAttribute effective = new AnnotatedAttribute("Observation.id", "Observation.id", "Observation.id", true);
5757
AnnotatedAttribute effective2 = new AnnotatedAttribute("Observation.subject", "Observation.subject", "Observation.subject", true);
5858
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(effective, effective2), List.of(), null);
59-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
59+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
6060

61-
assertThat(checker.fulfilled(src, group)).isFalse();
61+
assertThat(checker.fulfilled(observation, group)).isFalse();
6262
}
6363

6464
@Test
6565
void groupProfileFail() {
66-
Observation src = new Observation();
66+
Observation observation = new Observation();
6767
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null);
68-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
68+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
6969

70-
assertThat(checker.fulfilled(src, group)).isFalse();
70+
assertThat(checker.fulfilled(observation, group)).isFalse();
7171
}
7272

7373
@Test
7474
void groupProfileIgnoredForPatient() {
75-
Patient src = new Patient();
75+
Patient patient = new Patient();
7676
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null);
77-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
77+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
7878

79-
assertThat(checker.fulfilled(src, group)).isTrue();
79+
assertThat(checker.fulfilled(patient, group)).isTrue();
8080
}
8181

8282

8383
@Test
8484
void shouldHandleNullProfileInMeta() {
85-
Observation src = new Observation();
86-
src.setMeta(null); // No meta data
85+
Observation observation = new Observation();
86+
observation.setMeta(null); // No meta data
8787
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null);
88-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
88+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
8989

90-
assertThat(checker.fulfilled(src, group)).isFalse();
90+
assertThat(checker.fulfilled(observation, group)).isFalse();
9191
}
9292

9393
@Test
9494
void shouldHandleNullProfilesList() {
95-
Observation src = new Observation();
96-
src.setMeta(new Meta()); // Meta exists but has no profiles
95+
Observation observation = new Observation();
96+
observation.setMeta(new Meta()); // Meta exists but has no profiles
9797
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null);
98-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
98+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
9999

100-
assertThat(checker.fulfilled(src, group)).isFalse();
100+
assertThat(checker.fulfilled(observation, group)).isFalse();
101101
}
102102

103103

104104
@Test
105105
void shouldHandleEmptyAnnotatedAttributes() {
106106
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null); // Empty attributes
107-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
107+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
108108

109-
assertThat(checker.fulfilled(src, group)).isTrue();
109+
assertThat(checker.fulfilled(validObservation, group)).isTrue();
110110
}
111111

112112
@Test
113113
void shouldHandleNullResource() {
114114
AnnotatedAttributeGroup group = new AnnotatedAttributeGroup("Test", "Observation", "Test", List.of(), List.of(), null);
115-
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(INTEGRATION_TEST_SETUP.fhirContext());
115+
ProfileMustHaveChecker checker = new ProfileMustHaveChecker(integrationTestSetup.fhirContext());
116116

117117
assertThat(checker.fulfilled(null, group)).isFalse(); // Null resource should return false
118118
}

0 commit comments

Comments
 (0)