diff options
| author | Paul-Christian Volkmer | 2026-09-19 10:05:43 +0200 |
|---|---|---|
| committer | GitHub | 2026-09-19 10:05:43 +0200 |
| commit | b0fb01d12fcadf86cabbe71b16cce60fb88b0ca4 (patch) | |
| tree | 3b6c453d3d6bd898944581ff0d2edd23dcd64d6a /src | |
| parent | 1d59e6c8fa46dc5e1eed666d9e850bf5d5626e4b (diff) | |
refactor: remove now obsolete abstract class (#321)
Since there is only one implementation required, an abstraction layer is obsolete.
Diffstat (limited to 'src')
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, |
