From ef5c91a352788a2ad84afa18fa0c7cdadec70ed8 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 20 Mar 2023 14:07:00 +0100 Subject: [PATCH] =?UTF-8?q?Issue=20#11:=20Service=20und=20Spring=20Data=20?= =?UTF-8?q?JPA=20Repository=20f=C3=BCr=20Systemeinstellungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../java/DNPM/config/PluginConfiguration.java | 16 ++++- .../DNPM/database/ReadOnlyRepository.java | 20 +++++++ .../DNPM/database/SettingsRepository.java | 14 +++++ .../java/DNPM/services/SettingsService.java | 47 +++++++++++++++ .../services/TherapieplanServiceFactory.java | 14 +++-- src/main/java/de/itc/db/dnpm/Setting.java | 43 ++++++++++++++ .../DNPM/config/PluginConfigurationTest.java | 6 +- .../TherapieplanServiceFactoryTest.java | 36 +++--------- .../DNPM/services/SettingsServiceTest.java | 58 +++++++++++++++++++ 10 files changed, 223 insertions(+), 37 deletions(-) create mode 100644 src/main/java/DNPM/database/ReadOnlyRepository.java create mode 100644 src/main/java/DNPM/database/SettingsRepository.java create mode 100644 src/main/java/DNPM/services/SettingsService.java create mode 100644 src/main/java/de/itc/db/dnpm/Setting.java create mode 100644 src/test/java/DNPM/services/SettingsServiceTest.java diff --git a/pom.xml b/pom.xml index c5bec8e..d47fce0 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,12 @@ ${spring-version} provided + + org.springframework.data + spring-data-jpa + 1.2.0.RELEASE + provided + com.fasterxml.jackson.core jackson-databind diff --git a/src/main/java/DNPM/config/PluginConfiguration.java b/src/main/java/DNPM/config/PluginConfiguration.java index 36b1875..825c57c 100644 --- a/src/main/java/DNPM/config/PluginConfiguration.java +++ b/src/main/java/DNPM/config/PluginConfiguration.java @@ -1,10 +1,12 @@ package DNPM.config; +import DNPM.database.SettingsRepository; import DNPM.services.*; import de.itc.onkostar.api.IOnkostarApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import javax.sql.DataSource; @@ -15,6 +17,7 @@ import javax.sql.DataSource; */ @Configuration @ComponentScan(basePackages = "DNPM.analyzer") +@EnableJpaRepositories(basePackages = "DNPM.database") public class PluginConfiguration { @Bean @@ -28,8 +31,17 @@ public class PluginConfiguration { } @Bean - public TherapieplanServiceFactory therapieplanServiceFactory(final IOnkostarApi onkostarApi, final FormService formService) { - return new TherapieplanServiceFactory(onkostarApi, formService); + public SettingsService settingsService(final SettingsRepository settingsRepository) { + return new SettingsService(settingsRepository); + } + + @Bean + public TherapieplanServiceFactory therapieplanServiceFactory( + final IOnkostarApi onkostarApi, + final SettingsService settingsService, + final FormService formService + ) { + return new TherapieplanServiceFactory(onkostarApi, settingsService, formService); } } diff --git a/src/main/java/DNPM/database/ReadOnlyRepository.java b/src/main/java/DNPM/database/ReadOnlyRepository.java new file mode 100644 index 0000000..775388d --- /dev/null +++ b/src/main/java/DNPM/database/ReadOnlyRepository.java @@ -0,0 +1,20 @@ +package DNPM.database; + +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.Repository; + +import java.io.Serializable; +import java.util.List; + +/** + * Basis-Repository for ReadOnly Spring-Data-JPA Repositories + *

