From a52c8cf3b8394992985cddd37ab5e9581dabfe06 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sat, 21 Jun 2025 11:28:46 +0200 Subject: [PATCH] refactor: add catalogue factory --- .../datacatalogues/AbstractDataCatalogue.java | 2 - .../datacatalogues/CatalogueFactory.java | 60 +++++++++++++++++++ .../onco/datamapper/mapper/MtbDataMapper.java | 12 ++-- .../datacatalogues/KpaCatalogueTest.java | 15 ++++- .../datamapper/mapper/MtbDataMapperTest.java | 8 --- 5 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/CatalogueFactory.java diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java index a500125..040a17a 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/AbstractDataCatalogue.java @@ -4,8 +4,6 @@ import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; -import java.util.Map; - /** * Common implementations for all data catalogues * diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/CatalogueFactory.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/CatalogueFactory.java new file mode 100644 index 0000000..5599e00 --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/CatalogueFactory.java @@ -0,0 +1,60 @@ +package dev.pcvolkmer.onco.datamapper.datacatalogues; + +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.HashMap; +import java.util.Map; + +/** + * Simple catalogue factory to get a catalogue instance + * + * @author Paul-Christian Volkmer + * @since 0.1 + */ +public class CatalogueFactory { + + private final JdbcTemplate jdbcTemplate; + private final Map, DataCatalogue> catalogues = new HashMap<>(); + + private CatalogueFactory(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + private static CatalogueFactory obj; + + public static synchronized CatalogueFactory instance(final JdbcTemplate jdbcTemplate) { + if (null == obj) { + obj = new CatalogueFactory(jdbcTemplate); + } + return obj; + } + + @SuppressWarnings("unchecked") + public synchronized T catalogue(Class clazz) { + return (T) catalogues.computeIfAbsent(clazz, c -> { + if (c == EcogCatalogue.class) { + return EcogCatalogue.create(jdbcTemplate); + } else if (c == HistologieCatalogue.class) { + return HistologieCatalogue.create(jdbcTemplate); + } else if (c == KpaCatalogue.class) { + return KpaCatalogue.create(jdbcTemplate); + } else if (c == PatientCatalogue.class) { + return PatientCatalogue.create(jdbcTemplate); + } else if (c == ProzedurCatalogue.class) { + return ProzedurCatalogue.create(jdbcTemplate); + } else if (c == TherapielinieCatalogue.class) { + return TherapielinieCatalogue.create(jdbcTemplate); + } else if (c == TumorausbreitungCatalogue.class) { + return TumorausbreitungCatalogue.create(jdbcTemplate); + } else if (c == TumorgradingCatalogue.class) { + return TumorgradingCatalogue.create(jdbcTemplate); + } else if (c == VerwandteCatalogue.class) { + return VerwandteCatalogue.create(jdbcTemplate); + } else if (c == VorbefundeCatalogue.class) { + return VorbefundeCatalogue.create(jdbcTemplate); + } + throw new RuntimeException("Unknown DataCatalogue class: " + clazz); + }); + } + +} diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java index 56036b8..82ceda7 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.Mtb; +import dev.pcvolkmer.onco.datamapper.datacatalogues.CatalogueFactory; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; import dev.pcvolkmer.onco.datamapper.datacatalogues.PatientCatalogue; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; @@ -21,10 +22,10 @@ public class MtbDataMapper implements DataMapper { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final JdbcTemplate jdbcTemplate; + private final CatalogueFactory catalogueFactory; MtbDataMapper(final JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; + this.catalogueFactory = CatalogueFactory.instance(jdbcTemplate); } /** @@ -55,8 +56,8 @@ public class MtbDataMapper implements DataMapper { */ @Override public Mtb getById(int kpaId) { - var kpaCatalogue = KpaCatalogue.create(jdbcTemplate); - var patientDataMapper = new PatientDataMapper(new PatientCatalogue(jdbcTemplate)); + var kpaCatalogue = catalogueFactory.catalogue(KpaCatalogue.class); + var patientDataMapper = new PatientDataMapper(catalogueFactory.catalogue(PatientCatalogue.class)); var kpaPatientDataMapper = new KpaPatientDataMapper(kpaCatalogue); var diagnosisDataMapper = new KpaDiagnosisDataMapper(kpaCatalogue); @@ -84,9 +85,8 @@ public class MtbDataMapper implements DataMapper { * @return The loaded Mtb file */ public Mtb getByCaseId(String caseId) { - var kpa = KpaCatalogue.create(this.jdbcTemplate); return this.getById( - kpa.getProcedureIdByCaseId(caseId) + this.catalogueFactory.catalogue(KpaCatalogue.class).getProcedureIdByCaseId(caseId) ); } } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/KpaCatalogueTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/KpaCatalogueTest.java index e704765..bd446b2 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/KpaCatalogueTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/KpaCatalogueTest.java @@ -1,5 +1,6 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; +import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -7,13 +8,14 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; @@ -44,4 +46,13 @@ class KpaCatalogueTest { .isEqualTo("SELECT * FROM dk_dnpm_kpa JOIN prozedur ON (prozedur.id = dk_dnpm_kpa.id) WHERE geloescht = 0 AND prozedur.id = ?"); } + @Test + void shouldThrowExceptionIfNoKpaProcedureFound() { + doAnswer(invocationOnMock -> List.of()) + .when(jdbcTemplate).query(anyString(), any(RowMapper.class), anyString()); + + var ex = assertThrows(DataAccessException.class, () -> catalogue.getProcedureIdByCaseId("16000123")); + assertThat(ex).hasMessage("No record found for case: 16000123"); + } + } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapperTest.java index b0c073e..d977a14 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapperTest.java @@ -1,6 +1,5 @@ package dev.pcvolkmer.onco.datamapper.mapper; -import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -11,7 +10,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(MockitoExtension.class) class MtbDataMapperTest { @@ -31,10 +29,4 @@ class MtbDataMapperTest { assertThat(MtbDataMapper.create(dataSource)).isNotNull(); } - @Test - void shouldThrowExceptionIfNoKpaProcedureFound() { - var ex = assertThrows(DataAccessException.class, () -> this.mtbDataMapper.getByCaseId("16000123")); - assertThat(ex).hasMessage("No record found for case: 16000123"); - } - }