summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2026-09-19 10:05:43 +0200
committerGitHub2026-09-19 10:05:43 +0200
commitb0fb01d12fcadf86cabbe71b16cce60fb88b0ca4 (patch)
tree3b6c453d3d6bd898944581ff0d2edd23dcd64d6a /src
parent1d59e6c8fa46dc5e1eed666d9e850bf5d5626e4b (diff)
refactor: remove now obsolete abstract class (#321)
Since there is only one implementation required, an abstraction layer is obsolete.
Diffstat (limited to 'src')
-rw-r--r--src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt8
-rw-r--r--src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt2
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt96
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt122
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt4
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt7
6 files changed, 100 insertions, 139 deletions
diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt
index b4d6e06..8052ed2 100644
--- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt
+++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt
@@ -28,7 +28,7 @@ import dev.dnpm.etl.processor.consent.MtbFileConsentService
import dev.dnpm.etl.processor.input.KafkaInputListener
import dev.dnpm.etl.processor.monitoring.RequestRepository
import dev.dnpm.etl.processor.output.KafkaMtbFileSender
-import dev.dnpm.etl.processor.output.RestMtbFileSender
+import dev.dnpm.etl.processor.output.RestDipMtbFileSender
import dev.dnpm.etl.processor.pseudonym.AnonymizingGenerator
import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator
import dev.dnpm.etl.processor.pseudonym.GpasSoapPseudonymGenerator
@@ -79,7 +79,7 @@ class AppConfigurationTest {
) {
@Test
fun shouldUseRestMtbFileSenderNotKafkaMtbFileSender() {
- assertThat(context.getBean<RestMtbFileSender>()).isNotNull
+ assertThat(context.getBean<RestDipMtbFileSender>()).isNotNull
assertThrows<NoSuchBeanDefinitionException> {
context.getBean<KafkaMtbFileSender>()
}
@@ -102,7 +102,7 @@ class AppConfigurationTest {
) {
@Test
fun shouldUseKafkaMtbFileSenderNotRestMtbFileSender() {
- assertThrows<NoSuchBeanDefinitionException> { context.getBean<RestMtbFileSender>() }
+ assertThrows<NoSuchBeanDefinitionException> { context.getBean<RestDipMtbFileSender>() }
assertThat(context.getBean<KafkaMtbFileSender>()).isNotNull
}
}
@@ -123,7 +123,7 @@ class AppConfigurationTest {
) {
@Test
fun shouldUseRestMtbFileSenderNotKafkaMtbFileSender() {
- assertThat(context.getBean<RestMtbFileSender>()).isNotNull
+ assertThat(context.getBean<RestDipMtbFileSender>()).isNotNull
assertThrows<NoSuchBeanDefinitionException> {
context.getBean<KafkaMtbFileSender>()
}
diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
index 2e42174..bbad55a 100644
--- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
+++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
@@ -78,7 +78,7 @@ class RestDipMtbFileSenderTest {
private lateinit var mockRestServiceServer: MockRestServiceServer
- private lateinit var restMtbFileSender: RestMtbFileSender
+ private lateinit var restMtbFileSender: MtbFileSender
private var reportService =
ReportService(JsonMapper.builder().addModule(KotlinModule.Builder().build()).build())
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt
index 89232bd..04e673a 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt
@@ -20,20 +20,33 @@
package dev.dnpm.etl.processor.output
+import dev.dnpm.etl.processor.CustomMediaType
import dev.dnpm.etl.processor.PatientPseudonym
import dev.dnpm.etl.processor.config.RestTargetProperties
import dev.dnpm.etl.processor.monitoring.ReportService
+import dev.dnpm.etl.processor.monitoring.RequestStatus
+import dev.dnpm.etl.processor.monitoring.asRequestStatus
+import org.slf4j.LoggerFactory
+import org.springframework.http.HttpEntity
+import org.springframework.http.HttpHeaders
+import org.springframework.http.HttpMethod
+import org.springframework.http.MediaType
import org.springframework.retry.support.RetryTemplate
+import org.springframework.web.client.RestClientException
+import org.springframework.web.client.RestClientResponseException
import org.springframework.web.client.RestTemplate
+import org.springframework.web.client.exchange
import org.springframework.web.util.UriComponentsBuilder
class RestDipMtbFileSender(
- restTemplate: RestTemplate,
+ private val restTemplate: RestTemplate,
private val restTargetProperties: RestTargetProperties,
- retryTemplate: RetryTemplate,
- reportService: ReportService,
-) : RestMtbFileSender(restTemplate, restTargetProperties, retryTemplate, reportService) {
- override fun sendUrl(): String =
+ private val retryTemplate: RetryTemplate,
+ private val reportService: ReportService,
+) : MtbFileSender {
+ private val logger = LoggerFactory.getLogger(RestDipMtbFileSender::class.java)
+
+ fun sendUrl(): String =
UriComponentsBuilder
.fromUriString(restTargetProperties.uri.toString())
.pathSegment("mtb")
@@ -41,7 +54,7 @@ class RestDipMtbFileSender(
.pathSegment("patient-record")
.toUriString()
- override fun deleteUrl(patientId: PatientPseudonym): String =
+ fun deleteUrl(patientId: PatientPseudonym): String =
UriComponentsBuilder
.fromUriString(restTargetProperties.uri.toString())
.pathSegment("mtb")
@@ -49,4 +62,75 @@ class RestDipMtbFileSender(
.pathSegment("patient")
.pathSegment(patientId.value)
.toUriString()
+
+ override fun <T> send(request: MtbFileRequest<T>): MtbFileSender.Response {
+ try {
+ return retryTemplate.execute<MtbFileSender.Response, Exception> {
+ val headers = getHttpHeaders(request)
+ val entityReq = HttpEntity(request.content, headers)
+ val response =
+ restTemplate.exchange<String>(sendUrl(), HttpMethod.POST, entityReq)
+ if (!response.statusCode.is2xxSuccessful) {
+ logger.warn("Error sending to remote system: {}", response.body)
+ return@execute MtbFileSender.Response(
+ reportService.deserialize(response.body).asRequestStatus(),
+ "Status-Code: ${response.statusCode.value()}",
+ )
+ }
+ logger.debug("Sent file via RestMtbFileSender")
+ return@execute MtbFileSender.Response(
+ reportService.deserialize(response.body).asRequestStatus(),
+ response.body.orEmpty(),
+ )
+ }
+ } catch (e: IllegalArgumentException) {
+ logger.error("Not a valid URI to export to: '{}'", restTargetProperties.uri!!)
+ } catch (e: RestClientResponseException) {
+ logger.info(restTargetProperties.uri!!.toString())
+ logger.error("Request data not accepted by remote system", e)
+ return MtbFileSender.Response(
+ reportService.deserialize(e.responseBodyAsString).asRequestStatus(),
+ e.responseBodyAsString,
+ )
+ }
+ return MtbFileSender.Response(RequestStatus.ERROR, "Sonstiger Fehler bei der Übertragung")
+ }
+
+ override fun send(request: DeleteRequest): MtbFileSender.Response {
+ try {
+ return retryTemplate.execute<MtbFileSender.Response, Exception> {
+ val headers = getHttpHeaders(request)
+ val entityReq = HttpEntity(null, headers)
+ restTemplate.delete(deleteUrl(request.patientId), entityReq, String::class.java)
+ logger.debug("Sent file via RestMtbFileSender")
+ return@execute MtbFileSender.Response(RequestStatus.SUCCESS)
+ }
+ } catch (e: IllegalArgumentException) {
+ logger.error("Not a valid URI to export to: '{}'", restTargetProperties.uri!!)
+ } catch (e: RestClientException) {
+ logger.info(restTargetProperties.uri!!.toString())
+ logger.error("Cannot send data to remote system", e)
+ }
+ return MtbFileSender.Response(RequestStatus.ERROR, "Sonstiger Fehler bei der Übertragung")
+ }
+
+ override fun endpoint(): String = this.restTargetProperties.uri.orEmpty()
+
+ private fun getHttpHeaders(request: MtbRequest): HttpHeaders {
+ val username = restTargetProperties.username
+ val password = restTargetProperties.password
+ val headers = HttpHeaders()
+ headers.contentType =
+ when (request) {
+ is DnpmV2MtbFileRequest -> CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON
+ else -> MediaType.APPLICATION_JSON
+ }
+
+ if (username.isNullOrBlank() || password.isNullOrBlank()) {
+ return headers
+ }
+
+ headers.setBasicAuth(username, password)
+ return headers
+ }
}
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt
deleted file mode 100644
index 7e25827..0000000
--- a/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * This file is part of ETL-Processor
- *
- * Copyright (c) 2023 Comprehensive Cancer Center Mainfranken
- * Copyright (c) 2023-2026 Paul-Christian Volkmer, Datenintegrationszentrum Philipps-Universität Marburg and Contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package dev.dnpm.etl.processor.output
-
-import dev.dnpm.etl.processor.CustomMediaType
-import dev.dnpm.etl.processor.PatientPseudonym
-import dev.dnpm.etl.processor.config.RestTargetProperties
-import dev.dnpm.etl.processor.monitoring.ReportService
-import dev.dnpm.etl.processor.monitoring.RequestStatus
-import dev.dnpm.etl.processor.monitoring.asRequestStatus
-import org.slf4j.LoggerFactory
-import org.springframework.http.HttpEntity
-import org.springframework.http.HttpHeaders
-import org.springframework.http.HttpMethod
-import org.springframework.http.MediaType
-import org.springframework.retry.support.RetryTemplate
-import org.springframework.web.client.RestClientException
-import org.springframework.web.client.RestClientResponseException
-import org.springframework.web.client.RestTemplate
-import org.springframework.web.client.exchange
-
-abstract class RestMtbFileSender(
- private val restTemplate: RestTemplate,
- private val restTargetProperties: RestTargetProperties,
- private val retryTemplate: RetryTemplate,
- private val reportService: ReportService,
-) : MtbFileSender {
- private val logger = LoggerFactory.getLogger(RestMtbFileSender::class.java)
-
- abstract fun sendUrl(): String
-
- abstract fun deleteUrl(patientId: PatientPseudonym): String
-
- override fun <T> send(request: MtbFileRequest<T>): MtbFileSender.Response {
- try {
- return retryTemplate.execute<MtbFileSender.Response, Exception> {
- val headers = getHttpHeaders(request)
- val entityReq = HttpEntity(request.content, headers)
- val response =
- restTemplate.exchange<String>(sendUrl(), HttpMethod.POST, entityReq)
- if (!response.statusCode.is2xxSuccessful) {
- logger.warn("Error sending to remote system: {}", response.body)
- return@execute MtbFileSender.Response(
- reportService.deserialize(response.body).asRequestStatus(),
- "Status-Code: ${response.statusCode.value()}",
- )
- }
- logger.debug("Sent file via RestMtbFileSender")
- return@execute MtbFileSender.Response(
- reportService.deserialize(response.body).asRequestStatus(),
- response.body.orEmpty(),
- )
- }
- } catch (e: IllegalArgumentException) {
- logger.error("Not a valid URI to export to: '{}'", restTargetProperties.uri!!)
- } catch (e: RestClientResponseException) {
- logger.info(restTargetProperties.uri!!.toString())
- logger.error("Request data not accepted by remote system", e)
- return MtbFileSender.Response(
- reportService.deserialize(e.responseBodyAsString).asRequestStatus(),
- e.responseBodyAsString,
- )
- }
- return MtbFileSender.Response(RequestStatus.ERROR, "Sonstiger Fehler bei der Übertragung")
- }
-
- override fun send(request: DeleteRequest): MtbFileSender.Response {
- try {
- return retryTemplate.execute<MtbFileSender.Response, Exception> {
- val headers = getHttpHeaders(request)
- val entityReq = HttpEntity(null, headers)
- restTemplate.delete(deleteUrl(request.patientId), entityReq, String::class.java)
- logger.debug("Sent file via RestMtbFileSender")
- return@execute MtbFileSender.Response(RequestStatus.SUCCESS)
- }
- } catch (e: IllegalArgumentException) {
- logger.error("Not a valid URI to export to: '{}'", restTargetProperties.uri!!)
- } catch (e: RestClientException) {
- logger.info(restTargetProperties.uri!!.toString())
- logger.error("Cannot send data to remote system", e)
- }
- return MtbFileSender.Response(RequestStatus.ERROR, "Sonstiger Fehler bei der Übertragung")
- }
-
- override fun endpoint(): String = this.restTargetProperties.uri.orEmpty()
-
- private fun getHttpHeaders(request: MtbRequest): HttpHeaders {
- val username = restTargetProperties.username
- val password = restTargetProperties.password
- val headers = HttpHeaders()
- headers.contentType =
- when (request) {
- is DnpmV2MtbFileRequest -> CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON
- else -> MediaType.APPLICATION_JSON
- }
-
- if (username.isNullOrBlank() || password.isNullOrBlank()) {
- return headers
- }
-
- headers.setBasicAuth(username, password)
- return headers
- }
-}
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
index 3a0b3f0..a13c001 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt
@@ -61,7 +61,7 @@ class RestDipMtbFileSenderTest {
private lateinit var mockRestServiceServer: MockRestServiceServer
- private lateinit var restMtbFileSender: RestMtbFileSender
+ private lateinit var restMtbFileSender: MtbFileSender
private var reportService =
ReportService(JsonMapper())
@@ -109,7 +109,7 @@ class RestDipMtbFileSenderTest {
private lateinit var mockRestServiceServer: MockRestServiceServer
- private lateinit var restMtbFileSender: RestMtbFileSender
+ private lateinit var restMtbFileSender: MtbFileSender
private var reportService =
ReportService(JsonMapper())
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt
index 17570d4..3edb480 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt
@@ -30,7 +30,6 @@ import dev.dnpm.etl.processor.monitoring.SubmissionType
import dev.dnpm.etl.processor.output.DeleteRequest
import dev.dnpm.etl.processor.output.DnpmV2MtbFileRequest
import dev.dnpm.etl.processor.output.MtbFileSender
-import dev.dnpm.etl.processor.output.RestMtbFileSender
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
import dev.pcvolkmer.mv64e.model.ConsentProvisionType
import dev.pcvolkmer.mv64e.model.FollowUp
@@ -78,7 +77,7 @@ class RequestProcessorTest {
fun setup(
@Mock pseudonymizeService: PseudonymizeService,
@Mock transformationService: TransformationService,
- @Mock sender: RestMtbFileSender,
+ @Mock sender: MtbFileSender,
@Mock requestService: RequestService,
@Mock applicationEventPublisher: ApplicationEventPublisher,
@Mock consentProcessor: ConsentProcessor,
@@ -699,7 +698,7 @@ class RequestProcessorTest {
fun setup(
@Mock pseudonymizeService: PseudonymizeService,
@Mock transformationService: TransformationService,
- @Mock sender: RestMtbFileSender,
+ @Mock sender: MtbFileSender,
@Mock requestService: RequestService,
@Mock applicationEventPublisher: ApplicationEventPublisher,
@Mock consentProcessor: ConsentProcessor,
@@ -1169,7 +1168,7 @@ class RequestProcessorTest {
fun setup(
@Mock pseudonymizeService: PseudonymizeService,
@Mock transformationService: TransformationService,
- @Mock sender: RestMtbFileSender,
+ @Mock sender: MtbFileSender,
@Mock requestService: RequestService,
@Mock applicationEventPublisher: ApplicationEventPublisher,
@Mock consentProcessor: ConsentProcessor,