1
0
mirror of https://github.com/pcvolkmer/mv64e-onkostar-data.git synced 2025-07-02 02:22:54 +00:00

refactor: add catalogue factory

This commit is contained in:
2025-06-21 11:28:46 +02:00
parent a70a96980a
commit a52c8cf3b8
5 changed files with 79 additions and 18 deletions

View File

@ -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
*

View File

@ -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<Class<? extends DataCatalogue>, 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 extends DataCatalogue> T catalogue(Class<T> 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);
});
}
}

View File

@ -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<Mtb> {
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<Mtb> {
*/
@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<Mtb> {
* @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)
);
}
}

View File

@ -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");
}
}

View File

@ -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");
}
}