1
0
mirror of https://github.com/pcvolkmer/etl-processor.git synced 2025-04-19 17:26:51 +00:00

Code polish for PR

* Do not use component creation using annotation on classes since components will
  be created within AppConfiguration config class

* Patient PseudonymizeService intentionally uses prefix. If no prefix is configured,
  the default value "UNKNOWN" will be used to prevent conflicts with other
  organizations and to show the source organization.
This commit is contained in:
Paul-Christian Volkmer 2023-07-27 23:16:19 +02:00
parent 90c5b81c2b
commit aa5b35970a
4 changed files with 24 additions and 35 deletions

View File

@ -22,21 +22,6 @@ package dev.dnpm.etl.processor.pseudonym;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
import dev.dnpm.etl.processor.config.GPasConfigProperties; import dev.dnpm.etl.processor.config.GPasConfigProperties;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.HashMap;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.classic.HttpClients;
@ -54,13 +39,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext; import org.springframework.retry.RetryContext;
@ -69,12 +48,25 @@ import org.springframework.retry.RetryPolicy;
import org.springframework.retry.backoff.ExponentialBackOffPolicy; import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate; import org.springframework.retry.support.RetryTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
@Component import javax.net.ssl.SSLContext;
@ConditionalOnProperty(value = "app.pseudonymizer", havingValue = "GPAS") import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.HashMap;
public class GpasPseudonymGenerator implements Generator { public class GpasPseudonymGenerator implements Generator {
private final String gPasUrl; private final String gPasUrl;
@ -89,7 +81,6 @@ public class GpasPseudonymGenerator implements Generator {
private SSLContext customSslContext; private SSLContext customSslContext;
private RestTemplate restTemplate; private RestTemplate restTemplate;
@Autowired
public GpasPseudonymGenerator(GPasConfigProperties gpasCfg) { public GpasPseudonymGenerator(GPasConfigProperties gpasCfg) {
this.gPasUrl = gpasCfg.getUri(); this.gPasUrl = gpasCfg.getUri();

View File

@ -24,14 +24,16 @@ import dev.dnpm.etl.processor.monitoring.ReportService
import dev.dnpm.etl.processor.output.KafkaMtbFileSender import dev.dnpm.etl.processor.output.KafkaMtbFileSender
import dev.dnpm.etl.processor.output.MtbFileSender import dev.dnpm.etl.processor.output.MtbFileSender
import dev.dnpm.etl.processor.output.RestMtbFileSender import dev.dnpm.etl.processor.output.RestMtbFileSender
import dev.dnpm.etl.processor.pseudonym.* import dev.dnpm.etl.processor.pseudonym.AnonymizingGenerator
import dev.dnpm.etl.processor.pseudonym.Generator
import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.core.KafkaTemplate
import reactor.core.publisher.Sinks import reactor.core.publisher.Sinks
import java.net.URI
@Configuration @Configuration
@EnableConfigurationProperties( @EnableConfigurationProperties(

View File

@ -23,9 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import de.ukw.ccc.bwhc.dto.MtbFile import de.ukw.ccc.bwhc.dto.MtbFile
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.core.KafkaTemplate
import org.springframework.stereotype.Component
@Component
class KafkaMtbFileSender( class KafkaMtbFileSender(
private val kafkaTemplate: KafkaTemplate<String, String>, private val kafkaTemplate: KafkaTemplate<String, String>,
private val objectMapper: ObjectMapper private val objectMapper: ObjectMapper
@ -37,7 +35,8 @@ class KafkaMtbFileSender(
return try { return try {
val result = kafkaTemplate.sendDefault( val result = kafkaTemplate.sendDefault(
String.format( String.format(
"{\"pid\": \"%s\", \"eid\": \"%s\"}", mtbFile.patient.id, "{\"pid\": \"%s\", \"eid\": \"%s\"}",
mtbFile.patient.id,
mtbFile.episode.id mtbFile.episode.id
), objectMapper.writeValueAsString(mtbFile) ), objectMapper.writeValueAsString(mtbFile)
) )

View File

@ -19,7 +19,6 @@
package dev.dnpm.etl.processor.pseudonym package dev.dnpm.etl.processor.pseudonym
import ca.uhn.fhir.util.StringUtil
import de.ukw.ccc.bwhc.dto.MtbFile import de.ukw.ccc.bwhc.dto.MtbFile
import dev.dnpm.etl.processor.config.PseudonymizeConfigProperties import dev.dnpm.etl.processor.config.PseudonymizeConfigProperties
@ -29,9 +28,7 @@ class PseudonymizeService(
) { ) {
fun pseudonymize(mtbFile: MtbFile): MtbFile { fun pseudonymize(mtbFile: MtbFile): MtbFile {
val patientPseudonym: String = if(configProperties.prefix.isNotEmpty()) val patientPseudonym = "${configProperties.prefix}_${generator.generate(mtbFile.patient.id)}"
"${configProperties.prefix}_${generator.generate(mtbFile.patient.id)}"
else generator.generate(mtbFile.patient.id)
mtbFile.episode.patient = patientPseudonym mtbFile.episode.patient = patientPseudonym
mtbFile.carePlans.forEach { it.patient = patientPseudonym } mtbFile.carePlans.forEach { it.patient = patientPseudonym }