summaryrefslogtreecommitdiff
path: root/src/main/kotlin/dev
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2025-10-22 18:35:08 +0200
committerGitHub2025-10-22 18:35:08 +0200
commit9137c16e4f97bce44085af703af28c8788a107ed (patch)
tree68cbf81c5910217cc579dedb55a020a25503d991 /src/main/kotlin/dev
parent7ae349930521ed4f9b6255e12c50641ed4987e9d (diff)
feat: add basic support for gPAS SOAP endpoint (#157)
Diffstat (limited to 'src/main/kotlin/dev')
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/config/AppConfigProperties.kt1
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt39
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt26
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapService.kt31
4 files changed, 92 insertions, 5 deletions
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfigProperties.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfigProperties.kt
index 395dbd2..fc0727f 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfigProperties.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfigProperties.kt
@@ -47,6 +47,7 @@ data class PseudonymizeConfigProperties(
@ConfigurationProperties(GPasConfigProperties.NAME)
data class GPasConfigProperties(
val uri: String?,
+ val soapEndpoint: String?,
val patientDomain: String = "etl-processor",
val genomDeTanDomain: String = "ccdn",
val username: String?,
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt
index b4fad3e..de302fd 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt
@@ -20,19 +20,17 @@
package dev.dnpm.etl.processor.config
import com.fasterxml.jackson.databind.ObjectMapper
-import dev.dnpm.etl.processor.consent.MtbFileConsentService
import dev.dnpm.etl.processor.consent.GicsConsentService
import dev.dnpm.etl.processor.consent.IConsentService
+import dev.dnpm.etl.processor.consent.MtbFileConsentService
import dev.dnpm.etl.processor.monitoring.*
-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 dev.dnpm.etl.processor.pseudonym.*
import dev.dnpm.etl.processor.security.TokenRepository
import dev.dnpm.etl.processor.security.TokenService
import dev.dnpm.etl.processor.services.ConsentProcessor
import dev.dnpm.etl.processor.services.Transformation
import dev.dnpm.etl.processor.services.TransformationService
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
@@ -85,6 +83,37 @@ class AppConfiguration {
}
@ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS")
+ @ConditionalOnProperty(value = ["app.pseudonymize.gpas.soap-endpoint"])
+ @Bean
+ fun gpasSoapProxyFactoryBean(gpasConfigProperties: GPasConfigProperties): JaxWsProxyFactoryBean {
+ val proxyFactory = JaxWsProxyFactoryBean()
+ proxyFactory.serviceClass = GpasSoapService::class.java
+ proxyFactory.address = gpasConfigProperties.soapEndpoint
+ return proxyFactory
+ }
+
+ @ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS")
+ @ConditionalOnProperty(value = ["app.pseudonymize.gpas.soap-endpoint"])
+ @Bean
+ fun gpasSoapProxy(gpasConfigProperties: GPasConfigProperties): GpasSoapService {
+ return gpasSoapProxyFactoryBean(gpasConfigProperties).create() as GpasSoapService
+ }
+
+ @ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS")
+ @ConditionalOnProperty(value = ["app.pseudonymize.gpas.soap-endpoint"])
+ @Bean
+ fun gpasSoapPseudonymGenerator(
+ configProperties: GPasConfigProperties,
+ retryTemplate: RetryTemplate,
+ gpasSoapService: GpasSoapService,
+ appFhirConfig: AppFhirConfig
+ ): Generator {
+ logger.info("Selected 'GpasSoapPseudonym Generator'")
+ return GpasSoapPseudonymGenerator(configProperties, retryTemplate, gpasSoapService, appFhirConfig)
+ }
+
+ @ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS")
+ @ConditionalOnProperty(value = ["app.pseudonymize.gpas.uri"])
@Bean
fun gpasPseudonymGenerator(
configProperties: GPasConfigProperties,
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt
new file mode 100644
index 0000000..8215d23
--- /dev/null
+++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt
@@ -0,0 +1,26 @@
+package dev.dnpm.etl.processor.pseudonym
+
+import dev.dnpm.etl.processor.config.AppFhirConfig
+import dev.dnpm.etl.processor.config.GPasConfigProperties
+import org.springframework.retry.support.RetryTemplate
+
+class GpasSoapPseudonymGenerator(
+ private val gpasCfg: GPasConfigProperties,
+ private val retryTemplate: RetryTemplate,
+ private val gpasSoapService: GpasSoapService,
+ private val appFhirConfig: AppFhirConfig
+) : Generator {
+
+ override fun generate(id: String): String {
+ return retryTemplate.execute<String, Exception> {
+ gpasSoapService.getOrCreatePseudonymFor(id, gpasCfg.patientDomain)
+ }
+ }
+
+ override fun generateGenomDeTan(id: String): String {
+ return retryTemplate.execute<String, Exception> {
+ gpasSoapService.createPseudonymsFor(id, gpasCfg.genomDeTanDomain, 1).first()
+ }
+ }
+}
+
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapService.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapService.kt
new file mode 100644
index 0000000..0909924
--- /dev/null
+++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapService.kt
@@ -0,0 +1,31 @@
+package dev.dnpm.etl.processor.pseudonym
+
+import jakarta.jws.WebMethod
+import jakarta.jws.WebParam
+import jakarta.jws.WebResult
+import jakarta.jws.WebService
+import jakarta.xml.bind.annotation.XmlElementWrapper
+
+@WebService(
+ name = "PSNManagerBeanService",
+ targetNamespace ="http://psn.ttp.ganimed.icmvc.emau.org/"
+)
+interface GpasSoapService {
+
+ @WebMethod(operationName = "getOrCreatePseudonymFor")
+ @WebResult(name = "psn")
+ fun getOrCreatePseudonymFor(
+ @WebParam(name = "value") value: String,
+ @WebParam(name = "domainName") domainName: String
+ ): String
+
+ @WebMethod(operationName = "createPseudonymsFor")
+ @WebResult(name = "psn")
+ @XmlElementWrapper(name = "return")
+ fun createPseudonymsFor(
+ @WebParam(name = "value") value: String,
+ @WebParam(name = "domainName") domainName: String,
+ @WebParam(name = "number") minNumber: Int
+ ): List<String>
+
+} \ No newline at end of file