Skip to content
This repository was archived by the owner on Oct 6, 2025. It is now read-only.

Commit bc45c30

Browse files
committed
Identifier profile rules now generally removed except for Patient
Code cleanup in ValidateDataLearningTest
1 parent f27bb7b commit bc45c30

4 files changed

Lines changed: 57 additions & 91 deletions

File tree

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/spring/config/ValidationConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public static enum TerminologyServerConnectionTestStatus
209209
@ProcessDocumentation(description = "List of StructureDefinition modifier classes, modifiers are executed before atempting to generate a StructureDefinition snapshot", processNames = "wwwnetzwerk-universitaetsmedizinde_dataSend")
210210
@Value("#{'${de.netzwerk.universitaetsmedizin.codex.gecco.validation.structuredefinition.modifierClasses:"
211211
+ "de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.ClosedTypeSlicingRemover,"
212-
+ "de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.ObservationIdentifierRemover,"
212+
+ "de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.IdentifierRemover,"
213213
+ "de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.SliceMinFixer"
214214
+ "}'.trim().split('(,[ ]?)|(\\n)')}")
215215
private List<String> structureDefinitionModifierClasses;

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/validation/PluginSnapshotGeneratorWithModifiers.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,22 @@
1111
import org.springframework.beans.factory.InitializingBean;
1212

1313
import de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.ClosedTypeSlicingRemover;
14-
import de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.ObservationIdentifierRemover;
14+
import de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.IdentifierRemover;
1515
import de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.SliceMinFixer;
1616
import de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.validation.structure_definition.StructureDefinitionModifier;
1717

