From cd07078df3ed6c4e0c7b7478d6701ffd169236c9 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Tue, 28 Mar 2023 13:33:12 +0200 Subject: [PATCH] =?UTF-8?q?Klasse=20mit=20Hilfsfunktionen=20zum=20Pr=C3=BC?= =?UTF-8?q?fen=20und=20Ermitteln=20von=20Werten=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/DNPM/DNPMHelper.java | 29 ++-- .../java/DNPM/analyzer/AnalyzerUtils.java | 143 ++++++++++++++++++ .../java/DNPM/analyzer/AnalyzerUtilsTest.java | 137 +++++++++++++++++ 3 files changed, 293 insertions(+), 16 deletions(-) create mode 100644 src/main/java/DNPM/analyzer/AnalyzerUtils.java create mode 100644 src/test/java/DNPM/analyzer/AnalyzerUtilsTest.java diff --git a/src/main/java/DNPM/DNPMHelper.java b/src/main/java/DNPM/DNPMHelper.java index c4f6baa..f964cb8 100644 --- a/src/main/java/DNPM/DNPMHelper.java +++ b/src/main/java/DNPM/DNPMHelper.java @@ -1,5 +1,6 @@ package DNPM; +import DNPM.analyzer.AnalyzerUtils; import DNPM.services.systemtherapie.SystemtherapieService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -18,10 +19,7 @@ import org.hibernate.type.StandardBasicTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class DNPMHelper implements IProcedureAnalyzer { @@ -143,14 +141,13 @@ public class DNPMHelper implements IProcedureAnalyzer { } public List> getSystemischeTherapienFromDiagnose(final Map input) { - var diagnoseId = input.get("DiagnoseId"); - - if (null == diagnoseId || Integer.parseInt(diagnoseId.toString()) == 0) { + var diagnoseId = AnalyzerUtils.getRequiredId(input, "DiagnoseId"); + if (diagnoseId.isEmpty()) { logger.error("Kein Parameter 'DiagnoseId' angegeben, gebe 'null' zurück"); return null; } - return systemtherapieService.getSystemischeTherapienFromDiagnose(Integer.parseInt(diagnoseId.toString())); + return systemtherapieService.getSystemischeTherapienFromDiagnose(diagnoseId.get()); } public Object getProzedurenFromDiagnose(final Map input) { @@ -189,9 +186,9 @@ public class DNPMHelper implements IProcedureAnalyzer { } public Object getEmpfehlung(final Map input) { - var procedureID = input.get("ProcedureID"); + var procedureID = AnalyzerUtils.getRequiredId(input, "ProcedureID"); - if (null == procedureID || Integer.parseInt(procedureID.toString()) == 0) { + if (procedureID.isEmpty()) { logger.error("Kein Parameter 'ProcedureID' angegeben, gebe 'null' zurück"); return null; } @@ -202,7 +199,7 @@ public class DNPMHelper implements IProcedureAnalyzer { var sql = "SELECT prozedur.id, genname, geneid, geneidlink, empfehlung, beginndatum FROM prozedur " + "LEFT JOIN dk_mtb_einzelempfehlung em ON em.id = prozedur.id " + "JOIN data_form df ON prozedur.data_form_id = df.id AND df.name = 'MR.MTB_Einzelempfehlung' " - + "WHERE prozedur.hauptprozedur_id = " + Integer.parseInt(procedureID.toString()) + " AND prozedur.geloescht = 0 " + + "WHERE prozedur.hauptprozedur_id = " + procedureID.get() + " AND prozedur.geloescht = 0 " + "ORDER BY beginndatum"; SQLQuery query = session.createSQLQuery(sql) @@ -224,14 +221,14 @@ public class DNPMHelper implements IProcedureAnalyzer { public Object updateEmpfehlungPrio(final Map input) { // Auslesen und Prüfen der Parameter aus 'input' - var rid = input.get("rid"); - if (null == rid || Integer.parseInt(rid.toString()) == 0) { + var rid = AnalyzerUtils.getRequiredId(input, "rid"); + if (rid.isEmpty()) { logger.error("Kein Parameter 'rid' angegeben, gebe 'false' zurück"); return false; } - var strDate = input.get("bd"); - if (null == strDate || !strDate.toString().matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) { + var strDate = AnalyzerUtils.getRequiredValueMatching(input, "bd", "[\\d]{4}-[\\d]{2}-[\\d]{2}"); + if (strDate.isEmpty()) { logger.error("Kein oder ungültiger Parameter 'bd' angegeben, gebe 'false' zurück"); return false; } @@ -241,7 +238,7 @@ public class DNPMHelper implements IProcedureAnalyzer { //DateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd"); try { - String sql = "UPDATE prozedur SET beginndatum = '" + strDate + "' WHERE id = '" + rid + "' "; + String sql = "UPDATE prozedur SET beginndatum = '" + strDate.get() + "' WHERE id = '" + rid.get() + "' "; SQLQuery result = onkostarApi.getSessionFactory().getCurrentSession().createSQLQuery(sql); result.executeUpdate(); return true; diff --git a/src/main/java/DNPM/analyzer/AnalyzerUtils.java b/src/main/java/DNPM/analyzer/AnalyzerUtils.java new file mode 100644 index 0000000..96af781 --- /dev/null +++ b/src/main/java/DNPM/analyzer/AnalyzerUtils.java @@ -0,0 +1,143 @@ +package DNPM.analyzer; + +import java.util.Map; +import java.util.Optional; + +/** + * Klasse mit Hilfsfunktionen für Analyzer + * + * @since 0.1.0 + */ +public class AnalyzerUtils { + + /** + * Prüft, ob ein Optional mit Wert, wenn in InputMap ein Eintrag mit key key und Typ type + * gefunden wurde. + * + * @param input InputMap + * @param key Key des Werts + * @param type Typ des Werts + * @return true>, wenn ein Wert von dem Typ gefunden wurde + */ + public static boolean requiredValuePresent(final Map input, final String key, final Class type) { + var value = input.get(key); + + if (null == value) { + return false; + } + + return type.isInstance(value); + } + + /** + * Übergibt ein Optional mit Wert, wenn in InputMap ein Eintrag mit key key und Typ type + * gefunden wurde. Anderenfalls ein leeres Optional + * + *

Beispiel + *

+     *     var id = AnalyzerUtils.getRequiredValue(input, "id", Integer.class);
+     *     if (id.isEmpty()) {
+     *         logger.error("Keine ID angegeben!");
+     *         return false;
+     *     }
+     *
+     *     var idNummer = id.get();
+     *     ...
+     * 
+ * + * @param input InputMap + * @param key Key des Werts + * @param type Typ des Werts + * @return Optional mit entsprechendem Wert oder leeres Optional + */ + public static Optional getRequiredValue(final Map input, final String key, final Class type) { + if (! requiredValuePresent(input, key, type)) { + return Optional.empty(); + } + + @SuppressWarnings("unchecked") + var result = Optional.of((T)input.get(key)); + + return result; + } + + /** + * Prüft, ob ein Wert als Zeichenkette dem angegebenen RegExp entspricht + * + * @param input InputMap + * @param key Key des Werts + * @param regexp Der zu prüfende reguläre Ausdruck + * @return true>, wenn ein Wert gefunden wurde, der dem RegExp entspricht + */ + public static boolean requiredValueMatches(final Map input, final String key, final String regexp) { + var value = input.get(key); + + if (null == value) { + return false; + } + + return value.toString().matches(regexp); + } + + /** + * Übergibt ein Optional mit dem Wert als Zeichenkette, wenn er dem angegebenen RegExp entspricht. + * Hierzu wird die Methode toString() auf den Wert angewendet. + * + * @param input InputMap + * @param key Key des Werts + * @param regexp Der zu prüfende reguläre Ausdruck + * @return Optional mit entsprechendem Wert als Zeichenkette oder leeres Optional + */ + public static Optional getRequiredValueMatching(final Map input, final String key, final String regexp) { + if (! requiredValueMatches(input, key, regexp)) { + return Optional.empty(); + } + + return Optional.of(input.get(key).toString()); + } + + /** + * Prüft, ob ein Wert eine ID ist und damit eine Zahl größer Null ist. + * + * @param input InputMap + * @param key Key des Werts + * @return true>, wenn ein Wert gefunden wurde, der dem RegExp entspricht + */ + public static boolean requiredValueIsId(final Map input, final String key) { + return requiredValuePresent(input, key, Integer.class) && Integer.valueOf(input.get(key).toString()) > 0; + } + + /** + * Übergibt ein Optional, wenn der Wert eine ID ist und damit eine Zahl größer Null ist. + *

Beispiel + *

+     *     var id = AnalyzerUtils.getRequiredId(input, "id");
+     *     if (id.isEmpty()) {
+     *         logger.error("Keine gültige ID angegeben!");
+     *         return false;
+     *     }
+     *
+     *     // Ist hier immer größer als Null
+     *     var idNummer = id.get();
+     *     ...
+     * 
+ * + * @param input InputMap + * @param key Key des Werts + * @return Optional mit entsprechendem Wert oder leeres Optional + */ + public static Optional getRequiredId(final Map input, final String key) { + if (! requiredValuePresent(input, key, Integer.class)) { + return Optional.empty(); + } + + var id = (int)input.get(key); + + if (id > 0) { + return Optional.of(id); + } + + return Optional.empty(); + } + +} diff --git a/src/test/java/DNPM/analyzer/AnalyzerUtilsTest.java b/src/test/java/DNPM/analyzer/AnalyzerUtilsTest.java new file mode 100644 index 0000000..cf66daa --- /dev/null +++ b/src/test/java/DNPM/analyzer/AnalyzerUtilsTest.java @@ -0,0 +1,137 @@ +package DNPM.analyzer; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +public class AnalyzerUtilsTest { + + private final Map input = Map.of("value1", 1, "valueA", "A", "valueTrue", true); + + private static Set testTypeData() { + return Set.of( + new TestTypeData("value1", Integer.class).withExpectedResult(true), + new TestTypeData("valueA", String.class).withExpectedResult(true), + new TestTypeData("valueTrue", Boolean.class).withExpectedResult(true), + + new TestTypeData("value1", String.class).withExpectedResult(false), + new TestTypeData("valueA", Boolean.class).withExpectedResult(false), + new TestTypeData("valueTrue", Integer.class).withExpectedResult(false), + + new TestTypeData("value1", Boolean.class).withExpectedResult(false), + new TestTypeData("valueA", Integer.class).withExpectedResult(false), + new TestTypeData("valueTrue", String.class).withExpectedResult(false) + ); + } + + @ParameterizedTest + @MethodSource("testTypeData") + void testShouldReturnExpectedResultForTypedCheck(TestTypeData testData) { + var actual = AnalyzerUtils.requiredValuePresent(input, testData.key, testData.type); + assertThat(actual).isEqualTo(testData.result); + } + + private static Set testMatchData() { + return Set.of( + new TestMatchData("value1", "[\\d]").withExpectedResult(true), + new TestMatchData("valueA", "[A-Z]").withExpectedResult(true), + + new TestMatchData("value1", "[A-Z]").withExpectedResult(false), + new TestMatchData("valueA", "[a-z]").withExpectedResult(false), + new TestMatchData("valueA", "[\\d]").withExpectedResult(false) + ); + } + + @ParameterizedTest + @MethodSource("testMatchData") + void testShouldReturnExpectedResultForMatchCheck(TestMatchData testData) { + var actual = AnalyzerUtils.requiredValueMatches(input, testData.key, testData.regexp); + assertThat(actual).isEqualTo(testData.result); + } + + @Test + void testShouldCheckIfInputValueIsIdNumber() { + assertThat(AnalyzerUtils.requiredValueIsId(Map.of("value", 0), "value")).isFalse(); + assertThat(AnalyzerUtils.requiredValueIsId(Map.of("value", "ABC"), "value")).isFalse(); + assertThat(AnalyzerUtils.requiredValueIsId(Map.of("value", 1234), "value")).isTrue(); + } + + @Test + void testShouldReturnInputValueAsOptional() { + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", 1234), "value", Integer.class)).isEqualTo(Optional.of(1234)); + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", "ABC"), "value", String.class)).isEqualTo(Optional.of("ABC")); + + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", 1234), "value1", Integer.class)).isEmpty(); + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", "ABC"), "value1", String.class)).isEmpty(); + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", 1234), "value", String.class)).isEmpty(); + assertThat(AnalyzerUtils.getRequiredValue(Map.of("value", "ABC"), "value", Boolean.class)).isEmpty(); + } + + @Test + void testShouldReturnInputIdAsOptional() { + assertThat(AnalyzerUtils.getRequiredId(Map.of("value", 1234), "value")).isEqualTo(Optional.of(1234)); + + assertThat(AnalyzerUtils.getRequiredId(Map.of("value", 1234), "value1")).isEmpty(); + assertThat(AnalyzerUtils.getRequiredId(Map.of("value", "ABC"), "value")).isEmpty(); + assertThat(AnalyzerUtils.getRequiredId(Map.of("value", 0), "value")).isEmpty(); + } + + @Test + void testShouldReturnInputValueMatchingAsOptional() { + assertThat(AnalyzerUtils.getRequiredValueMatching(Map.of("value", 1234), "value", "[\\d]+")).isEqualTo(Optional.of("1234")); + assertThat(AnalyzerUtils.getRequiredValueMatching(Map.of("value", "ABC"), "value", "[A-Z]+")).isEqualTo(Optional.of("ABC")); + + assertThat(AnalyzerUtils.getRequiredValueMatching(Map.of("value", "ABC"), "value1", "[A-Z]+")).isEmpty(); + } + + private static class TestTypeData { + public final String key; + public final Class type; + + public boolean result; + + public TestTypeData(String key, Class type) { + this.key = key; + this.type = type; + } + + public TestTypeData withExpectedResult(boolean result) { + this.result = result; + return this; + } + + @Override + public String toString() { + return String.format("key: '%s', type: %s, result: %s", key, type.getSimpleName(), result); + } + } + + private static class TestMatchData { + public final String key; + public final String regexp; + + public boolean result; + + public TestMatchData(String key, String regexp) { + this.key = key; + this.regexp = regexp; + } + + public TestMatchData withExpectedResult(boolean result) { + this.result = result; + return this; + } + + @Override + public String toString() { + return String.format("key: '%s', regexp: '%s', result: %s", key, regexp, result); + } + } + +}