Entity-Klassen müssen in Package de.itc.db.dnpm liegen + * @param Typ des Entities + * @param Typ der ID + */ +@NoRepositoryBean +public interface ReadOnlyRepository extends Repository { + + List findAll(); + +} diff --git a/src/main/java/DNPM/database/SettingsRepository.java b/src/main/java/DNPM/database/SettingsRepository.java new file mode 100644 index 0000000..9a6e331 --- /dev/null +++ b/src/main/java/DNPM/database/SettingsRepository.java @@ -0,0 +1,14 @@ +package DNPM.database; + +import de.itc.db.dnpm.Setting; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA Repository zum Lesen von Einstellungen + */ +@Repository("dnpmSettingRepository") +public interface SettingsRepository extends ReadOnlyRepository { + + Setting findByName(String name); + +} diff --git a/src/main/java/DNPM/services/SettingsService.java b/src/main/java/DNPM/services/SettingsService.java new file mode 100644 index 0000000..b07a2f3 --- /dev/null +++ b/src/main/java/DNPM/services/SettingsService.java @@ -0,0 +1,47 @@ +package DNPM.services; + +import DNPM.database.SettingsRepository; + +import java.util.Optional; + +/** + * Implementiert den Dienst zur Ermittlung von Systemeinstellungen + */ +public class SettingsService { + + private final SettingsRepository settingsRepository; + + public SettingsService(final SettingsRepository settingsRepository) { + this.settingsRepository = settingsRepository; + } + + /** + * Übergibt ein Optional für die Einstellung mit angegebenen Namen + * @param name Name der Einstellung + * @return Optional mit Wert der Einstellung oder ein leeres Optional, wenn Einstellung nicht gefunden + */ + public Optional getSetting(String name) { + var sid = settingsRepository.findByName(name); + if (null == sid) { + return Optional.empty(); + } + return Optional.of(sid.getValue()); + } + + /** + * Übergibt die SID als Optional + * @return Optional mit Wert der SID + */ + public Optional getSID() { + return getSetting("SID"); + } + + /** + * Übergibt die Einstellung für mehrere_mtb_in_mtbepisode + * @return Übergibt true, wenn mehrere_mtb_in_mtbepisode auf "Ja" gesetzt ist. + */ + public boolean multipleMtbsInMtbEpisode() { + var setting = getSetting("SID"); + return setting.isPresent() && setting.get().equals("true"); + } +} diff --git a/src/main/java/DNPM/services/TherapieplanServiceFactory.java b/src/main/java/DNPM/services/TherapieplanServiceFactory.java index 5b3b54c..0b64410 100644 --- a/src/main/java/DNPM/services/TherapieplanServiceFactory.java +++ b/src/main/java/DNPM/services/TherapieplanServiceFactory.java @@ -6,18 +6,22 @@ public class TherapieplanServiceFactory { private final IOnkostarApi onkostarApi; + private final SettingsService settingsService; + private final FormService formService; - public TherapieplanServiceFactory(IOnkostarApi onkostarApi, FormService formService) { + public TherapieplanServiceFactory( + final IOnkostarApi onkostarApi, + final SettingsService settingsService, + final FormService formService + ) { this.onkostarApi = onkostarApi; + this.settingsService = settingsService; this.formService = formService; } public TherapieplanService currentUsableInstance() { - if ( - null != onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode") - && onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode").equals("true") - ) { + if (settingsService.multipleMtbsInMtbEpisode()) { return new MultipleMtbTherapieplanService(); } diff --git a/src/main/java/de/itc/db/dnpm/Setting.java b/src/main/java/de/itc/db/dnpm/Setting.java new file mode 100644 index 0000000..262d2c9 --- /dev/null +++ b/src/main/java/de/itc/db/dnpm/Setting.java @@ -0,0 +1,43 @@ +package de.itc.db.dnpm; + +import org.hibernate.annotations.Immutable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Immutable +@Table(name = "einstellung") +public class Setting { + @Id + private Long id; + + private String name; + + @Column(name = "wert") + private String value; + + protected Setting() { + // No content + } + + public Setting(Long id, String name, String value) { + this.id = id; + this.name = name; + this.value = value; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } +} diff --git a/src/test/java/DNPM/config/PluginConfigurationTest.java b/src/test/java/DNPM/config/PluginConfigurationTest.java index 77c95e7..d94b3c7 100644 --- a/src/test/java/DNPM/config/PluginConfigurationTest.java +++ b/src/test/java/DNPM/config/PluginConfigurationTest.java @@ -1,6 +1,7 @@ package DNPM.config; import DNPM.services.FormService; +import DNPM.services.SettingsService; import DNPM.services.TherapieplanServiceFactory; import de.itc.onkostar.api.IOnkostarApi; import org.junit.jupiter.api.BeforeEach; @@ -17,6 +18,9 @@ public class PluginConfigurationTest { @Mock private IOnkostarApi onkostarApi; + @Mock + private SettingsService settingsService; + @Mock private FormService formService; @@ -29,7 +33,7 @@ public class PluginConfigurationTest { @Test void testShouldReturnTherapieplanServiceFactory() { - var actual = this.configuration.therapieplanServiceFactory(onkostarApi, formService); + var actual = this.configuration.therapieplanServiceFactory(onkostarApi, settingsService, formService); assertThat(actual).isInstanceOf(TherapieplanServiceFactory.class); } } diff --git a/src/test/java/DNPM/config/TherapieplanServiceFactoryTest.java b/src/test/java/DNPM/config/TherapieplanServiceFactoryTest.java index f974dcf..2f0022d 100644 --- a/src/test/java/DNPM/config/TherapieplanServiceFactoryTest.java +++ b/src/test/java/DNPM/config/TherapieplanServiceFactoryTest.java @@ -1,9 +1,6 @@ package DNPM.config; -import DNPM.services.DefaultTherapieplanService; -import DNPM.services.FormService; -import DNPM.services.MultipleMtbTherapieplanService; -import DNPM.services.TherapieplanServiceFactory; +import DNPM.services.*; import de.itc.onkostar.api.IOnkostarApi; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,8 +9,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -25,32 +20,21 @@ public class TherapieplanServiceFactoryTest { @Mock private FormService formService; + @Mock + private SettingsService settingsService; + private TherapieplanServiceFactory therapieplanServiceFactory; @BeforeEach void setup() { - this.therapieplanServiceFactory = new TherapieplanServiceFactory(onkostarApi, formService); + this.therapieplanServiceFactory = new TherapieplanServiceFactory(onkostarApi, settingsService, formService); } @Test void testShouldReturnDefaultTherapieplanServiceIfSettingIsFalse() { - doAnswer(invocationOnMock -> { - var settingName = invocationOnMock.getArgument(0, String.class); - if (settingName.equals("mehrere_mtb_in_mtbepisode")) { - return "false"; - } - return null; - }).when(onkostarApi).getGlobalSetting(anyString()); - + when(settingsService.multipleMtbsInMtbEpisode()).thenReturn(false); var actual = this.therapieplanServiceFactory.currentUsableInstance(); - assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); - } - - @Test - void testShouldReturnDefaultTherapieplanServiceIfNoSetting() { - when(onkostarApi.getGlobalSetting(anyString())).thenReturn(null); - var actual = this.therapieplanServiceFactory.currentUsableInstance(); assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); @@ -58,13 +42,7 @@ public class TherapieplanServiceFactoryTest { @Test void testShouldReturnMultipleMtbTherapieplanServiceIfSettingIsTrue() { - doAnswer(invocationOnMock -> { - var settingName = invocationOnMock.getArgument(0, String.class); - if (settingName.equals("mehrere_mtb_in_mtbepisode")) { - return "true"; - } - return null; - }).when(onkostarApi).getGlobalSetting(anyString()); + when(settingsService.multipleMtbsInMtbEpisode()).thenReturn(true); var actual = this.therapieplanServiceFactory.currentUsableInstance(); diff --git a/src/test/java/DNPM/services/SettingsServiceTest.java b/src/test/java/DNPM/services/SettingsServiceTest.java new file mode 100644 index 0000000..65e3f6d --- /dev/null +++ b/src/test/java/DNPM/services/SettingsServiceTest.java @@ -0,0 +1,58 @@ +package DNPM.services; + +import DNPM.database.SettingsRepository; +import de.itc.db.dnpm.Setting; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doAnswer; + +@ExtendWith(MockitoExtension.class) +public class SettingsServiceTest { + + @Mock + private SettingsRepository settingsRepository; + + private SettingsService service; + + @BeforeEach + void setUp() { + this.service = new SettingsService(settingsRepository); + } + + @Test + void shouldReturnSID() { + doAnswer(invocationOnMock -> { + var name = invocationOnMock.getArgument(0, String.class); + if (null != name && name.equals("SID")) { + return new Setting(1L, "SID", "12345"); + } + return null; + }).when(settingsRepository).findByName(anyString()); + + var actual = service.getSID(); + assertThat(actual).isPresent(); + assertThat(actual.get()).isEqualTo("12345"); + } + + @Test + void shouldReturnSIDByName() { + doAnswer(invocationOnMock -> { + var name = invocationOnMock.getArgument(0, String.class); + if (null != name && name.equals("SID")) { + return new Setting(1L, "SID", "12345"); + } + return null; + }).when(settingsRepository).findByName(anyString()); + + var actual = service.getSetting("SID"); + assertThat(actual).isPresent(); + assertThat(actual.get()).isEqualTo("12345"); + } + +}