1818
public class PluginSnapshotGeneratorWithModifiers implements SnapshotGenerator, InitializingBean
1919
{
2020
public static final StructureDefinitionModifier CLOSED_TYPE_SLICING_REMOVER = new ClosedTypeSlicingRemover();
21-
public static final StructureDefinitionModifier OBSERVATION_IDENTIFIER_REMOVER = new ObservationIdentifierRemover();
21+
public static final StructureDefinitionModifier IDENTIFIER_REMOVER = new IdentifierRemover();
2222
public static final StructureDefinitionModifier SLICE_MIN_FIXER = new SliceMinFixer();
2323

2424
private final SnapshotGenerator delegate;
2525
private final List<StructureDefinitionModifier> structureDefinitionModifiers = new ArrayList<>();
2626

2727
public PluginSnapshotGeneratorWithModifiers(SnapshotGenerator delegate)
2828
{
29-
this(delegate, Arrays.asList(CLOSED_TYPE_SLICING_REMOVER, OBSERVATION_IDENTIFIER_REMOVER, SLICE_MIN_FIXER));
29+
this(delegate, Arrays.asList(CLOSED_TYPE_SLICING_REMOVER, IDENTIFIER_REMOVER, SLICE_MIN_FIXER));
3030
}
3131

3232
public PluginSnapshotGeneratorWithModifiers(SnapshotGenerator delegate,

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/validation/structure_definition/ObservationIdentifierRemover.java renamed to codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/validation/structure_definition/IdentifierRemover.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,30 @@
55
import java.util.stream.Collectors;
66

77
import org.hl7.fhir.r4.model.ElementDefinition;
8+
import org.hl7.fhir.r4.model.ResourceType;
89
import org.hl7.fhir.r4.model.StructureDefinition;
10+
import org.hl7.fhir.r4.model.StructureDefinition.StructureDefinitionKind;
911
import org.slf4j.Logger;
1012
import org.slf4j.LoggerFactory;
1113

1214
/**
13-
* Mandatory identifier on Observation not compatible with data protection rules and current pseudonymization
14-
* implementation.
15+
* Mandatory identifier on resources other then Patient not compatible with data protection rules and current
16+
* pseudonymization implementation.
1517
*/
16-
public class ObservationIdentifierRemover implements StructureDefinitionModifier
18+
public class IdentifierRemover implements StructureDefinitionModifier
1719
{
18-
private static final Logger logger = LoggerFactory.getLogger(ObservationIdentifierRemover.class);
20+
private static final Logger logger = LoggerFactory.getLogger(IdentifierRemover.class);
1921

2022
@Override
2123
public StructureDefinition modify(StructureDefinition sd)
2224
{
23-
if ("https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab"
24-
.equals(sd.getUrl())
25-
|| "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/blood-gas-panel"
26-
.equals(sd.getUrl()))
25+
String type = sd.getType();
26+
27+
if (StructureDefinitionKind.RESOURCE.equals(sd.getKind()) && type != null
28+
&& !ResourceType.Patient.name().equals(type))
2729
{
2830
Predicate<? super ElementDefinition> toRemove = e -> e.hasPath()
29-
&& e.getPath().startsWith("Observation.identifier");
31+
&& e.getPath().startsWith(type + ".identifier");
3032

3133
List<ElementDefinition> filteredRules = sd.getDifferential().getElement().stream().filter(toRemove.negate())
3234
.collect(Collectors.toList());

codex-process-data-transfer/src/test/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/validation/ValidateDataLearningTest.java

Lines changed: 42 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,45 @@ private static final class ResourceAndFilename
8484
}
8585
}
8686

87+
private ValidationPackageManager createValidationPackageManager()
88+
throws IOException, CertificateException, PKCSException, KeyStoreException, NoSuchAlgorithmException
89+
{
90+
Properties properties = new Properties();
91+
try (InputStream appProperties = Files.newInputStream(Paths.get("application.properties")))
92+
{
93+
properties.load(appProperties);
94+
}
95+
96+
X509Certificate certificate = PemIo.readX509CertificateFromPem(Paths.get(properties.getProperty(
97+
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate")));
98+
char[] keyStorePassword = properties.getProperty(
99+
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key.password")
100+
.toCharArray();
101+
PrivateKey privateKey = PemIo.readPrivateKeyFromPem(Paths.get(properties.getProperty(
102+
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key")),
103+
keyStorePassword);
104+
KeyStore keyStore = CertificateHelper.toJksKeyStore(privateKey, new Certificate[] { certificate },
105+
UUID.randomUUID().toString(), keyStorePassword);
106+
107+
ValidationPackageClient validationPackageClient = new ValidationPackageClientJersey(
108+
"https://packages.simplifier.net");
109+
ValidationPackageClient validationPackageClientWithCache = new ValidationPackageClientWithFileSystemCache(
110+
cacheFolder, mapper, validationPackageClient);
111+
ValueSetExpansionClient valueSetExpansionClient = new ValueSetExpansionClientJersey(
112+
"https://terminology-highmed.medic.medfak.uni-koeln.de/fhir", null, keyStore, keyStorePassword, null,
113+
null, null, null, null, 0, 0, false, mapper, fhirContext);
114+
ValueSetExpansionClient valueSetExpansionClientWithModifiers = new ValueSetExpansionClientWithModifiers(
115+
valueSetExpansionClient);
116+
ValueSetExpansionClient valueSetExpansionClientWithCache = new ValueSetExpansionClientWithFileSystemCache(
117+
cacheFolder, fhirContext, valueSetExpansionClientWithModifiers);
118+
ValidationPackageManager manager = new ValidationPackageManagerImpl(validationPackageClientWithCache,
119+
valueSetExpansionClientWithCache, mapper, fhirContext,
120+
(fc, vs) -> new PluginSnapshotGeneratorWithFileSystemCache(cacheFolder, fc,
121+
new PluginSnapshotGeneratorWithModifiers(new PluginSnapshotGeneratorImpl(fc, vs))),
122+
(fc, vs) -> new ValueSetExpanderWithFileSystemCache(cacheFolder, fc, new ValueSetExpanderImpl(fc, vs)));
123+
return manager;
124+
}
125+
87126
@Test
88127
public void testCheckValueSetForComplexeSnomedCtCodes() throws Exception
89128
{
@@ -236,62 +275,10 @@ else if (issue.hasLocation())
236275
});
237276
}
238277

239-
private ValidationPackageManager createValidationPackageManager()
240-
throws IOException, CertificateException, PKCSException, KeyStoreException, NoSuchAlgorithmException
241-
{
242-
Properties properties = new Properties();
243-
try (InputStream appProperties = Files.newInputStream(Paths.get("application.properties")))
244-
{
245-
properties.load(appProperties);
246-
}
247-
248-
X509Certificate certificate = PemIo.readX509CertificateFromPem(Paths.get(properties.getProperty(
249-
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate")));
250-
char[] keyStorePassword = properties.getProperty(
251-
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key.password")
252-
.toCharArray();
253-
PrivateKey privateKey = PemIo.readPrivateKeyFromPem(Paths.get(properties.getProperty(
254-
"de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key")),
255-
keyStorePassword);
256-
KeyStore keyStore = CertificateHelper.toJksKeyStore(privateKey, new Certificate[] { certificate },
257-
UUID.randomUUID().toString(), keyStorePassword);
258-
259-
ValidationPackageClient validationPackageClient = new ValidationPackageClientJersey(
260-
"https://packages.simplifier.net");
261-
ValidationPackageClient validationPackageClientWithCache = new ValidationPackageClientWithFileSystemCache(
262-
cacheFolder, mapper, validationPackageClient);
263-
ValueSetExpansionClient valueSetExpansionClient = new ValueSetExpansionClientJersey(
264-
"https://terminology-highmed.medic.medfak.uni-koeln.de/fhir", null, keyStore, keyStorePassword, null,
265-
null, null, null, null, 0, 0, false, mapper, fhirContext);
266-
ValueSetExpansionClient valueSetExpansionClientWithModifiers = new ValueSetExpansionClientWithModifiers(
267-
valueSetExpansionClient);
268-
ValueSetExpansionClient valueSetExpansionClientWithCache = new ValueSetExpansionClientWithFileSystemCache(
269-
cacheFolder, fhirContext, valueSetExpansionClientWithModifiers);
270-
ValidationPackageManager manager = new ValidationPackageManagerImpl(validationPackageClientWithCache,
271-
valueSetExpansionClientWithCache, mapper, fhirContext,
272-
(fc, vs) -> new PluginSnapshotGeneratorWithFileSystemCache(cacheFolder, fc,
273-
new PluginSnapshotGeneratorWithModifiers(new PluginSnapshotGeneratorImpl(fc, vs))),
274-
(fc, vs) -> new ValueSetExpanderWithFileSystemCache(cacheFolder, fc, new ValueSetExpanderImpl(fc, vs)));
275-
return manager;
276-
}
277-
278278
@Test
279279
public void testDownloadWithDependencies() throws Exception
280280
{
281-
ValidationPackageClient validationPackageClient = new ValidationPackageClientJersey(
282-
"https://packages.simplifier.net");
283-
ValidationPackageClient validationPackageClientWithCache = new ValidationPackageClientWithFileSystemCache(
284-
cacheFolder, mapper, validationPackageClient);
285-
286-
ValueSetExpansionClient valueSetExpansionClient = new ValueSetExpansionClientJersey(
287-
"https://r4.ontoserver.csiro.au/fhir", mapper, fhirContext);
288-
ValueSetExpansionClient valueSetExpansionClientWithCache = new ValueSetExpansionClientWithFileSystemCache(
289-
cacheFolder, fhirContext, valueSetExpansionClient);
290-
291-
ValidationPackageManager manager = new ValidationPackageManagerImpl(validationPackageClientWithCache,
292-
valueSetExpansionClientWithCache, mapper, fhirContext, PluginSnapshotGeneratorImpl::new,
293-
ValueSetExpanderImpl::new);
294-
281+
ValidationPackageManager manager = createValidationPackageManager();
295282
ValidationPackageWithDepedencies packageWithDependencies = manager.downloadPackageWithDependencies("de.gecco",
296283
"1.0.5");
297284
packageWithDependencies.parseResources(fhirContext);
@@ -300,20 +287,7 @@ public void testDownloadWithDependencies() throws Exception
300287
@Test
301288
public void testValidate() throws Exception
302289
{
303-
ValidationPackageClient validationPackageClient = new ValidationPackageClientJersey(
304-
"https://packages.simplifier.net");
305-
ValidationPackageClient validationPackageClientWithCache = new ValidationPackageClientWithFileSystemCache(
306-
cacheFolder, mapper, validationPackageClient);
307-
ValueSetExpansionClient valueSetExpansionClient = new ValueSetExpansionClientJersey(
308-
"https://r4.ontoserver.csiro.au/fhir", mapper, fhirContext);
309-
ValueSetExpansionClient valueSetExpansionClientWithCache = new ValueSetExpansionClientWithFileSystemCache(
310-
cacheFolder, fhirContext, valueSetExpansionClient);
311-
ValidationPackageManager manager = new ValidationPackageManagerImpl(validationPackageClientWithCache,
312-
valueSetExpansionClientWithCache, mapper, fhirContext,
313-
(fc, vs) -> new PluginSnapshotGeneratorWithFileSystemCache(cacheFolder, fc,
314-
new PluginSnapshotGeneratorImpl(fc, vs)),
315-
(fc, vs) -> new ValueSetExpanderWithFileSystemCache(cacheFolder, fc, new ValueSetExpanderImpl(fc, vs)));
316-
290+
ValidationPackageManager manager = createValidationPackageManager();
317291
BundleValidator validator = manager.createBundleValidator("de.gecco", "1.0.5");
318292

319293
logger.debug("---------- executing validation tests ----------");
@@ -385,17 +359,7 @@ else if (issue.hasLocation())
385359
@Test
386360
public void testGenerateSnapshots() throws Exception
387361
{
388-
ValidationPackageClient validationPackageClient = new ValidationPackageClientJersey(
389-
"https://packages.simplifier.net");
390-
ValidationPackageClient validationPackageClientWithCache = new ValidationPackageClientWithFileSystemCache(
391-
cacheFolder, mapper, validationPackageClient);
392-
ValueSetExpansionClient valueSetExpansionClient = new ValueSetExpansionClientJersey(
393-
"https://r4.ontoserver.csiro.au/fhir", mapper, fhirContext);
394-
ValueSetExpansionClient valueSetExpansionClientWithCache = new ValueSetExpansionClientWithFileSystemCache(
395-
cacheFolder, fhirContext, valueSetExpansionClient);
396-
ValidationPackageManager manager = new ValidationPackageManagerImpl(validationPackageClientWithCache,
397-
valueSetExpansionClientWithCache, mapper, fhirContext, PluginSnapshotGeneratorImpl::new,
398-
ValueSetExpanderImpl::new);
362+
ValidationPackageManager manager = createValidationPackageManager();
399363

400364
ValidationPackageWithDepedencies packageWithDependencies = manager.downloadPackageWithDependencies("de.gecco",
401365
"1.0.5");

0 commit comments

Comments
 (0)