diff options
Diffstat (limited to 'src')
103 files changed, 5276 insertions, 5085 deletions
diff --git a/src/main/java/de/itc/db/dnpm/Setting.java b/src/main/java/de/itc/db/dnpm/Setting.java index c6c6bc6..fb3b32c 100644 --- a/src/main/java/de/itc/db/dnpm/Setting.java +++ b/src/main/java/de/itc/db/dnpm/Setting.java @@ -19,44 +19,42 @@ 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; +import org.hibernate.annotations.Immutable; @Entity @Immutable @Table(name = "einstellung") public class Setting { - @Id - private Long id; + @Id private Long id; - private String name; + private String name; - @Column(name = "wert") - private String value; + @Column(name = "wert") + private String value; - protected Setting() { - // No content - } + protected Setting() { + // No content + } - public Setting(Long id, String name, String value) { - this.id = id; - this.name = name; - this.value = value; - } + public Setting(Long id, String name, String value) { + this.id = id; + this.name = name; + this.value = value; + } - public Long getId() { - return id; - } + public Long getId() { + return id; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public String getValue() { - return value; - } + public String getValue() { + return value; + } } diff --git a/src/main/java/dev/dnpm/oshelper/VerweisVon.java b/src/main/java/dev/dnpm/oshelper/VerweisVon.java index fa99a16..4e71471 100644 --- a/src/main/java/dev/dnpm/oshelper/VerweisVon.java +++ b/src/main/java/dev/dnpm/oshelper/VerweisVon.java @@ -30,25 +30,50 @@ public class VerweisVon { private String formname; private Date datum; - public VerweisVon() { - } + public VerweisVon() {} @SuppressWarnings("unused") - public int getProcedure_id() { return this.procedure_id; } - public int getData_form_id() { return this.data_form_id; } - public String getData_catalogue_name() { return this.data_catalogue; } - public String getData_catalogue_entry_name() { return this.data_catalogue_entry; } - public String getFormname() { return this.formname; } - public Date getDate() { return this.datum; } + public int getProcedure_id() { + return this.procedure_id; + } + + public int getData_form_id() { + return this.data_form_id; + } + + public String getData_catalogue_name() { + return this.data_catalogue; + } + + public String getData_catalogue_entry_name() { + return this.data_catalogue_entry; + } + + public String getFormname() { + return this.formname; + } + + public Date getDate() { + return this.datum; + } + public String getTable() { return "dk_" + this.data_catalogue.toLowerCase().replaceAll("[^a-zA-Z0-9]", "_"); } + public String getField() { return this.data_catalogue_entry.toLowerCase(); } + public String getSQL() { - return "SELECT " + this.getField() + " AS value FROM " + this.getTable() + " WHERE id = " + this.getProcedure_id(); + return "SELECT " + + this.getField() + + " AS value FROM " + + this.getTable() + + " WHERE id = " + + this.getProcedure_id(); } + private String getDatumAsString() { SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy"); String Datum = null; @@ -57,17 +82,37 @@ public class VerweisVon { } return Datum; } + public String getVerbundenesFormular() { String FName = "Formular " + this.getFormname(); - if (this.getDatumAsString() != null ) { FName += " vom " + this.getDatumAsString(); } + if (this.getDatumAsString() != null) { + FName += " vom " + this.getDatumAsString(); + } return FName; } @SuppressWarnings("unused") - public void setProcedure_id(int procedure_id) {this.procedure_id = procedure_id; } - public void setData_form_id(int data_form_id) {this.data_form_id = data_form_id; } - public void setData_catalogue_name(String data_catalogue_name) {this.data_catalogue = data_catalogue_name; } - public void setData_catalogue_entry_name(String data_catalogue_entry) {this.data_catalogue_entry = data_catalogue_entry; } - public void setDate(Date datum) { this.datum = datum; } - public void setFormname(String formname) { this.formname = formname; } + public void setProcedure_id(int procedure_id) { + this.procedure_id = procedure_id; + } + + public void setData_form_id(int data_form_id) { + this.data_form_id = data_form_id; + } + + public void setData_catalogue_name(String data_catalogue_name) { + this.data_catalogue = data_catalogue_name; + } + + public void setData_catalogue_entry_name(String data_catalogue_entry) { + this.data_catalogue_entry = data_catalogue_entry; + } + + public void setDate(Date datum) { + this.datum = datum; + } + + public void setFormname(String formname) { + this.formname = formname; + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/Analyzer.java b/src/main/java/dev/dnpm/oshelper/analyzer/Analyzer.java index 2704047..e028e1e 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/Analyzer.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/Analyzer.java @@ -23,9 +23,8 @@ import de.itc.onkostar.api.analysis.OnkostarPluginType; public abstract class Analyzer implements IPluginPart { - @Override - public final OnkostarPluginType getType() { - return OnkostarPluginType.ANALYZER; - } - + @Override + public final OnkostarPluginType getType() { + return OnkostarPluginType.ANALYZER; + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/AnalyzerUtils.java b/src/main/java/dev/dnpm/oshelper/analyzer/AnalyzerUtils.java index 489be33..c414fd6 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/AnalyzerUtils.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/AnalyzerUtils.java @@ -29,136 +29,143 @@ import java.util.Optional; */ public class AnalyzerUtils { - private AnalyzerUtils() {} - - /** - * Prüft, ob in InputMap einen Eintrag mit key <code>key</code> und Typ <code>type</code> - * gefunden wurde. - * - * @param input InputMap - * @param key Key des Werts - * @param type Typ des Werts - * @return <code>true</code>>, wenn ein Wert von dem Typ gefunden wurde - */ - public static boolean requiredValuePresent(final Map<String, Object> input, final String key, final Class<?> type) { - var value = input.get(key); - - if (null == value) { - return false; - } - - return type.isInstance(value); + private AnalyzerUtils() {} + + /** + * Prüft, ob in InputMap einen Eintrag mit key <code>key</code> und Typ <code>type</code> gefunden + * wurde. + * + * @param input InputMap + * @param key Key des Werts + * @param type Typ des Werts + * @return <code>true</code>>, wenn ein Wert von dem Typ gefunden wurde + */ + public static boolean requiredValuePresent( + final Map<String, Object> input, final String key, final Class<?> type) { + var value = input.get(key); + + if (null == value) { + return false; } - /** - * Übergibt ein Optional mit Wert, wenn in InputMap ein Eintrag mit key <code>key</code> und Typ <code>type</code> - * gefunden wurde. Anderenfalls ein leeres Optional - * - * <p><b>Beispiel</b> - * <pre> - * var id = AnalyzerUtils.getRequiredValue(input, "id", Integer.class); - * if (id.isEmpty()) { - * logger.error("Keine ID angegeben!"); - * return false; - * } - * - * var idNummer = id.get(); - * ... - * </pre> - * - * @param input InputMap - * @param key Key des Werts - * @param type Typ des Werts - * @return Optional mit entsprechendem Wert oder leeres Optional - */ - public static <T> Optional<T> getRequiredValue(final Map<String, Object> input, final String key, final Class<T> type) { - if (! requiredValuePresent(input, key, type)) { - return Optional.empty(); - } - - @SuppressWarnings("unchecked") - var result = Optional.of((T)input.get(key)); - - return result; + return type.isInstance(value); + } + + /** + * Übergibt ein Optional mit Wert, wenn in InputMap ein Eintrag mit key <code>key</code> und Typ + * <code>type</code> gefunden wurde. Anderenfalls ein leeres Optional + * + * <p><b>Beispiel</b> + * + * <pre> + * var id = AnalyzerUtils.getRequiredValue(input, "id", Integer.class); + * if (id.isEmpty()) { + * logger.error("Keine ID angegeben!"); + * return false; + * } + * + * var idNummer = id.get(); + * ... + * </pre> + * + * @param input InputMap + * @param key Key des Werts + * @param type Typ des Werts + * @return Optional mit entsprechendem Wert oder leeres Optional + */ + public static <T> Optional<T> getRequiredValue( + final Map<String, Object> input, final String key, final Class<T> type) { + if (!requiredValuePresent(input, key, type)) { + return Optional.empty(); } - /** - * Prüft, ob ein Wert in der InputMap als Zeichenkette dem angegebenen RegExp entspricht - * - * @param input InputMap - * @param key Key des Werts - * @param regexp Der zu prüfende reguläre Ausdruck - * @return <code>true</code>>, wenn ein Wert gefunden wurde, der dem RegExp entspricht - */ - public static boolean requiredValueMatches(final Map<String, Object> input, final String key, final String regexp) { - var value = input.get(key); - - if (null == value) { - return false; - } - - return value.toString().matches(regexp); + @SuppressWarnings("unchecked") + var result = Optional.of((T) input.get(key)); + + return result; + } + + /** + * Prüft, ob ein Wert in der InputMap als Zeichenkette dem angegebenen RegExp entspricht + * + * @param input InputMap + * @param key Key des Werts + * @param regexp Der zu prüfende reguläre Ausdruck + * @return <code>true</code>>, wenn ein Wert gefunden wurde, der dem RegExp entspricht + */ + public static boolean requiredValueMatches( + final Map<String, Object> input, final String key, final String regexp) { + var value = input.get(key); + + if (null == value) { + return false; } - /** - * Übergibt ein Optional mit dem Wert als Zeichenkette, wenn er dem angegebenen RegExp entspricht. - * Hierzu wird die Methode <code>toString()</code> 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<String> getRequiredValueMatching(final Map<String, Object> input, final String key, final String regexp) { - if (! requiredValueMatches(input, key, regexp)) { - return Optional.empty(); - } - - return Optional.of(input.get(key).toString()); + return value.toString().matches(regexp); + } + + /** + * Übergibt ein Optional mit dem Wert als Zeichenkette, wenn er dem angegebenen RegExp entspricht. + * Hierzu wird die Methode <code>toString()</code> 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<String> getRequiredValueMatching( + final Map<String, Object> input, final String key, final String regexp) { + if (!requiredValueMatches(input, key, regexp)) { + return Optional.empty(); } - /** - * Prüft, ob ein Wert in der InputMap eine ID ist und damit eine Zahl größer Null ist. - * - * @param input InputMap - * @param key Key des Werts - * @return <code>true</code>>, wenn ein Wert gefunden wurde, der dem RegExp entspricht - */ - public static boolean requiredValueIsId(final Map<String, Object> input, final String key) { - return requiredValuePresent(input, key, Integer.class) && Integer.parseInt(input.get(key).toString()) > 0; + return Optional.of(input.get(key).toString()); + } + + /** + * Prüft, ob ein Wert in der InputMap eine ID ist und damit eine Zahl größer Null ist. + * + * @param input InputMap + * @param key Key des Werts + * @return <code>true</code>>, wenn ein Wert gefunden wurde, der dem RegExp entspricht + */ + public static boolean requiredValueIsId(final Map<String, Object> input, final String key) { + return requiredValuePresent(input, key, Integer.class) + && Integer.parseInt(input.get(key).toString()) > 0; + } + + /** + * Übergibt ein Optional, wenn der Wert eine ID ist und damit eine Zahl größer Null ist. + * + * <p><b>Beispiel</b> + * + * <pre> + * 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(); + * ... + * </pre> + * + * @param input InputMap + * @param key Key des Werts + * @return Optional mit entsprechendem Wert oder leeres Optional + */ + public static Optional<Integer> getRequiredId(final Map<String, Object> input, final String key) { + if (!requiredValuePresent(input, key, Integer.class)) { + return Optional.empty(); } - /** - * Übergibt ein Optional, wenn der Wert eine ID ist und damit eine Zahl größer Null ist. - * <p><b>Beispiel</b> - * <pre> - * 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(); - * ... - * </pre> - * - * @param input InputMap - * @param key Key des Werts - * @return Optional mit entsprechendem Wert oder leeres Optional - */ - public static Optional<Integer> getRequiredId(final Map<String, Object> 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(); + var id = (int) input.get(key); + + if (id > 0) { + return Optional.of(id); } + return Optional.empty(); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/AtcCodesHelper.java b/src/main/java/dev/dnpm/oshelper/analyzer/AtcCodesHelper.java index 4ac4b79..0d2a378 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/AtcCodesHelper.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/AtcCodesHelper.java @@ -24,76 +24,74 @@ import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyzerRequirement; import dev.dnpm.oshelper.atc.AgentCode; import dev.dnpm.oshelper.atc.services.AgentCodeService; -import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.springframework.stereotype.Component; @Component public class AtcCodesHelper extends BackendService { - private final List<AgentCodeService> agentCodeServices; + private final List<AgentCodeService> agentCodeServices; - public AtcCodesHelper(List<AgentCodeService> agentCodeServices) { - this.agentCodeServices = agentCodeServices; - } + public AtcCodesHelper(List<AgentCodeService> agentCodeServices) { + this.agentCodeServices = agentCodeServices; + } - /** - * @deprecated - */ - @Override - public boolean isRelevantForDeletedProcedure() { - return false; - } + /** + * @deprecated + */ + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return false; - } + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { + return false; + } - @Override - public boolean isSynchronous() { - return false; - } + @Override + public boolean isSynchronous() { + return false; + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - /** - * Return list with ATC codes and agents. - * Usage in script: - * - * <pre> - * executePluginMethod( - * 'AtcCodesHelper', - * 'query', - * { q: '', size: 10 }, - * function (result) {console.log(result);}, - * false - * ); - * </pre> - * - * @param input The data Map - * @return The result list filtered by input - */ - public List<AgentCode> query(final Map<String, Object> input) { - String query = ""; - if (null != input.get("q")) { - query = input.get("q").toString(); - } + /** + * Return list with ATC codes and agents. Usage in script: + * + * <pre> + * executePluginMethod( + * 'AtcCodesHelper', + * 'query', + * { q: '', size: 10 }, + * function (result) {console.log(result);}, + * false + * ); + * </pre> + * + * @param input The data Map + * @return The result list filtered by input + */ + public List<AgentCode> query(final Map<String, Object> input) { + String query = ""; + if (null != input.get("q")) { + query = input.get("q").toString(); + } - int size = Integer.parseInt(input.get("size").toString()); - if (size == 0) { - size = 10; - } - var result = new ArrayList<AgentCode>(); - for (var agentCodeService : this.agentCodeServices) { - result.addAll(agentCodeService.findAgentCodes(query, size)); - } - return result.stream().distinct().sorted().collect(Collectors.toList()); + int size = Integer.parseInt(input.get("size").toString()); + if (size == 0) { + size = 10; + } + var result = new ArrayList<AgentCode>(); + for (var agentCodeService : this.agentCodeServices) { + result.addAll(agentCodeService.findAgentCodes(query, size)); } + return result.stream().distinct().sorted().collect(Collectors.toList()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/BackendService.java b/src/main/java/dev/dnpm/oshelper/analyzer/BackendService.java index 8ec61f8..e249291 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/BackendService.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/BackendService.java @@ -25,20 +25,20 @@ import de.itc.onkostar.api.analysis.OnkostarPluginType; public abstract class BackendService implements IPluginPart { - @Override - public final OnkostarPluginType getType() { - return OnkostarPluginType.BACKEND_SERVICE; - } - - /** - * Ein Backend-Service verwendet die Methode nicht, daher wird hier eine final Stub-Implementierung - * verwendet, die ein Überschreiben verhindert. - * @param procedure - * @param disease - */ - @Override - public final void analyze(Procedure procedure, Disease disease) { - // No op - } + @Override + public final OnkostarPluginType getType() { + return OnkostarPluginType.BACKEND_SERVICE; + } + /** + * Ein Backend-Service verwendet die Methode nicht, daher wird hier eine final + * Stub-Implementierung verwendet, die ein Überschreiben verhindert. + * + * @param procedure + * @param disease + */ + @Override + public final void analyze(Procedure procedure, Disease disease) { + // No op + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/ConsentManager.java b/src/main/java/dev/dnpm/oshelper/analyzer/ConsentManager.java index e13327b..924e726 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/ConsentManager.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/ConsentManager.java @@ -19,64 +19,64 @@ package dev.dnpm.oshelper.analyzer; -import dev.dnpm.oshelper.services.consent.ConsentManagerServiceFactory; import de.itc.onkostar.api.Disease; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyzerRequirement; +import dev.dnpm.oshelper.services.consent.ConsentManagerServiceFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ConsentManager extends Analyzer { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - private final ConsentManagerServiceFactory consentManagerServiceFactory; + private final ConsentManagerServiceFactory consentManagerServiceFactory; - public ConsentManager( - final IOnkostarApi onkostarApi, - final ConsentManagerServiceFactory consentManagerServiceFactory - ) { - this.onkostarApi = onkostarApi; - this.consentManagerServiceFactory = consentManagerServiceFactory; - } + public ConsentManager( + final IOnkostarApi onkostarApi, + final ConsentManagerServiceFactory consentManagerServiceFactory) { + this.onkostarApi = onkostarApi; + this.consentManagerServiceFactory = consentManagerServiceFactory; + } - @Override - public String getDescription() { - return "Aktualisiert Consent Daten in verknüpften Formularen"; - } + @Override + public String getDescription() { + return "Aktualisiert Consent Daten in verknüpften Formularen"; + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - @Override - public boolean isRelevantForAnalyzer(Procedure prozedur, Disease erkrankung) { - return prozedur.getFormName().equals(onkostarApi.getGlobalSetting("consentform")); - } + @Override + public boolean isRelevantForAnalyzer(Procedure prozedur, Disease erkrankung) { + return prozedur.getFormName().equals(onkostarApi.getGlobalSetting("consentform")); + } - @Override - public boolean isRelevantForDeletedProcedure() { - // TODO is relevant for deleted procedure = true - return false; - } + @Override + public boolean isRelevantForDeletedProcedure() { + // TODO is relevant for deleted procedure = true + return false; + } - @Override - public boolean isSynchronous() { - return true; - } + @Override + public boolean isSynchronous() { + return true; + } - @Override - public void analyze(Procedure prozedur, Disease erkrankung) { - var consentManagerService = consentManagerServiceFactory.currentUsableInstance(); - if (! consentManagerService.canApply(prozedur)) { - logger.error("Fehler im ConsentManagement: Kann Prozedur mit Formularnamen '{}' nicht anwenden", prozedur.getFormName()); - return; - } - consentManagerService.applyConsent(prozedur); + @Override + public void analyze(Procedure prozedur, Disease erkrankung) { + var consentManagerService = consentManagerServiceFactory.currentUsableInstance(); + if (!consentManagerService.canApply(prozedur)) { + logger.error( + "Fehler im ConsentManagement: Kann Prozedur mit Formularnamen '{}' nicht anwenden", + prozedur.getFormName()); + return; } - + consentManagerService.applyConsent(prozedur); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/DNPMHelper.java b/src/main/java/dev/dnpm/oshelper/analyzer/DNPMHelper.java index 2559e3d..f779154 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/DNPMHelper.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/DNPMHelper.java @@ -19,18 +19,22 @@ package dev.dnpm.oshelper.analyzer; -import dev.dnpm.oshelper.dto.EcogStatusWithDate; -import dev.dnpm.oshelper.VerweisVon; -import dev.dnpm.oshelper.security.DelegatingDataBasedPermissionEvaluator; -import dev.dnpm.oshelper.security.IllegalSecuredObjectAccessException; -import dev.dnpm.oshelper.security.PermissionType; -import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.itc.onkostar.api.Disease; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyzerRequirement; +import dev.dnpm.oshelper.VerweisVon; +import dev.dnpm.oshelper.dto.EcogStatusWithDate; +import dev.dnpm.oshelper.security.DelegatingDataBasedPermissionEvaluator; +import dev.dnpm.oshelper.security.IllegalSecuredObjectAccessException; +import dev.dnpm.oshelper.security.PermissionType; +import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -40,240 +44,252 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContextHolder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class DNPMHelper extends BackendService { - private static final Logger logger = LoggerFactory.getLogger(DNPMHelper.class); + private static final Logger logger = LoggerFactory.getLogger(DNPMHelper.class); - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - private final SystemtherapieService systemtherapieService; + private final SystemtherapieService systemtherapieService; - private final DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; + private final DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; - public DNPMHelper( - final IOnkostarApi onkostarApi, - final SystemtherapieService systemtherapieService, - final DelegatingDataBasedPermissionEvaluator permissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.systemtherapieService = systemtherapieService; - this.delegatingDataBasedPermissionEvaluator = permissionEvaluator; - } + public DNPMHelper( + final IOnkostarApi onkostarApi, + final SystemtherapieService systemtherapieService, + final DelegatingDataBasedPermissionEvaluator permissionEvaluator) { + this.onkostarApi = onkostarApi; + this.systemtherapieService = systemtherapieService; + this.delegatingDataBasedPermissionEvaluator = permissionEvaluator; + } - @Override - public String getDescription() { - return "Methoden für DNPM-Formulare"; - } + @Override + public String getDescription() { + return "Methoden für DNPM-Formulare"; + } - @Override - public boolean isRelevantForDeletedProcedure() { - return false; - } + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } - @Override - public boolean isSynchronous() { - return true; - } + @Override + public boolean isSynchronous() { + return true; + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - @Override - public boolean isRelevantForAnalyzer(Procedure entry, Disease currentDisease) { - // Plugin enthält nur Methoden für Formulare und soll nicht ausgeführt werden - return false; - } + @Override + public boolean isRelevantForAnalyzer(Procedure entry, Disease currentDisease) { + // Plugin enthält nur Methoden für Formulare und soll nicht ausgeführt werden + return false; + } - @SuppressWarnings("unchecked") - public List<Map<String, String>> getVerweise(final Map<String, Object> input) { - var procedureId = AnalyzerUtils.getRequiredId(input, "ProcedureId"); - var patientId = AnalyzerUtils.getRequiredId(input, "PatientId"); + @SuppressWarnings("unchecked") + public List<Map<String, String>> getVerweise(final Map<String, Object> input) { + var procedureId = AnalyzerUtils.getRequiredId(input, "ProcedureId"); + var patientId = AnalyzerUtils.getRequiredId(input, "PatientId"); - if (procedureId.isEmpty() || patientId.isEmpty()) { - return null; - } - - var verbundeneFormulare = new ArrayList<Map<String, String>>(); - - try { - SessionFactory sessionFactory = onkostarApi.getSessionFactory(); - Session session = sessionFactory.getCurrentSession(); - - String sql = "SELECT prozedur.id AS procedure_id, prozedur.data_form_id, data_catalogue.name AS data_catalogue, data_catalogue_entry.name AS data_catalogue_entry, data_form.description AS formname, prozedur.beginndatum AS datum " + - "FROM prozedur " + - "LEFT JOIN data_form_data_catalogue ON data_form_data_catalogue.data_form_id = prozedur.data_form_id " + - "LEFT JOIN data_catalogue_entry ON data_catalogue_entry.data_catalogue_id = data_form_data_catalogue.data_catalogue_id " + - "LEFT JOIN data_catalogue ON data_catalogue.id = data_catalogue_entry.data_catalogue_id " + - "LEFT JOIN data_form ON data_form.id = prozedur.data_form_id " + - "WHERE patient_id = " + patientId.get() + " " + - "AND geloescht = 0 " + - "AND data_catalogue_entry.type = 'formReference' " + - "GROUP BY prozedur.id, prozedur.data_form_id, data_catalogue.name, data_catalogue_entry.name"; - - SQLQuery query = session.createSQLQuery(sql) - .addScalar("procedure_id", StandardBasicTypes.INTEGER) - .addScalar("data_form_id", StandardBasicTypes.INTEGER) - .addScalar("data_catalogue", StandardBasicTypes.STRING) - .addScalar("data_catalogue_entry", StandardBasicTypes.STRING) - .addScalar("formname", StandardBasicTypes.STRING) - .addScalar("datum", StandardBasicTypes.DATE); - - query.setResultTransformer(Transformers.aliasToBean(VerweisVon.class)); - List<VerweisVon> result = query.list(); - try { - int value = 0; - for (VerweisVon verweisVon : result) { - sql = verweisVon.getSQL(); - query = session.createSQLQuery(sql) - .addScalar("value", StandardBasicTypes.INTEGER); - if (query.uniqueResult() != null) { - value = (Integer) query.uniqueResult(); - } - if (value == procedureId.get()) { - verbundeneFormulare.add(Map.of("formular", verweisVon.getVerbundenesFormular())); - value = 0; - } - } - } catch (Exception e) { - logger.warn("Fehler beim Hinzufügen eines Formularverweises", e); - } - } catch (Exception e) { - logger.error("Fehler beim Ermitteln der Formularverweise", e); - return null; - } - return verbundeneFormulare; + if (procedureId.isEmpty() || patientId.isEmpty()) { + return null; } - public List<Map<String, String>> getSystemischeTherapienFromDiagnose(final Map<String, Object> input) { - var diagnoseId = AnalyzerUtils.getRequiredId(input, "DiagnoseId"); - if (diagnoseId.isEmpty()) { - logger.error("Kein Parameter 'DiagnoseId' angegeben, gebe 'null' zurück"); - return null; + var verbundeneFormulare = new ArrayList<Map<String, String>>(); + + try { + SessionFactory sessionFactory = onkostarApi.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + + String sql = + "SELECT prozedur.id AS procedure_id, prozedur.data_form_id, data_catalogue.name AS data_catalogue, data_catalogue_entry.name AS data_catalogue_entry, data_form.description AS formname, prozedur.beginndatum AS datum " + + "FROM prozedur " + + "LEFT JOIN data_form_data_catalogue ON data_form_data_catalogue.data_form_id = prozedur.data_form_id " + + "LEFT JOIN data_catalogue_entry ON data_catalogue_entry.data_catalogue_id = data_form_data_catalogue.data_catalogue_id " + + "LEFT JOIN data_catalogue ON data_catalogue.id = data_catalogue_entry.data_catalogue_id " + + "LEFT JOIN data_form ON data_form.id = prozedur.data_form_id " + + "WHERE patient_id = " + + patientId.get() + + " " + + "AND geloescht = 0 " + + "AND data_catalogue_entry.type = 'formReference' " + + "GROUP BY prozedur.id, prozedur.data_form_id, data_catalogue.name, data_catalogue_entry.name"; + + SQLQuery query = + session + .createSQLQuery(sql) + .addScalar("procedure_id", StandardBasicTypes.INTEGER) + .addScalar("data_form_id", StandardBasicTypes.INTEGER) + .addScalar("data_catalogue", StandardBasicTypes.STRING) + .addScalar("data_catalogue_entry", StandardBasicTypes.STRING) + .addScalar("formname", StandardBasicTypes.STRING) + .addScalar("datum", StandardBasicTypes.DATE); + + query.setResultTransformer(Transformers.aliasToBean(VerweisVon.class)); + List<VerweisVon> result = query.list(); + try { + int value = 0; + for (VerweisVon verweisVon : result) { + sql = verweisVon.getSQL(); + query = session.createSQLQuery(sql).addScalar("value", StandardBasicTypes.INTEGER); + if (query.uniqueResult() != null) { + value = (Integer) query.uniqueResult(); + } + if (value == procedureId.get()) { + verbundeneFormulare.add(Map.of("formular", verweisVon.getVerbundenesFormular())); + value = 0; + } } - - return systemtherapieService.getSystemischeTherapienFromDiagnose(diagnoseId.get()); + } catch (Exception e) { + logger.warn("Fehler beim Hinzufügen eines Formularverweises", e); + } + } catch (Exception e) { + logger.error("Fehler beim Ermitteln der Formularverweise", e); + return null; + } + return verbundeneFormulare; + } + + public List<Map<String, String>> getSystemischeTherapienFromDiagnose( + final Map<String, Object> input) { + var diagnoseId = AnalyzerUtils.getRequiredId(input, "DiagnoseId"); + if (diagnoseId.isEmpty()) { + logger.error("Kein Parameter 'DiagnoseId' angegeben, gebe 'null' zurück"); + return null; } - public String getProzedurenFromDiagnose(final Map<String, Object> input) { - // Prozedur, Feldname, Wert - var dataForm = AnalyzerUtils.getRequiredValue(input, "dataForm", String.class); - var diagnoseId = AnalyzerUtils.getRequiredId(input, "DiagnoseId"); - var patientId = AnalyzerUtils.getRequiredId(input, "PatientId"); + return systemtherapieService.getSystemischeTherapienFromDiagnose(diagnoseId.get()); + } - if (dataForm.isEmpty() || diagnoseId.isEmpty() || patientId.isEmpty()) { - return ""; - } + public String getProzedurenFromDiagnose(final Map<String, Object> input) { + // Prozedur, Feldname, Wert + var dataForm = AnalyzerUtils.getRequiredValue(input, "dataForm", String.class); + var diagnoseId = AnalyzerUtils.getRequiredId(input, "DiagnoseId"); + var patientId = AnalyzerUtils.getRequiredId(input, "PatientId"); - var formulare = new ArrayList<Map<String, Object>>(); - List<Procedure> prozeduren = onkostarApi.getProceduresByPatientId(patientId.get()); - for (Procedure Prozedur : prozeduren) { - // Formular gehört zur aktuellen Diagnose und hat den angegebenen Namen - if (Prozedur.getDiseaseIds().contains(diagnoseId.get()) && Prozedur.getFormName().contains(dataForm.get())) { - // alle Werte auslesen - // System.out.println(WerteListe.getKey() + ": " + WerteListe.getValue()); - formulare.add(Map.of( - "Formular", Prozedur.getFormName(), - "Felder", new HashMap<>(Prozedur.getAllValues()) - )); - } - } - try { - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.writeValueAsString(formulare); - } catch (JsonProcessingException e) { - logger.error("Kann Formulare nicht in JSON mappen", e); - } - return ""; + if (dataForm.isEmpty() || diagnoseId.isEmpty() || patientId.isEmpty()) { + return ""; } - public Object getEmpfehlung(final Map<String, Object> input) { - var procedureID = AnalyzerUtils.getRequiredId(input, "ProcedureID"); - - if (procedureID.isEmpty()) { - logger.error("Kein Parameter 'ProcedureID' angegeben, gebe 'null' zurück"); - return null; - } - - try { - SessionFactory sessionFactory = onkostarApi.getSessionFactory(); - Session session = sessionFactory.getCurrentSession(); - 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 = " + procedureID.get() + " AND prozedur.geloescht = 0 " - + "ORDER BY beginndatum"; - - SQLQuery query = session.createSQLQuery(sql) - .addScalar("id", StandardBasicTypes.STRING) - .addScalar("genname", StandardBasicTypes.STRING) - .addScalar("geneid", StandardBasicTypes.STRING) - .addScalar("geneidlink", StandardBasicTypes.STRING) - .addScalar("empfehlung", StandardBasicTypes.STRING) - .addScalar("beginndatum", StandardBasicTypes.STRING); - - @SuppressWarnings("unchecked") - List<String[]> rows = query.list(); - return rows; - } catch (Exception e) { - logger.error("Fehler bei Abfrage von Empfehlungen", e); - return null; - } + var formulare = new ArrayList<Map<String, Object>>(); + List<Procedure> prozeduren = onkostarApi.getProceduresByPatientId(patientId.get()); + for (Procedure Prozedur : prozeduren) { + // Formular gehört zur aktuellen Diagnose und hat den angegebenen Namen + if (Prozedur.getDiseaseIds().contains(diagnoseId.get()) + && Prozedur.getFormName().contains(dataForm.get())) { + // alle Werte auslesen + // System.out.println(WerteListe.getKey() + ": " + WerteListe.getValue()); + formulare.add( + Map.of( + "Formular", + Prozedur.getFormName(), + "Felder", + new HashMap<>(Prozedur.getAllValues()))); + } + } + try { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(formulare); + } catch (JsonProcessingException e) { + logger.error("Kann Formulare nicht in JSON mappen", e); } + return ""; + } - public Object updateEmpfehlungPrio(final Map<String, Object> input) { - // Auslesen und Prüfen der Parameter aus 'input' - var rid = AnalyzerUtils.getRequiredId(input, "rid"); - if (rid.isEmpty()) { - logger.error("Kein Parameter 'rid' angegeben, gebe 'false' zurück"); - return false; - } + public Object getEmpfehlung(final Map<String, Object> input) { + var procedureID = AnalyzerUtils.getRequiredId(input, "ProcedureID"); - 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; - } + if (procedureID.isEmpty()) { + logger.error("Kein Parameter 'ProcedureID' angegeben, gebe 'null' zurück"); + return null; + } - //String strD = strDate.toString(); - //String CompareDate = strD.substring(1, 11); - //DateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd"); - - try { - String sql = "UPDATE prozedur SET beginndatum = '" + strDate.get() + "' WHERE id = '" + rid.get() + "' "; - SQLQuery result = onkostarApi.getSessionFactory().getCurrentSession().createSQLQuery(sql); - result.executeUpdate(); - return true; - } catch (Exception e) { - return "Achtung: Ein Fehler ist aufgetreten, Änderung konnte nicht gespeichert werden!"; - //return null; - } + try { + SessionFactory sessionFactory = onkostarApi.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + 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 = " + + procedureID.get() + + " AND prozedur.geloescht = 0 " + + "ORDER BY beginndatum"; + + SQLQuery query = + session + .createSQLQuery(sql) + .addScalar("id", StandardBasicTypes.STRING) + .addScalar("genname", StandardBasicTypes.STRING) + .addScalar("geneid", StandardBasicTypes.STRING) + .addScalar("geneidlink", StandardBasicTypes.STRING) + .addScalar("empfehlung", StandardBasicTypes.STRING) + .addScalar("beginndatum", StandardBasicTypes.STRING); + + @SuppressWarnings("unchecked") + List<String[]> rows = query.list(); + return rows; + } catch (Exception e) { + logger.error("Fehler bei Abfrage von Empfehlungen", e); + return null; + } + } + + public Object updateEmpfehlungPrio(final Map<String, Object> input) { + // Auslesen und Prüfen der Parameter aus 'input' + var rid = AnalyzerUtils.getRequiredId(input, "rid"); + if (rid.isEmpty()) { + logger.error("Kein Parameter 'rid' angegeben, gebe 'false' zurück"); + return false; + } + 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; } - public List<EcogStatusWithDate> getEcogStatus(final Map<String, Object> input) { - var pid = AnalyzerUtils.getRequiredId(input, "PatientId"); - if (pid.isEmpty()) { - logger.error("Kein Parameter 'PatientId' angegeben, gebe leere Liste zurück"); - return List.of(); - } + // String strD = strDate.toString(); + // String CompareDate = strD.substring(1, 11); + // DateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd"); + + try { + String sql = + "UPDATE prozedur SET beginndatum = '" + + strDate.get() + + "' WHERE id = '" + + rid.get() + + "' "; + SQLQuery result = onkostarApi.getSessionFactory().getCurrentSession().createSQLQuery(sql); + result.executeUpdate(); + return true; + } catch (Exception e) { + return "Achtung: Ein Fehler ist aufgetreten, Änderung konnte nicht gespeichert werden!"; + // return null; + } + } - var patient = onkostarApi.getPatient(pid.get()); - if (null == patient) { - logger.error("Patient nicht gefunden, gebe leere Liste zurück"); - return List.of(); - } + public List<EcogStatusWithDate> getEcogStatus(final Map<String, Object> input) { + var pid = AnalyzerUtils.getRequiredId(input, "PatientId"); + if (pid.isEmpty()) { + logger.error("Kein Parameter 'PatientId' angegeben, gebe leere Liste zurück"); + return List.of(); + } - if (delegatingDataBasedPermissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), patient, PermissionType.READ)) { - return systemtherapieService.ecogStatus(patient); - } + var patient = onkostarApi.getPatient(pid.get()); + if (null == patient) { + logger.error("Patient nicht gefunden, gebe leere Liste zurück"); + return List.of(); + } - throw new IllegalSecuredObjectAccessException("Kein Zugriff auf diesen Patienten"); + if (delegatingDataBasedPermissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), patient, PermissionType.READ)) { + return systemtherapieService.ecogStatus(patient); } -}
\ No newline at end of file + + throw new IllegalSecuredObjectAccessException("Kein Zugriff auf diesen Patienten"); + } +} diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzer.java b/src/main/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzer.java index 941d3c8..12dc47a 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzer.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzer.java @@ -19,135 +19,136 @@ package dev.dnpm.oshelper.analyzer; +import de.itc.onkostar.api.Disease; +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Procedure; +import de.itc.onkostar.api.analysis.AnalyzerRequirement; import dev.dnpm.oshelper.dto.Studie; import dev.dnpm.oshelper.dto.Variant; import dev.dnpm.oshelper.security.PermissionType; import dev.dnpm.oshelper.security.PersonPoolBasedPermissionEvaluator; import dev.dnpm.oshelper.services.StudienService; import dev.dnpm.oshelper.services.molekulargenetik.MolekulargenetikFormService; -import de.itc.onkostar.api.Disease; -import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Procedure; -import de.itc.onkostar.api.analysis.AnalyzerRequirement; +import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; -import java.util.List; -import java.util.Map; - /** - * Diese Klasse implementiert ein Plugin, welches Funktionen für DNPM UF Einzelempfehlung bereitstellt. + * Diese Klasse implementiert ein Plugin, welches Funktionen für DNPM UF Einzelempfehlung + * bereitstellt. * * @since 0.2.0 */ @Component public class EinzelempfehlungAnalyzer extends BackendService { - private final static Logger logger = LoggerFactory.getLogger(EinzelempfehlungAnalyzer.class); - - private final IOnkostarApi onkostarApi; - - private final MolekulargenetikFormService molekulargenetikFormService; + private static final Logger logger = LoggerFactory.getLogger(EinzelempfehlungAnalyzer.class); - private final StudienService studienService; + private final IOnkostarApi onkostarApi; - private final PersonPoolBasedPermissionEvaluator permissionEvaluator; + private final MolekulargenetikFormService molekulargenetikFormService; - public EinzelempfehlungAnalyzer( - final IOnkostarApi onkostarApi, - final StudienService studienService, - final MolekulargenetikFormService molekulargenetikFormService, - final PersonPoolBasedPermissionEvaluator permissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.studienService = studienService; - this.molekulargenetikFormService = molekulargenetikFormService; - this.permissionEvaluator = permissionEvaluator; - } + private final StudienService studienService; - @Override - public String getDescription() { - return "Stellt Funktionen zur Nutzung im Therapieplan-Unterformular für Einzelempfehlungen bereit"; - } + private final PersonPoolBasedPermissionEvaluator permissionEvaluator; - /** - * @deprecated - */ - @Override - public boolean isRelevantForDeletedProcedure() { - return false; - } + public EinzelempfehlungAnalyzer( + final IOnkostarApi onkostarApi, + final StudienService studienService, + final MolekulargenetikFormService molekulargenetikFormService, + final PersonPoolBasedPermissionEvaluator permissionEvaluator) { + this.onkostarApi = onkostarApi; + this.studienService = studienService; + this.molekulargenetikFormService = molekulargenetikFormService; + this.permissionEvaluator = permissionEvaluator; + } - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return false; - } + @Override + public String getDescription() { + return "Stellt Funktionen zur Nutzung im Therapieplan-Unterformular für Einzelempfehlungen bereit"; + } - @Override - public boolean isSynchronous() { - return false; - } + /** + * @deprecated + */ + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { + return false; + } - public List<Variant> getVariants(Map<String, Object> input) { - var procedureId = AnalyzerUtils.getRequiredId(input, "id"); + @Override + public boolean isSynchronous() { + return false; + } - if (procedureId.isEmpty()) { - return List.of(); - } + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - var procedure = onkostarApi.getProcedure(procedureId.get()); - if (null == procedure) { - return List.of(); - } + public List<Variant> getVariants(Map<String, Object> input) { + var procedureId = AnalyzerUtils.getRequiredId(input, "id"); - if (permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ)) { - return molekulargenetikFormService.getVariants(procedure); - } else { - logger.error("Security: No permission to access procedure '{}'", procedure.getId()); - return List.of(); - } + if (procedureId.isEmpty()) { + return List.of(); } - /** - * Übergibt alle Studien, deren (Kurz-)Beschreibung oder NCT-Nummer den übergebenen Eingabewert <code>q</code> enthält - * - * <p>Wurde der Eingabewert nicht angegeben oder ist leer, werden alle Studien übergeben. - * - * <p>Beispiel zur Nutzung in einem Formularscript - * <pre> - * executePluginMethod( - * 'TherapieplanAnalyzer', - * 'getStudien', - * { q: 'NCT-12', inactive: true }, - * (response) => console.log(response), - * false - * ); - * </pre> - * - * @param input Map mit Eingabewerten - * @return Liste mit Studien - */ - public List<Studie> getStudien(Map<String, Object> input) { - var query = AnalyzerUtils.getRequiredValue(input, "q", String.class); - var inactive = AnalyzerUtils.getRequiredValue(input, "inactive", Boolean.class).orElse(false); - - if (query.isEmpty() || query.get().isBlank()) { - if (inactive) { - return studienService.findAll(); - } - return studienService.findActive(); - } - if (inactive) { - return studienService.findByQuery(query.get()); - } - return studienService.findActiveByQuery(query.get()); + var procedure = onkostarApi.getProcedure(procedureId.get()); + if (null == procedure) { + return List.of(); } + if (permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ)) { + return molekulargenetikFormService.getVariants(procedure); + } else { + logger.error("Security: No permission to access procedure '{}'", procedure.getId()); + return List.of(); + } + } + + /** + * Übergibt alle Studien, deren (Kurz-)Beschreibung oder NCT-Nummer den übergebenen Eingabewert + * <code>q</code> enthält + * + * <p>Wurde der Eingabewert nicht angegeben oder ist leer, werden alle Studien übergeben. + * + * <p>Beispiel zur Nutzung in einem Formularscript + * + * <pre> + * executePluginMethod( + * 'TherapieplanAnalyzer', + * 'getStudien', + * { q: 'NCT-12', inactive: true }, + * (response) => console.log(response), + * false + * ); + * </pre> + * + * @param input Map mit Eingabewerten + * @return Liste mit Studien + */ + public List<Studie> getStudien(Map<String, Object> input) { + var query = AnalyzerUtils.getRequiredValue(input, "q", String.class); + var inactive = AnalyzerUtils.getRequiredValue(input, "inactive", Boolean.class).orElse(false); + + if (query.isEmpty() || query.get().isBlank()) { + if (inactive) { + return studienService.findAll(); + } + return studienService.findActive(); + } + if (inactive) { + return studienService.findByQuery(query.get()); + } + return studienService.findActiveByQuery(query.get()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzer.java b/src/main/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzer.java index 8b35f8c..2fa973f 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzer.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzer.java @@ -25,98 +25,97 @@ import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyseTriggerEvent; import de.itc.onkostar.api.analysis.AnalyzerRequirement; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import java.util.Set; - /** - * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines FollowUps durchführt. + * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines FollowUps + * durchführt. * * @since 0.0.2 */ @Component public class FollowUpAnalyzer extends Analyzer { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final IOnkostarApi onkostarApi; - - public FollowUpAnalyzer(IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } - - @Override - public String getDescription() { - return "Aktualisiert verknüpfte Formulare nach Änderungen im FollowUp-Formular"; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final IOnkostarApi onkostarApi; + + public FollowUpAnalyzer(IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } + + @Override + public String getDescription() { + return "Aktualisiert verknüpfte Formulare nach Änderungen im FollowUp-Formular"; + } + + /** + * @deprecated + */ + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } + + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { + return null != procedure && procedure.getFormName().equals("DNPM FollowUp"); + } + + @Override + public boolean isSynchronous() { + return false; + } + + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } + + @Override + public Set<AnalyseTriggerEvent> getTriggerEvents() { + return Set.of( + AnalyseTriggerEvent.EDIT_SAVE, AnalyseTriggerEvent.EDIT_LOCK, AnalyseTriggerEvent.REORG); + } + + @Override + public void analyze(Procedure procedure, Disease disease) { + backlinkToEinzelempfehlung(procedure); + } + + /** + * Verlinke aktuelles FollowUp in angegebener Einzelempfehlung + * + * @param procedure Das FollowUp + */ + private void backlinkToEinzelempfehlung(Procedure procedure) { + if (null == procedure.getValue("LinkTherapieempfehlung")) { + return; } - /** - * @deprecated - */ - @Override - public boolean isRelevantForDeletedProcedure() { - return false; + var referencedProcedureId = procedure.getValue("LinkTherapieempfehlung"); + if (null == referencedProcedureId || referencedProcedureId.getInt() == 0) { + // Alles gut, es ist keine Einzelempfehlung angegeben + return; } - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return null != procedure && procedure.getFormName().equals("DNPM FollowUp"); + var referencedProcedure = onkostarApi.getProcedure(referencedProcedureId.getInt()); + if (null == referencedProcedure) { + logger.error( + "Referenzierte Einzelempfehlung wurde nicht gefunden: {}", referencedProcedureId); + return; } - @Override - public boolean isSynchronous() { - return false; - } - - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } - - @Override - public Set<AnalyseTriggerEvent> getTriggerEvents() { - return Set.of( - AnalyseTriggerEvent.EDIT_SAVE, - AnalyseTriggerEvent.EDIT_LOCK, - AnalyseTriggerEvent.REORG - ); - } - - @Override - public void analyze(Procedure procedure, Disease disease) { - backlinkToEinzelempfehlung(procedure); - } + referencedProcedure.setValue( + "refdnpmfollowup", new Item("ref_dnpm_followup", procedure.getId())); - /** - * Verlinke aktuelles FollowUp in angegebener Einzelempfehlung - * - * @param procedure Das FollowUp - */ - private void backlinkToEinzelempfehlung(Procedure procedure) { - if (null == procedure.getValue("LinkTherapieempfehlung")) { - return; - } - - var referencedProcedureId = procedure.getValue("LinkTherapieempfehlung"); - if (null == referencedProcedureId || referencedProcedureId.getInt() == 0) { - // Alles gut, es ist keine Einzelempfehlung angegeben - return; - } - - var referencedProcedure = onkostarApi.getProcedure(referencedProcedureId.getInt()); - if (null == referencedProcedure) { - logger.error("Referenzierte Einzelempfehlung wurde nicht gefunden: {}", referencedProcedureId); - return; - } - - referencedProcedure.setValue("refdnpmfollowup", new Item("ref_dnpm_followup", procedure.getId())); - - try { - onkostarApi.saveProcedure(referencedProcedure); - } catch (Exception e) { - logger.error("FollowUp konnte nicht mit Einzelempfehlung verknüpft werden", e); - } + try { + onkostarApi.saveProcedure(referencedProcedure); + } catch (Exception e) { + logger.error("FollowUp konnte nicht mit Einzelempfehlung verknüpft werden", e); } + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/IPluginPart.java b/src/main/java/dev/dnpm/oshelper/analyzer/IPluginPart.java index 2745d46..9e5b5fa 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/IPluginPart.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/IPluginPart.java @@ -23,16 +23,15 @@ import de.itc.onkostar.api.analysis.IProcedureAnalyzer; public interface IPluginPart extends IProcedureAnalyzer { - default String getVersion() { - return "2.0.0"; // x-release-please - } + default String getVersion() { + return "2.2.0"; // x-release-please + } - default String getName() { - return "DNPM Plugin"; - } - - default String getDescription() { - return String.format("Plugin-Bestandteil '%s'", this.getClass().getSimpleName()); - } + default String getName() { + return "DNPM Plugin"; + } + default String getDescription() { + return String.format("Plugin-Bestandteil '%s'", this.getClass().getSimpleName()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/Merkmalskatalog.java b/src/main/java/dev/dnpm/oshelper/analyzer/Merkmalskatalog.java index 18adb15..e8ed459 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/Merkmalskatalog.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/Merkmalskatalog.java @@ -23,6 +23,8 @@ import de.itc.onkostar.api.Disease; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyzerRequirement; +import java.util.List; +import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -30,87 +32,87 @@ import org.hibernate.type.StandardBasicTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Map; - public class Merkmalskatalog extends BackendService { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - public Merkmalskatalog(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } + public Merkmalskatalog(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } - @Override - public String getDescription() { - return "Methoden für Merkmalskataloge"; - } + @Override + public String getDescription() { + return "Methoden für Merkmalskataloge"; + } - @Override - public boolean isRelevantForDeletedProcedure() { - return false; - } + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } - @Override - public boolean isSynchronous() { - return true; - } + @Override + public boolean isSynchronous() { + return true; + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } - - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease currentDisease) { - return false; - } - - public List<String[]> getMerkmalskatalog(final Map<String, Object> input) { - var merkmalskatalog = AnalyzerUtils.getRequiredValue(input, "Merkmalskatalog", String.class); - var spalten = AnalyzerUtils.getRequiredValue(input, "Spalten", String.class); + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - if (merkmalskatalog.isEmpty()) { - logger.error("Kein Merkmalskatalog angegeben!"); - return null; - } + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease currentDisease) { + return false; + } - if (spalten.isEmpty()) { - logger.error("Keine Spalten angegeben!"); - return null; - } + public List<String[]> getMerkmalskatalog(final Map<String, Object> input) { + var merkmalskatalog = AnalyzerUtils.getRequiredValue(input, "Merkmalskatalog", String.class); + var spalten = AnalyzerUtils.getRequiredValue(input, "Spalten", String.class); - String[] spaltenArray = spalten.get().split("\\s*,\\s*"); - - try { - SQLQuery query = getSqlQuery(merkmalskatalog.get()); - - for (String s : spaltenArray) { - query.addScalar(s, StandardBasicTypes.STRING); - } + if (merkmalskatalog.isEmpty()) { + logger.error("Kein Merkmalskatalog angegeben!"); + return null; + } - @SuppressWarnings("unchecked") - List<String[]> rows = query.list(); - return rows; - } catch (Exception e) { - logger.error("Fehler bei der Ausführung von getMerkmalskatalog()", e); - return null; - } + if (spalten.isEmpty()) { + logger.error("Keine Spalten angegeben!"); + return null; } - private SQLQuery getSqlQuery(String merkmalskatalog) { - SessionFactory sessionFactory = onkostarApi.getSessionFactory(); - Session session = sessionFactory.getCurrentSession(); + String[] spaltenArray = spalten.get().split("\\s*,\\s*"); + + try { + SQLQuery query = getSqlQuery(merkmalskatalog.get()); - String sql = "SELECT p.id, p.code, p.shortdesc, p.description, p.note, p.synonyms " - + "FROM property_catalogue " - + "LEFT JOIN property_catalogue_version ON property_catalogue_version.datacatalog_id = property_catalogue.id " - + "LEFT JOIN property_catalogue_version_entry p ON p.property_version_id = property_catalogue_version.id " - + "WHERE name = '" + merkmalskatalog + "' AND aktiv = 1 " - + "ORDER BY position ASC"; + for (String s : spaltenArray) { + query.addScalar(s, StandardBasicTypes.STRING); + } - return session.createSQLQuery(sql); + @SuppressWarnings("unchecked") + List<String[]> rows = query.list(); + return rows; + } catch (Exception e) { + logger.error("Fehler bei der Ausführung von getMerkmalskatalog()", e); + return null; } + } + + private SQLQuery getSqlQuery(String merkmalskatalog) { + SessionFactory sessionFactory = onkostarApi.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + + String sql = + "SELECT p.id, p.code, p.shortdesc, p.description, p.note, p.synonyms " + + "FROM property_catalogue " + + "LEFT JOIN property_catalogue_version ON property_catalogue_version.datacatalog_id = property_catalogue.id " + + "LEFT JOIN property_catalogue_version_entry p ON p.property_version_id = property_catalogue_version.id " + + "WHERE name = '" + + merkmalskatalog + + "' AND aktiv = 1 " + + "ORDER BY position ASC"; + + return session.createSQLQuery(sql); + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzer.java b/src/main/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzer.java index ec9f824..39a31da 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzer.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzer.java @@ -19,169 +19,174 @@ package dev.dnpm.oshelper.analyzer; -import dev.dnpm.oshelper.dto.EcogStatusWithDate; -import dev.dnpm.oshelper.services.strahlentherapie.StrahlentherapieService; -import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; import de.itc.onkostar.api.Disease; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyseTriggerEvent; import de.itc.onkostar.api.analysis.AnalyzerRequirement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - +import dev.dnpm.oshelper.dto.EcogStatusWithDate; +import dev.dnpm.oshelper.services.strahlentherapie.StrahlentherapieService; +import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; /** - * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines Formulars zur Systemtherapie durchführt. + * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines Formulars zur + * Systemtherapie durchführt. * * @since 0.6.0 */ @Component public class TherapieMitEcogAnalyzer extends Analyzer { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final IOnkostarApi onkostarApi; - - private final StrahlentherapieService strahlentherapieService; - private final SystemtherapieService systemtherapieService; - - public TherapieMitEcogAnalyzer( - final IOnkostarApi onkostarApi, - final StrahlentherapieService strahlentherapieService, - final SystemtherapieService systemtherapieService - ) { - this.onkostarApi = onkostarApi; - this.strahlentherapieService = strahlentherapieService; - this.systemtherapieService = systemtherapieService; - } - - @Override - public String getDescription() { - return "Aktualisiert verknüpfte Formulare nach Änderungen in Formularen vom Typ Strahlen-/Systemtherapie mit ECOG-Status"; - } - - /** - * @deprecated - */ - @Override - public boolean isRelevantForDeletedProcedure() { - return true; - } - - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return null != procedure && null != disease && ( - procedure.getFormName().equals("OS.Strahlentherapie") - || procedure.getFormName().equals("OS.Strahlentherapie.VarianteUKW") - || procedure.getFormName().equals("OS.Systemische Therapie") - || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW") - ); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final IOnkostarApi onkostarApi; + + private final StrahlentherapieService strahlentherapieService; + private final SystemtherapieService systemtherapieService; + + public TherapieMitEcogAnalyzer( + final IOnkostarApi onkostarApi, + final StrahlentherapieService strahlentherapieService, + final SystemtherapieService systemtherapieService) { + this.onkostarApi = onkostarApi; + this.strahlentherapieService = strahlentherapieService; + this.systemtherapieService = systemtherapieService; + } + + @Override + public String getDescription() { + return "Aktualisiert verknüpfte Formulare nach Änderungen in Formularen vom Typ Strahlen-/Systemtherapie mit ECOG-Status"; + } + + /** + * @deprecated + */ + @Override + public boolean isRelevantForDeletedProcedure() { + return true; + } + + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { + return null != procedure + && null != disease + && (procedure.getFormName().equals("OS.Strahlentherapie") + || procedure.getFormName().equals("OS.Strahlentherapie.VarianteUKW") + || procedure.getFormName().equals("OS.Systemische Therapie") + || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW")); + } + + @Override + public boolean isSynchronous() { + return false; + } + + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } + + @Override + public Set<AnalyseTriggerEvent> getTriggerEvents() { + return Set.of( + AnalyseTriggerEvent.EDIT_SAVE, AnalyseTriggerEvent.EDIT_LOCK, AnalyseTriggerEvent.REORG); + } + + @Override + public void analyze(Procedure procedure, Disease disease) { + var date = procedure.getStartDate(); + var status = procedure.getValue("ECOGvorTherapie"); + + if (null == date || null == status) { + // Ignore + return; } - @Override - public boolean isSynchronous() { - return false; + var ecog = + strahlentherapieService.ecogStatus(procedure.getPatient()).stream() + .filter( + ecogStatusWithDate -> + ecogStatusWithDate.getDate().after(disease.getDiagnosisDate())) + .collect(Collectors.toList()); + + ecog.addAll( + systemtherapieService.ecogStatus(procedure.getPatient()).stream() + .filter( + ecogStatusWithDate -> + ecogStatusWithDate.getDate().after(disease.getDiagnosisDate())) + .collect(Collectors.toList())); + + if (ecog.isEmpty()) { + // Nothing to do + return; } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; + procedure.getPatient().getDiseases().stream() + .flatMap( + d -> + onkostarApi + .getProceduresForDiseaseByForm(d.getId(), "DNPM Klinik/Anamnese") + .stream()) + .forEach( + p -> { + var ufEcog = p.getValue("ECOGVerlauf"); + if (null != ufEcog && ufEcog.getValue() instanceof List) { + updateExistingEcogVerlauf(p, ecog, ufEcog); + } else { + newEcogverlauf(p, ecog); + } + }); + } + + private void updateExistingEcogVerlauf( + Procedure p, List<EcogStatusWithDate> ecogFromCompleted, Item ufEcog) { + var shouldSave = false; + var existingDates = + ufEcog.<List<Map<String, String>>>getValue().stream() + .map(v -> v.get("Datum")) + .collect(Collectors.toList()); + for (var ecog : ecogFromCompleted) { + var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); + if (!existingDates.contains(formattedDate)) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); + shouldSave = true; + } } - - @Override - public Set<AnalyseTriggerEvent> getTriggerEvents() { - return Set.of( - AnalyseTriggerEvent.EDIT_SAVE, - AnalyseTriggerEvent.EDIT_LOCK, - AnalyseTriggerEvent.REORG - ); + if (shouldSave) { + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Cannot update ECOG for procedure '{}'", p.getId()); + } } - - @Override - public void analyze(Procedure procedure, Disease disease) { - var date = procedure.getStartDate(); - var status = procedure.getValue("ECOGvorTherapie"); - - if (null == date || null == status) { - // Ignore - return; - } - - var ecog = strahlentherapieService.ecogStatus(procedure.getPatient()) - .stream() - .filter(ecogStatusWithDate -> ecogStatusWithDate.getDate().after(disease.getDiagnosisDate())) - .collect(Collectors.toList()); - - ecog.addAll(systemtherapieService.ecogStatus(procedure.getPatient()) - .stream() - .filter(ecogStatusWithDate -> ecogStatusWithDate.getDate().after(disease.getDiagnosisDate())) - .collect(Collectors.toList())); - - - if (ecog.isEmpty()) { - // Nothing to do - return; - } - - procedure.getPatient().getDiseases().stream() - .flatMap(d -> onkostarApi.getProceduresForDiseaseByForm(d.getId(), "DNPM Klinik/Anamnese").stream()) - .forEach(p -> { - var ufEcog = p.getValue("ECOGVerlauf"); - if (null != ufEcog && ufEcog.getValue() instanceof List) { - updateExistingEcogVerlauf(p, ecog, ufEcog); - } else { - newEcogverlauf(p, ecog); - } - }); + } + + private void newEcogverlauf(Procedure p, List<EcogStatusWithDate> ecogFromCompleted) { + p.setValue("ECOGVerlauf", new Item("ECOGVerlauf", List.of())); + for (var ecog : ecogFromCompleted) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); } - - private void updateExistingEcogVerlauf(Procedure p, List<EcogStatusWithDate> ecogFromCompleted, Item ufEcog) { - var shouldSave = false; - var existingDates = ufEcog.<List<Map<String, String>>>getValue().stream() - .map(v -> v.get("Datum")) - .collect(Collectors.toList()); - for (var ecog : ecogFromCompleted) { - var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); - if (!existingDates.contains(formattedDate)) { - var newSubProcedure = new Procedure(onkostarApi); - newSubProcedure.setStartDate(ecog.getDate()); - newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); - newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); - p.addSubProcedure("ECOGVerlauf", newSubProcedure); - shouldSave = true; - } - } - if (shouldSave) { - try { - onkostarApi.saveProcedure(p, true); - } catch (Exception e) { - logger.error("Cannot update ECOG for procedure '{}'", p.getId()); - } - } + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Create update ECOG for procedure '{}'", p.getId()); } - - private void newEcogverlauf(Procedure p, List<EcogStatusWithDate> ecogFromCompleted) { - p.setValue("ECOGVerlauf", new Item("ECOGVerlauf", List.of())); - for (var ecog : ecogFromCompleted) { - var newSubProcedure = new Procedure(onkostarApi); - newSubProcedure.setStartDate(ecog.getDate()); - newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); - newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); - p.addSubProcedure("ECOGVerlauf", newSubProcedure); - } - try { - onkostarApi.saveProcedure(p, true); - } catch (Exception e) { - logger.error("Create update ECOG for procedure '{}'", p.getId()); - } - } - + } } diff --git a/src/main/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzer.java b/src/main/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzer.java index 85baf5f..f5ff959 100644 --- a/src/main/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzer.java +++ b/src/main/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzer.java @@ -24,66 +24,60 @@ import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyseTriggerEvent; import de.itc.onkostar.api.analysis.AnalyzerRequirement; import dev.dnpm.oshelper.services.therapieplan.TherapieplanServiceFactory; -import org.springframework.stereotype.Component; - import java.util.Set; +import org.springframework.stereotype.Component; /** - * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines Therapieplans durchführt. + * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines Therapieplans + * durchführt. * * @since 0.0.2 */ @Component public class TherapieplanAnalyzer extends Analyzer { - private final TherapieplanServiceFactory therapieplanServiceFactory; - - public TherapieplanAnalyzer( - final TherapieplanServiceFactory therapieplanServiceFactory - ) { - this.therapieplanServiceFactory = therapieplanServiceFactory; - } + private final TherapieplanServiceFactory therapieplanServiceFactory; - @Override - public String getDescription() { - return "Aktualisiert Unterformulare nach Änderungen im Therapieplan-Formular"; - } + public TherapieplanAnalyzer(final TherapieplanServiceFactory therapieplanServiceFactory) { + this.therapieplanServiceFactory = therapieplanServiceFactory; + } - /** - * @deprecated - */ - @Override - public boolean isRelevantForDeletedProcedure() { - return false; - } + @Override + public String getDescription() { + return "Aktualisiert Unterformulare nach Änderungen im Therapieplan-Formular"; + } - @Override - public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return null != procedure && procedure.getFormName().equals("DNPM Therapieplan"); - } + /** + * @deprecated + */ + @Override + public boolean isRelevantForDeletedProcedure() { + return false; + } - @Override - public boolean isSynchronous() { - return false; - } + @Override + public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { + return null != procedure && procedure.getFormName().equals("DNPM Therapieplan"); + } - @Override - public AnalyzerRequirement getRequirement() { - return AnalyzerRequirement.PROCEDURE; - } + @Override + public boolean isSynchronous() { + return false; + } - @Override - public Set<AnalyseTriggerEvent> getTriggerEvents() { - return Set.of( - AnalyseTriggerEvent.EDIT_SAVE, - AnalyseTriggerEvent.EDIT_LOCK, - AnalyseTriggerEvent.REORG - ); - } + @Override + public AnalyzerRequirement getRequirement() { + return AnalyzerRequirement.PROCEDURE; + } - @Override - public void analyze(Procedure procedure, Disease disease) { - therapieplanServiceFactory.currentUsableInstance().updateRequiredMtbEntries(procedure); - } + @Override + public Set<AnalyseTriggerEvent> getTriggerEvents() { + return Set.of( + AnalyseTriggerEvent.EDIT_SAVE, AnalyseTriggerEvent.EDIT_LOCK, AnalyseTriggerEvent.REORG); + } + @Override + public void analyze(Procedure procedure, Disease disease) { + therapieplanServiceFactory.currentUsableInstance().updateRequiredMtbEntries(procedure); + } } diff --git a/src/main/java/dev/dnpm/oshelper/atc/AgentCode.java b/src/main/java/dev/dnpm/oshelper/atc/AgentCode.java index 4f969bc..1606d66 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/AgentCode.java +++ b/src/main/java/dev/dnpm/oshelper/atc/AgentCode.java @@ -26,11 +26,11 @@ package dev.dnpm.oshelper.atc; * @since 2.0.0 */ public interface AgentCode extends Comparable<AgentCode> { - String getCode(); + String getCode(); - String getName(); + String getName(); - CodeSystem getSystem(); + CodeSystem getSystem(); - String getVersion(); + String getVersion(); } diff --git a/src/main/java/dev/dnpm/oshelper/atc/AtcCode.java b/src/main/java/dev/dnpm/oshelper/atc/AtcCode.java index 61685d6..beff5bf 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/AtcCode.java +++ b/src/main/java/dev/dnpm/oshelper/atc/AtcCode.java @@ -29,75 +29,76 @@ import java.util.Objects; */ public class AtcCode implements AgentCode { - private final String code; - private final String name; - private final String synonyms; - - private final String version; - - public AtcCode(String code, String name) { - this(code, name, null); - } - - public AtcCode(String code, String name, String version) { - this(code, name, version, ""); - } - - public AtcCode(String code, String name, String version, String synonyms) { - this.code = code; - this.name = name; - this.synonyms = synonyms; - this.version = version; - } - - public String getCode() { - return code; - } - - public String getName() { - return name; - } - - public String getSynonyms() { - return this.synonyms; - } - - public CodeSystem getSystem() { - return CodeSystem.ATC; - } - - public String getVersion() { - return version; - } - - @Override - public int compareTo(final AgentCode agentCode) { - return this.name.toLowerCase().compareTo(agentCode.getName().toLowerCase()); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AgentCode otherAgentCode = (AgentCode) o; - return Objects.equals(code.toLowerCase(), otherAgentCode.getCode().toLowerCase()) - && Objects.equals(name.toLowerCase(), otherAgentCode.getName().toLowerCase()) - && Objects.equals(version, otherAgentCode.getVersion()); - } - - @Override - public int hashCode() { - return Objects.hash(code.toLowerCase(), name.toLowerCase()); - } - - /** - * Checks for usable ATC code starting at level 2 - * @param code Code to be checked - * @return Will return <code>true</code> if code matches ATC code scheme - */ - public static boolean isAtcCode(String code) { - return null != code - && ! code.isBlank() - && code.matches("[ABCDGHJLMNPRSV][0-2][1-9]([A-Z]([A-Z](\\d{2})?)?)?"); - } + private final String code; + private final String name; + private final String synonyms; + + private final String version; + + public AtcCode(String code, String name) { + this(code, name, null); + } + + public AtcCode(String code, String name, String version) { + this(code, name, version, ""); + } + + public AtcCode(String code, String name, String version, String synonyms) { + this.code = code; + this.name = name; + this.synonyms = synonyms; + this.version = version; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public String getSynonyms() { + return this.synonyms; + } + + public CodeSystem getSystem() { + return CodeSystem.ATC; + } + + public String getVersion() { + return version; + } + + @Override + public int compareTo(final AgentCode agentCode) { + return this.name.toLowerCase().compareTo(agentCode.getName().toLowerCase()); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AgentCode otherAgentCode = (AgentCode) o; + return Objects.equals(code.toLowerCase(), otherAgentCode.getCode().toLowerCase()) + && Objects.equals(name.toLowerCase(), otherAgentCode.getName().toLowerCase()) + && Objects.equals(version, otherAgentCode.getVersion()); + } + + @Override + public int hashCode() { + return Objects.hash(code.toLowerCase(), name.toLowerCase()); + } + + /** + * Checks for usable ATC code starting at level 2 + * + * @param code Code to be checked + * @return Will return <code>true</code> if code matches ATC code scheme + */ + public static boolean isAtcCode(String code) { + return null != code + && !code.isBlank() + && code.matches("[ABCDGHJLMNPRSV][0-2][1-9]([A-Z]([A-Z](\\d{2})?)?)?"); + } } diff --git a/src/main/java/dev/dnpm/oshelper/atc/CodeSystem.java b/src/main/java/dev/dnpm/oshelper/atc/CodeSystem.java index 2fc974c..f292371 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/CodeSystem.java +++ b/src/main/java/dev/dnpm/oshelper/atc/CodeSystem.java @@ -26,6 +26,6 @@ package dev.dnpm.oshelper.atc; * @since 2.0.0 */ public enum CodeSystem { - ATC, - UNREGISTERED -}
\ No newline at end of file + ATC, + UNREGISTERED +} diff --git a/src/main/java/dev/dnpm/oshelper/atc/UnregisteredCode.java b/src/main/java/dev/dnpm/oshelper/atc/UnregisteredCode.java index 8c7df54..9300b01 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/UnregisteredCode.java +++ b/src/main/java/dev/dnpm/oshelper/atc/UnregisteredCode.java @@ -29,58 +29,58 @@ import java.util.Objects; */ public class UnregisteredCode implements AgentCode { - private final String code; - private final String name; + private final String code; + private final String name; - private final String synonyms; + private final String synonyms; - public UnregisteredCode(String code, String name) { - this(code, name, ""); - } + public UnregisteredCode(String code, String name) { + this(code, name, ""); + } - public UnregisteredCode(String code, String name, String synonyms) { - this.code = code; - this.name = name; - this.synonyms = synonyms; - } + public UnregisteredCode(String code, String name, String synonyms) { + this.code = code; + this.name = name; + this.synonyms = synonyms; + } - public String getCode() { - return code; - } + public String getCode() { + return code; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public String getSynonyms() { - return synonyms; - } + public String getSynonyms() { + return synonyms; + } - public CodeSystem getSystem() { - return CodeSystem.UNREGISTERED; - } + public CodeSystem getSystem() { + return CodeSystem.UNREGISTERED; + } - public String getVersion() { - return null; - } + public String getVersion() { + return null; + } - @Override - public int compareTo(final AgentCode agentCode) { - return this.name.toLowerCase().compareTo(agentCode.getName().toLowerCase()); - } + @Override + public int compareTo(final AgentCode agentCode) { + return this.name.toLowerCase().compareTo(agentCode.getName().toLowerCase()); + } - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AgentCode otherAgentCode = (AgentCode) o; - return Objects.equals(code.toLowerCase(), otherAgentCode.getCode().toLowerCase()) - && Objects.equals(name.toLowerCase(), otherAgentCode.getName().toLowerCase()) - && Objects.equals(this.getVersion(), otherAgentCode.getVersion()); - } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AgentCode otherAgentCode = (AgentCode) o; + return Objects.equals(code.toLowerCase(), otherAgentCode.getCode().toLowerCase()) + && Objects.equals(name.toLowerCase(), otherAgentCode.getName().toLowerCase()) + && Objects.equals(this.getVersion(), otherAgentCode.getVersion()); + } - @Override - public int hashCode() { - return Objects.hash(code.toLowerCase(), name.toLowerCase()); - } + @Override + public int hashCode() { + return Objects.hash(code.toLowerCase(), name.toLowerCase()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java index b074364..f1dc2e2 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java +++ b/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java @@ -19,17 +19,15 @@ package dev.dnpm.oshelper.atc.services; +import static java.util.stream.Collectors.groupingBy; import dev.dnpm.oshelper.atc.AgentCode; -import org.jspecify.annotations.NullMarked; - import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; - -import static java.util.stream.Collectors.groupingBy; +import org.jspecify.annotations.NullMarked; /** * Common interface for agent code services @@ -39,69 +37,67 @@ import static java.util.stream.Collectors.groupingBy; */ public interface AgentCodeService { - /** - * Filters the provided list of AgentCodes to include only the latest available versions - * for each unique code name and, if required, code. - * If the input list is empty or null, an empty list will be returned. - * - * @param agentCodes A list of {@link AgentCode} objects to be filtered. Each object in the list - * should contain information about the agent's code, name, system, and version. - * @param classifier A function that returns a string value to be used as a key for grouping agent codes. - * @return A list of {@link AgentCode} objects representing the latest available versions of unique agent codes. - * If no valid inputs are provided, an empty list is returned. - */ - @NullMarked - static List<AgentCode> latestAgentCodeVersions(List<AgentCode> agentCodes, Function<AgentCode, String> classifier) { - return latestAvailable(agentCodes, classifier); - } - - /** - * Function that extracts the name of an {@link AgentCode} object. - * This function is used as a classifier for grouping agent codes by their name. - */ - Function<AgentCode, String> byCodeOnly = AgentCode::getName; + /** + * Filters the provided list of AgentCodes to include only the latest available versions for each + * unique code name and, if required, code. If the input list is empty or null, an empty list will + * be returned. + * + * @param agentCodes A list of {@link AgentCode} objects to be filtered. Each object in the list + * should contain information about the agent's code, name, system, and version. + * @param classifier A function that returns a string value to be used as a key for grouping agent + * codes. + * @return A list of {@link AgentCode} objects representing the latest available versions of + * unique agent codes. If no valid inputs are provided, an empty list is returned. + */ + @NullMarked + static List<AgentCode> latestAgentCodeVersions( + List<AgentCode> agentCodes, Function<AgentCode, String> classifier) { + return latestAvailable(agentCodes, classifier); + } - /** - * Function that extracts the name and code of an {@link AgentCode} object. - * This function is used as a classifier for grouping agent codes by their name and code. - */ - Function<AgentCode, String> byNameAndCode = (agentCode -> - String.format("%s_%s", agentCode.getCode(), agentCode.getName()) - ); + /** + * Function that extracts the name of an {@link AgentCode} object. This function is used as a + * classifier for grouping agent codes by their name. + */ + Function<AgentCode, String> byCodeOnly = AgentCode::getName; + /** + * Function that extracts the name and code of an {@link AgentCode} object. This function is used + * as a classifier for grouping agent codes by their name and code. + */ + Function<AgentCode, String> byNameAndCode = + (agentCode -> String.format("%s_%s", agentCode.getCode(), agentCode.getName())); - @NullMarked - private static List<AgentCode> latestAvailable( - List<AgentCode> agentCodes, - Function<AgentCode, String> classifier - ) { - return agentCodes.stream() - .collect(groupingBy(classifier)).values().stream() - .map(list -> - list.stream() - .sorted(Comparator.comparing(AgentCode::getCode)) - .max((ac1, ac2) -> { - if (null == ac1.getVersion()) { - return -1; - } else if (null == ac2.getVersion()) { - return 1; - } - return ac1.getVersion().compareTo(ac2.getVersion()); - }) - .orElse(null) - ) - .filter(Objects::nonNull) - .distinct() - .collect(Collectors.toList()); - } + @NullMarked + private static List<AgentCode> latestAvailable( + List<AgentCode> agentCodes, Function<AgentCode, String> classifier) { + return agentCodes.stream().collect(groupingBy(classifier)).values().stream() + .map( + list -> + list.stream() + .sorted(Comparator.comparing(AgentCode::getCode)) + .max( + (ac1, ac2) -> { + if (null == ac1.getVersion()) { + return -1; + } else if (null == ac2.getVersion()) { + return 1; + } + return ac1.getVersion().compareTo(ac2.getVersion()); + }) + .orElse(null)) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } - /** - * Queries source for agents with name and code starting with query string. - * If size is zero, all available results will be returned. - * - * @param query The query string - * @param size Maximal amount of responses - * @return A list with agent codes - */ - List<AgentCode> findAgentCodes(String query, int size); + /** + * Queries source for agents with name and code starting with query string. If size is zero, all + * available results will be returned. + * + * @param query The query string + * @param size Maximal amount of responses + * @return A list with agent codes + */ + List<AgentCode> findAgentCodes(String query, int size); } diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java index cf80738..abb006b 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java +++ b/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java @@ -22,17 +22,15 @@ package dev.dnpm.oshelper.atc.services; import dev.dnpm.oshelper.atc.AgentCode; import dev.dnpm.oshelper.atc.AtcCode; import dev.dnpm.oshelper.exceptions.FileParsingException; -import org.apache.commons.csv.CSVFormat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.csv.CSVFormat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Service to query for agent codes based on ATC codes file @@ -42,65 +40,72 @@ import java.util.stream.Collectors; */ public class CsvAgentCodeService implements AgentCodeService { - protected final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected final List<AgentCode> codeList = new ArrayList<>(); + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected final List<AgentCode> codeList = new ArrayList<>(); - private static final String ATC_CODE_COLUMN = "ATC-Code"; - private static final String ATC_NAME_COLUMN = "ATC-Bedeutung"; - private static final String ATC_VERSION_COLUMN = "Version"; + private static final String ATC_CODE_COLUMN = "ATC-Code"; + private static final String ATC_NAME_COLUMN = "ATC-Bedeutung"; + private static final String ATC_VERSION_COLUMN = "Version"; - public CsvAgentCodeService() { - this.codeList.addAll(parseFile()); - } + public CsvAgentCodeService() { + this.codeList.addAll(parseFile()); + } - /** - * Queries source for agents code starting with or name containing query string. - * If size is zero, all available results will be returned. - * - * @param query The query string - * @param size Maximal amount of responses - * @return A list with agent codes - */ - @Override - public List<AgentCode> findAgentCodes(final String query, final int size) { - var resultStream = this.codeList.stream().filter(agentCode -> - agentCode.getCode().toLowerCase().startsWith(query.toLowerCase()) - || agentCode.getName().toLowerCase().contains(query.toLowerCase()) - ); + /** + * Queries source for agents code starting with or name containing query string. If size is zero, + * all available results will be returned. + * + * @param query The query string + * @param size Maximal amount of responses + * @return A list with agent codes + */ + @Override + public List<AgentCode> findAgentCodes(final String query, final int size) { + var resultStream = + this.codeList.stream() + .filter( + agentCode -> + agentCode.getCode().toLowerCase().startsWith(query.toLowerCase()) + || agentCode.getName().toLowerCase().contains(query.toLowerCase())); - if (size > 0) { - return resultStream.limit(size).collect(Collectors.toList()); - } - return resultStream.collect(Collectors.toList()); + if (size > 0) { + return resultStream.limit(size).collect(Collectors.toList()); } + return resultStream.collect(Collectors.toList()); + } - protected List<AgentCode> parseFile() { - var result = new ArrayList<AgentCode>(); + protected List<AgentCode> parseFile() { + var result = new ArrayList<AgentCode>(); - try { - var inputStream = Objects.requireNonNull(this.getClass().getClassLoader().getResourceAsStream("atc.csv")); - var parser = CSVFormat.RFC4180 - .withHeader() - .withDelimiter('\t') - .withIgnoreEmptyLines() - .withSkipHeaderRecord() - .parse(new InputStreamReader(inputStream)); - for (var row : parser) { - if (!row.isMapped(ATC_CODE_COLUMN) || !row.isMapped(ATC_NAME_COLUMN)) { - throw new FileParsingException("No CSV column for ATC code or name found"); - } - if (row.isMapped(ATC_VERSION_COLUMN)) { - result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN), row.get(ATC_VERSION_COLUMN))); - } else { - result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN))); - } - } - return result; - } catch (IOException | FileParsingException e) { - logger.warn("Error reading information from ATC codes"); + try { + var inputStream = + Objects.requireNonNull(this.getClass().getClassLoader().getResourceAsStream("atc.csv")); + var parser = + CSVFormat.RFC4180 + .withHeader() + .withDelimiter('\t') + .withIgnoreEmptyLines() + .withSkipHeaderRecord() + .parse(new InputStreamReader(inputStream)); + for (var row : parser) { + if (!row.isMapped(ATC_CODE_COLUMN) || !row.isMapped(ATC_NAME_COLUMN)) { + throw new FileParsingException("No CSV column for ATC code or name found"); } - logger.info("Found {} ATC codes", result.size()); - return result; + if (row.isMapped(ATC_VERSION_COLUMN)) { + result.add( + new AtcCode( + row.get(ATC_CODE_COLUMN).trim(), + row.get(ATC_NAME_COLUMN), + row.get(ATC_VERSION_COLUMN))); + } else { + result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN))); + } + } + return result; + } catch (IOException | FileParsingException e) { + logger.warn("Error reading information from ATC codes"); } - + logger.info("Found {} ATC codes", result.size()); + return result; + } } diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java index 306563d..0dfb1e6 100644 --- a/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java +++ b/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java @@ -22,10 +22,9 @@ package dev.dnpm.oshelper.atc.services; import dev.dnpm.oshelper.atc.AgentCode; import dev.dnpm.oshelper.atc.AtcCode; import dev.dnpm.oshelper.atc.UnregisteredCode; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; import java.util.List; +import javax.sql.DataSource; +import org.springframework.jdbc.core.JdbcTemplate; /** * Implementation of {@link AgentCodeService} that uses database to query for unregistered agents @@ -35,45 +34,45 @@ import java.util.List; */ public class OnkostarAgentCodeService implements AgentCodeService { - private final JdbcTemplate jdbcTemplate; - - public OnkostarAgentCodeService(final DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); - } + private final JdbcTemplate jdbcTemplate; - /** - * Queries source for agents code starting with or name containing query string. - * If size is zero, all available results will be returned. - * - * @param query The query string - * @param size Maximal amount of responses - * @return A list with agent codes - */ - @Override - public List<AgentCode> findAgentCodes(final String query, final int size) { - var sql = "SELECT code, shortdesc, synonyms\n" + - " FROM property_catalogue\n" + - " JOIN property_catalogue_version ON (property_catalogue_version.datacatalog_id = property_catalogue.id)\n" + - " JOIN property_catalogue_version_entry p ON (p.property_version_id = property_catalogue_version.id)\n" + - " WHERE name = 'OS.Substanzen'\n" + - " AND (LOWER(code) LIKE ? OR LOWER(shortdesc) LIKE ? OR LOWER(synonyms) LIKE ?)"; + public OnkostarAgentCodeService(final DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } - if (size > 0) { - sql = sql + " LIMIT " + size; - } + /** + * Queries source for agents code starting with or name containing query string. If size is zero, + * all available results will be returned. + * + * @param query The query string + * @param size Maximal amount of responses + * @return A list with agent codes + */ + @Override + public List<AgentCode> findAgentCodes(final String query, final int size) { + var sql = + "SELECT code, shortdesc, synonyms\n" + + " FROM property_catalogue\n" + + " JOIN property_catalogue_version ON (property_catalogue_version.datacatalog_id = property_catalogue.id)\n" + + " JOIN property_catalogue_version_entry p ON (p.property_version_id = property_catalogue_version.id)\n" + + " WHERE name = 'OS.Substanzen'\n" + + " AND (LOWER(code) LIKE ? OR LOWER(shortdesc) LIKE ? OR LOWER(synonyms) LIKE ?)"; - return jdbcTemplate.query( - sql, - new Object[]{query + "%", "%" + query + "%", "%" + query + "%"}, - (resultSet, i) -> { - var code = resultSet.getString("code"); - var shortdesc = resultSet.getString("shortdesc"); - var synonyms = resultSet.getString("synonyms"); - if (AtcCode.isAtcCode(code)) { - return new AtcCode(code, shortdesc); - } - return new UnregisteredCode(code, shortdesc, synonyms); - } - ); + if (size > 0) { + sql = sql + " LIMIT " + size; } + + return jdbcTemplate.query( + sql, + new Object[] {query + "%", "%" + query + "%", "%" + query + "%"}, + (resultSet, i) -> { + var code = resultSet.getString("code"); + var shortdesc = resultSet.getString("shortdesc"); + var synonyms = resultSet.getString("synonyms"); + if (AtcCode.isAtcCode(code)) { + return new AtcCode(code, shortdesc); + } + return new UnregisteredCode(code, shortdesc, synonyms); + }); + } } diff --git a/src/main/java/dev/dnpm/oshelper/config/PluginConfiguration.java b/src/main/java/dev/dnpm/oshelper/config/PluginConfiguration.java index bb6619f..3e2ea44 100644 --- a/src/main/java/dev/dnpm/oshelper/config/PluginConfiguration.java +++ b/src/main/java/dev/dnpm/oshelper/config/PluginConfiguration.java @@ -33,13 +33,12 @@ import dev.dnpm.oshelper.services.strahlentherapie.StrahlentherapieService; import dev.dnpm.oshelper.services.systemtherapie.DefaultSystemtherapieService; import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; import dev.dnpm.oshelper.services.therapieplan.TherapieplanServiceFactory; +import javax.sql.DataSource; 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; - /** * Dynamische Konfiguration des Plugins basierend auf Onkostar-Einstellungen * @@ -50,64 +49,58 @@ import javax.sql.DataSource; @EnableJpaRepositories(basePackages = "dev.dnpm.oshelper.database") public class PluginConfiguration { - @Bean - public FormService formService(final DataSource dataSource) { - return new DefaultFormService(dataSource); - } - - @Bean - public StudienService studienService(final DataSource dataSource) { - return new DefaultStudienService(dataSource); - } + @Bean + public FormService formService(final DataSource dataSource) { + return new DefaultFormService(dataSource); + } - @Bean - public SettingsService settingsService(final SettingsRepository settingsRepository) { - return new SettingsService(settingsRepository); - } + @Bean + public StudienService studienService(final DataSource dataSource) { + return new DefaultStudienService(dataSource); + } - @Bean - public SystemtherapieService systemtherapieService( - final IOnkostarApi onkostarApi, - final SettingsService settingsService - ) { - return new DefaultSystemtherapieService(onkostarApi, settingsService); - } + @Bean + public SettingsService settingsService(final SettingsRepository settingsRepository) { + return new SettingsService(settingsRepository); + } - @Bean - public StrahlentherapieService strahlentherapieService( - final IOnkostarApi onkostarApi, - final SettingsService settingsService - ) { - return new DefaultStrahlentherapieService(onkostarApi, settingsService); - } + @Bean + public SystemtherapieService systemtherapieService( + final IOnkostarApi onkostarApi, final SettingsService settingsService) { + return new DefaultSystemtherapieService(onkostarApi, settingsService); + } - @Bean - public ConsentManagerServiceFactory consentManagerServiceFactory(final IOnkostarApi onkostarApi) { - return new ConsentManagerServiceFactory(onkostarApi); - } + @Bean + public StrahlentherapieService strahlentherapieService( + final IOnkostarApi onkostarApi, final SettingsService settingsService) { + return new DefaultStrahlentherapieService(onkostarApi, settingsService); + } - @Bean - public TherapieplanServiceFactory therapieplanServiceFactory( - final IOnkostarApi onkostarApi, - final SettingsService settingsService, - final FormService formService - ) { - return new TherapieplanServiceFactory(onkostarApi, settingsService, formService); - } + @Bean + public ConsentManagerServiceFactory consentManagerServiceFactory(final IOnkostarApi onkostarApi) { + return new ConsentManagerServiceFactory(onkostarApi); + } - @Bean - public MolekulargenetikFormService molekulargenetikFormService() { - return new OsMolekulargenetikFormService(); - } + @Bean + public TherapieplanServiceFactory therapieplanServiceFactory( + final IOnkostarApi onkostarApi, + final SettingsService settingsService, + final FormService formService) { + return new TherapieplanServiceFactory(onkostarApi, settingsService, formService); + } - @Bean - public AgentCodeService csvAgentCodeService() { - return new CsvAgentCodeService(); - } + @Bean + public MolekulargenetikFormService molekulargenetikFormService() { + return new OsMolekulargenetikFormService(); + } - @Bean - public AgentCodeService onkostarAgentCodeService (final DataSource dataSource) { - return new OnkostarAgentCodeService(dataSource); - } + @Bean + public AgentCodeService csvAgentCodeService() { + return new CsvAgentCodeService(); + } + @Bean + public AgentCodeService onkostarAgentCodeService(final DataSource dataSource) { + return new OnkostarAgentCodeService(dataSource); + } } diff --git a/src/main/java/dev/dnpm/oshelper/database/ReadOnlyRepository.java b/src/main/java/dev/dnpm/oshelper/database/ReadOnlyRepository.java index 90fb4b5..b7db9b2 100644 --- a/src/main/java/dev/dnpm/oshelper/database/ReadOnlyRepository.java +++ b/src/main/java/dev/dnpm/oshelper/database/ReadOnlyRepository.java @@ -19,23 +19,23 @@ package dev.dnpm.oshelper.database; -import org.springframework.data.repository.NoRepositoryBean; -import org.springframework.data.repository.Repository; - import java.io.Serializable; import java.util.List; +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.Repository; /** * Basis-Repository for ReadOnly Spring-Data-JPA Repositories + * * <p>Entity-Klassen müssen in Package <code>de.itc.db.dnpm</code> liegen + * * @param <T> Typ des Entities * @param <ID> Typ der ID */ @NoRepositoryBean public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> { - T findById(ID id); - - List<T> findAll(); + T findById(ID id); + List<T> findAll(); } diff --git a/src/main/java/dev/dnpm/oshelper/database/SettingsRepository.java b/src/main/java/dev/dnpm/oshelper/database/SettingsRepository.java index 936415f..03d9a53 100644 --- a/src/main/java/dev/dnpm/oshelper/database/SettingsRepository.java +++ b/src/main/java/dev/dnpm/oshelper/database/SettingsRepository.java @@ -22,12 +22,9 @@ package dev.dnpm.oshelper.database; import de.itc.db.dnpm.Setting; import org.springframework.stereotype.Repository; -/** - * Spring Data JPA Repository zum Lesen von Einstellungen - */ +/** Spring Data JPA Repository zum Lesen von Einstellungen */ @Repository("dnpmSettingRepository") public interface SettingsRepository extends ReadOnlyRepository<Setting, Long> { - Setting findByName(String name); - + Setting findByName(String name); } diff --git a/src/main/java/dev/dnpm/oshelper/dto/EcogStatusWithDate.java b/src/main/java/dev/dnpm/oshelper/dto/EcogStatusWithDate.java index 2b9331b..a943aff 100644 --- a/src/main/java/dev/dnpm/oshelper/dto/EcogStatusWithDate.java +++ b/src/main/java/dev/dnpm/oshelper/dto/EcogStatusWithDate.java @@ -19,45 +19,42 @@ package dev.dnpm.oshelper.dto; -import org.springframework.util.Assert; - import java.util.Date; +import org.springframework.util.Assert; -/** - * Datenklasse zum Abbilden des ECOG-Status und Datum - */ +/** Datenklasse zum Abbilden des ECOG-Status und Datum */ public class EcogStatusWithDate { - private final Date date; - private final String status; - - public EcogStatusWithDate(Date date, String status) { - Assert.notNull(date, "Date cannot be null"); - Assert.hasText(status, "Status cannot be empty String"); - Assert.isTrue(isValidEcogCode(status), "Not a valid ADT.LeistungszustandECOG code"); - this.date = date; - this.status = status; + private final Date date; + private final String status; + + public EcogStatusWithDate(Date date, String status) { + Assert.notNull(date, "Date cannot be null"); + Assert.hasText(status, "Status cannot be empty String"); + Assert.isTrue(isValidEcogCode(status), "Not a valid ADT.LeistungszustandECOG code"); + this.date = date; + this.status = status; + } + + private boolean isValidEcogCode(String status) { + switch (status) { + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "U": + return true; + default: + return false; } + } - private boolean isValidEcogCode(String status) { - switch (status) { - case "0": - case "1": - case "2": - case "3": - case "4": - case "5": - case "U": - return true; - default: - return false; - } - } - - public Date getDate() { - return date; - } + public Date getDate() { + return date; + } - public String getStatus() { - return status; - } + public String getStatus() { + return status; + } } diff --git a/src/main/java/dev/dnpm/oshelper/dto/Studie.java b/src/main/java/dev/dnpm/oshelper/dto/Studie.java index 1a3bb85..e13d772 100644 --- a/src/main/java/dev/dnpm/oshelper/dto/Studie.java +++ b/src/main/java/dev/dnpm/oshelper/dto/Studie.java @@ -20,74 +20,81 @@ package dev.dnpm.oshelper.dto; public class Studie { - private final String kategorieName; - private final String code; - private final String studiennummer; - private final String shortDesc; - private final String description; - private final int version; + private final String kategorieName; + private final String code; + private final String studiennummer; + private final String shortDesc; + private final String description; + private final int version; - private final boolean active; + private final boolean active; - public Studie(final String kategorieName, final int version, final String code, final String studiennummer, final String shortDesc, final String description, final boolean active) { - this.kategorieName = kategorieName; - this.version = version; - this.code = code; - this.studiennummer = studiennummer; - this.shortDesc = shortDesc; - this.description = description; - this.active = active; - } + public Studie( + final String kategorieName, + final int version, + final String code, + final String studiennummer, + final String shortDesc, + final String description, + final boolean active) { + this.kategorieName = kategorieName; + this.version = version; + this.code = code; + this.studiennummer = studiennummer; + this.shortDesc = shortDesc; + this.description = description; + this.active = active; + } - public String getKategorieName() { - return kategorieName; - } + public String getKategorieName() { + return kategorieName; + } - public int getVersion() { - return version; - } + public int getVersion() { + return version; + } - public String getCode() { - return code; - } + public String getCode() { + return code; + } - public String getStudiennummer() { - return studiennummer; - } + public String getStudiennummer() { + return studiennummer; + } - public String getShortDesc() { - return shortDesc; - } + public String getShortDesc() { + return shortDesc; + } - public String getDescription() { - return description; - } + public String getDescription() { + return description; + } - public boolean isActive() { - return active; - } + public boolean isActive() { + return active; + } - public Type getType() { - if (this.hasNctNumber()) { - return Type.NCT; - } else if (this.hasEudraCtNumber()) { - return Type.EUDRA_CT; - } else { - return Type.UNKNOWN; - } + public Type getType() { + if (this.hasNctNumber()) { + return Type.NCT; + } else if (this.hasEudraCtNumber()) { + return Type.EUDRA_CT; + } else { + return Type.UNKNOWN; } + } - private boolean hasNctNumber() { - return null != studiennummer && studiennummer.toLowerCase().startsWith("nct"); - } + private boolean hasNctNumber() { + return null != studiennummer && studiennummer.toLowerCase().startsWith("nct"); + } - private boolean hasEudraCtNumber() { - return null != studiennummer && studiennummer.matches("\\d{4}-\\d{6}-\\d{2}"); - } + private boolean hasEudraCtNumber() { + return null != studiennummer && studiennummer.matches("\\d{4}-\\d{6}-\\d{2}"); + } - public enum Type { - NCT, - EUDRA_CT, - UNKNOWN - } + public enum Type { + NCT, + EUDRA_CT, + UNKNOWN + } } diff --git a/src/main/java/dev/dnpm/oshelper/dto/Variant.java b/src/main/java/dev/dnpm/oshelper/dto/Variant.java index 3e501dd..63bd078 100644 --- a/src/main/java/dev/dnpm/oshelper/dto/Variant.java +++ b/src/main/java/dev/dnpm/oshelper/dto/Variant.java @@ -20,110 +20,110 @@ package dev.dnpm.oshelper.dto; import de.itc.onkostar.api.Procedure; - import java.util.Optional; /** - * Ein Auszug der Variante aus dem NGS-Bericht zur Übertragung an das Frontend zur Auswahl der stützenden molekularen Alteration + * Ein Auszug der Variante aus dem NGS-Bericht zur Übertragung an das Frontend zur Auswahl der + * stützenden molekularen Alteration * * @since 0.2.0 */ public class Variant { - private final Integer id; - - private final String ergebnis; - - private final String gen; - - private final String exon; - - private final String pathogenitaetsklasse; - - private Variant( - final int id, - final String ergebnis, - final String gen, - final String exon, - final String pathogenitaetsklasse - ) { - this.id = id; - this.ergebnis = ergebnis; - this.gen = gen; - this.exon = exon; - this.pathogenitaetsklasse = pathogenitaetsklasse; + private final Integer id; + + private final String ergebnis; + + private final String gen; + + private final String exon; + + private final String pathogenitaetsklasse; + + private Variant( + final int id, + final String ergebnis, + final String gen, + final String exon, + final String pathogenitaetsklasse) { + this.id = id; + this.ergebnis = ergebnis; + this.gen = gen; + this.exon = exon; + this.pathogenitaetsklasse = pathogenitaetsklasse; + } + + public Integer getId() { + return id; + } + + public String getErgebnis() { + return ergebnis; + } + + public String getGen() { + return gen; + } + + public String getExon() { + return exon; + } + + public String getPathogenitaetsklasse() { + return pathogenitaetsklasse; + } + + /** + * Erstellt ein Optional einer Variante aus einer Prozedur + * + * @param procedure Die zu verwendende Prozedur + * @return Das Optional, wenn die Prozedur verwendet werden kann, ansonsten ein leeres Optional + */ + public static Optional<Variant> fromProcedure(Procedure procedure) { + if (!"OS.Molekulargenetische Untersuchung".equals(procedure.getFormName())) { + return Optional.empty(); } - public Integer getId() { - return id; - } - - public String getErgebnis() { - return ergebnis; - } - - public String getGen() { - return gen; - } - - public String getExon() { - return exon; - } + var ergebnis = procedure.getValue("Ergebnis"); + var gene = procedure.getValue("Untersucht"); + var exon = procedure.getValue("ExonInt"); + var pathogenitaetsklasse = procedure.getValue("Pathogenitaetsklasse"); - public String getPathogenitaetsklasse() { - return pathogenitaetsklasse; + if (null == gene) { + return Optional.empty(); } - /** - * Erstellt ein Optional einer Variante aus einer Prozedur - * @param procedure Die zu verwendende Prozedur - * @return Das Optional, wenn die Prozedur verwendet werden kann, ansonsten ein leeres Optional - */ - public static Optional<Variant> fromProcedure(Procedure procedure) { - if (!"OS.Molekulargenetische Untersuchung".equals(procedure.getFormName())) { - return Optional.empty(); - } - - var ergebnis = procedure.getValue("Ergebnis"); - var gene = procedure.getValue("Untersucht"); - var exon = procedure.getValue("ExonInt"); - var pathogenitaetsklasse = procedure.getValue("Pathogenitaetsklasse"); - - if (null == gene) { - return Optional.empty(); - } - - if (ergebnis.getString().equals("P")) { - return Optional.of( - new Variant( - procedure.getId(), - "Einfache Variante (Mutation)", - gene.getString().isBlank() ? "-" : gene.getString(), - null == exon || exon.getString().isBlank() ? "-" : exon.getString(), - null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() ? "-" : pathogenitaetsklasse.getString() - ) - ); - } else if (ergebnis.getString().equals("CNV")) { - return Optional.of( - new Variant( - procedure.getId(), - "Copy Number Variation (CNV)", - gene.getString().isBlank() ? "-" : gene.getString(), - null == exon || exon.getString().isBlank() ? "-" : exon.getString(), - null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() ? "-" : pathogenitaetsklasse.getString() - ) - ); - } else if (ergebnis.getString().equals("F")) { - return Optional.of( - new Variant( - procedure.getId(), - "Fusion (Translokation Inversion Insertion)", - gene.getString().isBlank() ? "-" : gene.getString(), - null == exon || exon.getString().isBlank() ? "-" : exon.getString(), - null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() ? "-" : pathogenitaetsklasse.getString() - ) - ); - } else { - return Optional.empty(); - } + if (ergebnis.getString().equals("P")) { + return Optional.of( + new Variant( + procedure.getId(), + "Einfache Variante (Mutation)", + gene.getString().isBlank() ? "-" : gene.getString(), + null == exon || exon.getString().isBlank() ? "-" : exon.getString(), + null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() + ? "-" + : pathogenitaetsklasse.getString())); + } else if (ergebnis.getString().equals("CNV")) { + return Optional.of( + new Variant( + procedure.getId(), + "Copy Number Variation (CNV)", + gene.getString().isBlank() ? "-" : gene.getString(), + null == exon || exon.getString().isBlank() ? "-" : exon.getString(), + null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() + ? "-" + : pathogenitaetsklasse.getString())); + } else if (ergebnis.getString().equals("F")) { + return Optional.of( + new Variant( + procedure.getId(), + "Fusion (Translokation Inversion Insertion)", + gene.getString().isBlank() ? "-" : gene.getString(), + null == exon || exon.getString().isBlank() ? "-" : exon.getString(), + null == pathogenitaetsklasse || pathogenitaetsklasse.getString().isBlank() + ? "-" + : pathogenitaetsklasse.getString())); + } else { + return Optional.empty(); } + } } diff --git a/src/main/java/dev/dnpm/oshelper/exceptions/FileParsingException.java b/src/main/java/dev/dnpm/oshelper/exceptions/FileParsingException.java index f523553..dc483d2 100644 --- a/src/main/java/dev/dnpm/oshelper/exceptions/FileParsingException.java +++ b/src/main/java/dev/dnpm/oshelper/exceptions/FileParsingException.java @@ -27,8 +27,7 @@ package dev.dnpm.oshelper.exceptions; */ public class FileParsingException extends RuntimeException { - public FileParsingException(final String msg) { - super(msg); - } - + public FileParsingException(final String msg) { + super(msg); + } } diff --git a/src/main/java/dev/dnpm/oshelper/exceptions/FormException.java b/src/main/java/dev/dnpm/oshelper/exceptions/FormException.java index aabed1a..6a083f4 100644 --- a/src/main/java/dev/dnpm/oshelper/exceptions/FormException.java +++ b/src/main/java/dev/dnpm/oshelper/exceptions/FormException.java @@ -21,8 +21,7 @@ package dev.dnpm.oshelper.exceptions; public class FormException extends RuntimeException { - public FormException(String message) { - super(message); - } - + public FormException(String message) { + super(message); + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/AbstractDelegatedPermissionEvaluator.java b/src/main/java/dev/dnpm/oshelper/security/AbstractDelegatedPermissionEvaluator.java index 99b5397..230cb01 100644 --- a/src/main/java/dev/dnpm/oshelper/security/AbstractDelegatedPermissionEvaluator.java +++ b/src/main/java/dev/dnpm/oshelper/security/AbstractDelegatedPermissionEvaluator.java @@ -26,17 +26,17 @@ import org.springframework.security.access.PermissionEvaluator; public abstract class AbstractDelegatedPermissionEvaluator implements PermissionEvaluator { - protected static final String PATIENT = Patient.class.getSimpleName(); + protected static final String PATIENT = Patient.class.getSimpleName(); - protected static final String PROCEDURE = Procedure.class.getSimpleName(); + protected static final String PROCEDURE = Procedure.class.getSimpleName(); - protected final IOnkostarApi onkostarApi; + protected final IOnkostarApi onkostarApi; - protected final SecurityService securityService; - - protected AbstractDelegatedPermissionEvaluator(final IOnkostarApi onkostarApi, final SecurityService securityService) { - this.onkostarApi = onkostarApi; - this.securityService = securityService; - } + protected final SecurityService securityService; + protected AbstractDelegatedPermissionEvaluator( + final IOnkostarApi onkostarApi, final SecurityService securityService) { + this.onkostarApi = onkostarApi; + this.securityService = securityService; + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluator.java b/src/main/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluator.java index f25d105..b842e8e 100644 --- a/src/main/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluator.java +++ b/src/main/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluator.java @@ -19,57 +19,66 @@ package dev.dnpm.oshelper.security; +import java.io.Serializable; +import java.util.List; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import java.io.Serializable; -import java.util.List; - /** - * PermissionEvaluator zur Gesamtprüfung der Zugriffsberechtigung. - * Die konkrete Berechtigungsprüfung wird an die nachgelagerten PermissionEvaluatoren delegiert, - * welche jeweils einzeln dem Zugriff zustimmen müssen. + * PermissionEvaluator zur Gesamtprüfung der Zugriffsberechtigung. Die konkrete Berechtigungsprüfung + * wird an die nachgelagerten PermissionEvaluatoren delegiert, welche jeweils einzeln dem Zugriff + * zustimmen müssen. */ @Component public class DelegatingDataBasedPermissionEvaluator implements PermissionEvaluator { - private final List<AbstractDelegatedPermissionEvaluator> permissionEvaluators; + private final List<AbstractDelegatedPermissionEvaluator> permissionEvaluators; - public DelegatingDataBasedPermissionEvaluator(final List<AbstractDelegatedPermissionEvaluator> permissionEvaluators) { - this.permissionEvaluators = permissionEvaluators; - } + public DelegatingDataBasedPermissionEvaluator( + final List<AbstractDelegatedPermissionEvaluator> permissionEvaluators) { + this.permissionEvaluators = permissionEvaluators; + } - /** - * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit angeforderter Berechtigung. - * Hierbei wird die Berechtigungsprüfung an alle nachgelagerten PermissionEvaluatoren delegiert. - * Alle müssen dem Zugriff zustimmen. - * - * @param authentication Das Authentication Objekt - * @param targetObject Das Zielobjekt - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Object targetObject, Object permissionType) { - return permissionEvaluators.stream() - .allMatch(permissionEvaluator -> permissionEvaluator.hasPermission(authentication, targetObject, permissionType)); - } + /** + * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit + * angeforderter Berechtigung. Hierbei wird die Berechtigungsprüfung an alle nachgelagerten + * PermissionEvaluatoren delegiert. Alle müssen dem Zugriff zustimmen. + * + * @param authentication Das Authentication Objekt + * @param targetObject Das Zielobjekt + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, Object targetObject, Object permissionType) { + return permissionEvaluators.stream() + .allMatch( + permissionEvaluator -> + permissionEvaluator.hasPermission(authentication, targetObject, permissionType)); + } - /** - * Auswertung anhand der ID und des Namens des Zielobjekts. - * Hierbei wird die Berechtigungsprüfung an alle nachgelagerten PermissionEvaluatoren delegiert. - * Alle müssen dem Zugriff zustimmen. - * - * @param authentication Authentication-Object - * @param targetId ID des Objekts - * @param targetType Name der Zielobjektklasse - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permissionType) { - return permissionEvaluators.stream() - .allMatch(permissionEvaluator -> permissionEvaluator.hasPermission(authentication, targetId, targetType, permissionType)); - } + /** + * Auswertung anhand der ID und des Namens des Zielobjekts. Hierbei wird die Berechtigungsprüfung + * an alle nachgelagerten PermissionEvaluatoren delegiert. Alle müssen dem Zugriff zustimmen. + * + * @param authentication Authentication-Object + * @param targetId ID des Objekts + * @param targetType Name der Zielobjektklasse + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, + Serializable targetId, + String targetType, + Object permissionType) { + return permissionEvaluators.stream() + .allMatch( + permissionEvaluator -> + permissionEvaluator.hasPermission( + authentication, targetId, targetType, permissionType)); + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluator.java b/src/main/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluator.java index 7ec38f0..768052a 100644 --- a/src/main/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluator.java +++ b/src/main/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluator.java @@ -21,58 +21,68 @@ package dev.dnpm.oshelper.security; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; +import java.io.Serializable; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import java.io.Serializable; - /** - * Permission-Evaluator zur Auswertung der Berechtigung auf Objekte aufgrund der Formularberechtigung + * Permission-Evaluator zur Auswertung der Berechtigung auf Objekte aufgrund der + * Formularberechtigung */ @Component public class FormBasedPermissionEvaluator extends AbstractDelegatedPermissionEvaluator { - public FormBasedPermissionEvaluator(final IOnkostarApi onkostarApi, final SecurityService securityService) { - super(onkostarApi, securityService); - } + public FormBasedPermissionEvaluator( + final IOnkostarApi onkostarApi, final SecurityService securityService) { + super(onkostarApi, securityService); + } - /** - * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit angeforderter Berechtigung. - * Zugriff auf Objekte vom Typ "Patient" wird immer gewährt. - * - * @param authentication Das Authentication Objekt - * @param targetObject Das Zielobjekt - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Object targetObject, Object permissionType) { - if (permissionType instanceof PermissionType && targetObject instanceof Procedure) { - return this.securityService.getFormNamesForPermission(authentication, (PermissionType)permissionType) - .contains(((Procedure)targetObject).getFormName()); - } - return true; + /** + * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit + * angeforderter Berechtigung. Zugriff auf Objekte vom Typ "Patient" wird immer gewährt. + * + * @param authentication Das Authentication Objekt + * @param targetObject Das Zielobjekt + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, Object targetObject, Object permissionType) { + if (permissionType instanceof PermissionType && targetObject instanceof Procedure) { + return this.securityService + .getFormNamesForPermission(authentication, (PermissionType) permissionType) + .contains(((Procedure) targetObject).getFormName()); } + return true; + } - /** - * Auswertung anhand der ID und des Namens des Zielobjekts. - * Zugriff auf Objekte vom Typ "Patient" wird immer gewährt. - * - * @param authentication Authentication-Object - * @param targetId ID des Objekts - * @param targetType Name der Zielobjektklasse - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permissionType) { - if (permissionType instanceof PermissionType && targetId instanceof Integer && PROCEDURE.equals(targetType)) { - var procedure = this.onkostarApi.getProcedure((int)targetId); - if (null != procedure) { - return this.securityService.getFormNamesForPermission(authentication, (PermissionType) permissionType).contains(procedure.getFormName()); - } - } - return true; + /** + * Auswertung anhand der ID und des Namens des Zielobjekts. Zugriff auf Objekte vom Typ "Patient" + * wird immer gewährt. + * + * @param authentication Authentication-Object + * @param targetId ID des Objekts + * @param targetType Name der Zielobjektklasse + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, + Serializable targetId, + String targetType, + Object permissionType) { + if (permissionType instanceof PermissionType + && targetId instanceof Integer + && PROCEDURE.equals(targetType)) { + var procedure = this.onkostarApi.getProcedure((int) targetId); + if (null != procedure) { + return this.securityService + .getFormNamesForPermission(authentication, (PermissionType) permissionType) + .contains(procedure.getFormName()); + } } - + return true; + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/FormBasedSecurityAspects.java b/src/main/java/dev/dnpm/oshelper/security/FormBasedSecurityAspects.java index 6eb5a80..bfca456 100644 --- a/src/main/java/dev/dnpm/oshelper/security/FormBasedSecurityAspects.java +++ b/src/main/java/dev/dnpm/oshelper/security/FormBasedSecurityAspects.java @@ -20,6 +20,7 @@ package dev.dnpm.oshelper.security; import de.itc.onkostar.api.Procedure; +import java.util.Arrays; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @@ -28,43 +29,46 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContextHolder; -import java.util.Arrays; - // TODO Disabled for now - check bytecode reported incompatibility for older OS installations -//@Component +// @Component @Aspect public class FormBasedSecurityAspects { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final FormBasedPermissionEvaluator permissionEvaluator; + private final FormBasedPermissionEvaluator permissionEvaluator; - public FormBasedSecurityAspects( - final FormBasedPermissionEvaluator permissionEvaluator - ) { - this.permissionEvaluator = permissionEvaluator; - } + public FormBasedSecurityAspects(final FormBasedPermissionEvaluator permissionEvaluator) { + this.permissionEvaluator = permissionEvaluator; + } - @AfterReturning(value = "@annotation(dev.dnpm.oshelper.security.FormSecuredResult)", returning = "procedure") - public void afterProcedureFormBased(Procedure procedure) { - if ( - null != procedure - && ! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ_WRITE) - ) { - logger.warn("Rückgabe von Prozedur blockiert: {}", procedure.getId()); - throw new IllegalSecuredObjectAccessException(); - } + @AfterReturning( + value = "@annotation(dev.dnpm.oshelper.security.FormSecuredResult)", + returning = "procedure") + public void afterProcedureFormBased(Procedure procedure) { + if (null != procedure + && !permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + procedure, + PermissionType.READ_WRITE)) { + logger.warn("Rückgabe von Prozedur blockiert: {}", procedure.getId()); + throw new IllegalSecuredObjectAccessException(); } + } - @Before(value = "@annotation(dev.dnpm.oshelper.security.FormSecured)") - public void beforeProcedureFormBased(JoinPoint jp) { - Arrays.stream(jp.getArgs()) - .filter(arg -> arg instanceof Procedure) - .forEach(procedure -> { - if (! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ_WRITE)) { - logger.warn("Zugriff auf Prozedur blockiert: {}", ((Procedure)procedure).getId()); - throw new IllegalSecuredObjectAccessException(); - } - }); - } + @Before(value = "@annotation(dev.dnpm.oshelper.security.FormSecured)") + public void beforeProcedureFormBased(JoinPoint jp) { + Arrays.stream(jp.getArgs()) + .filter(arg -> arg instanceof Procedure) + .forEach( + procedure -> { + if (!permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + procedure, + PermissionType.READ_WRITE)) { + logger.warn("Zugriff auf Prozedur blockiert: {}", ((Procedure) procedure).getId()); + throw new IllegalSecuredObjectAccessException(); + } + }); + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/FormSecured.java b/src/main/java/dev/dnpm/oshelper/security/FormSecured.java index 4419575..5bc271d 100644 --- a/src/main/java/dev/dnpm/oshelper/security/FormSecured.java +++ b/src/main/java/dev/dnpm/oshelper/security/FormSecured.java @@ -28,6 +28,5 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface FormSecured { - PermissionType value() default PermissionType.READ_WRITE; - + PermissionType value() default PermissionType.READ_WRITE; } diff --git a/src/main/java/dev/dnpm/oshelper/security/FormSecuredResult.java b/src/main/java/dev/dnpm/oshelper/security/FormSecuredResult.java index a0b180c..51612d0 100644 --- a/src/main/java/dev/dnpm/oshelper/security/FormSecuredResult.java +++ b/src/main/java/dev/dnpm/oshelper/security/FormSecuredResult.java @@ -28,6 +28,5 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface FormSecuredResult { - PermissionType value() default PermissionType.READ_WRITE; - + PermissionType value() default PermissionType.READ_WRITE; } diff --git a/src/main/java/dev/dnpm/oshelper/security/IllegalSecuredObjectAccessException.java b/src/main/java/dev/dnpm/oshelper/security/IllegalSecuredObjectAccessException.java index 4a46126..0b179ab 100644 --- a/src/main/java/dev/dnpm/oshelper/security/IllegalSecuredObjectAccessException.java +++ b/src/main/java/dev/dnpm/oshelper/security/IllegalSecuredObjectAccessException.java @@ -21,12 +21,11 @@ package dev.dnpm.oshelper.security; public class IllegalSecuredObjectAccessException extends RuntimeException { - public IllegalSecuredObjectAccessException() { - super(); - } - - public IllegalSecuredObjectAccessException(String message) { - super(message); - } + public IllegalSecuredObjectAccessException() { + super(); + } + public IllegalSecuredObjectAccessException(String message) { + super(message); + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/PermissionType.java b/src/main/java/dev/dnpm/oshelper/security/PermissionType.java index e041620..51c51ff 100644 --- a/src/main/java/dev/dnpm/oshelper/security/PermissionType.java +++ b/src/main/java/dev/dnpm/oshelper/security/PermissionType.java @@ -20,6 +20,6 @@ package dev.dnpm.oshelper.security; public enum PermissionType { - READ, - READ_WRITE + READ, + READ_WRITE } diff --git a/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluator.java b/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluator.java index 1681945..666aed9 100644 --- a/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluator.java +++ b/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluator.java @@ -22,79 +22,90 @@ package dev.dnpm.oshelper.security; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; +import java.io.Serializable; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import java.io.Serializable; - /** - * Permission-Evaluator zur Auswertung der Berechtigung auf Objekte aufgrund der Personenstammberechtigung + * Permission-Evaluator zur Auswertung der Berechtigung auf Objekte aufgrund der + * Personenstammberechtigung */ @Component public class PersonPoolBasedPermissionEvaluator extends AbstractDelegatedPermissionEvaluator { - public PersonPoolBasedPermissionEvaluator(final IOnkostarApi onkostarApi, final SecurityService securityService) { - super(onkostarApi, securityService); - } + public PersonPoolBasedPermissionEvaluator( + final IOnkostarApi onkostarApi, final SecurityService securityService) { + super(onkostarApi, securityService); + } - /** - * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit angeforderter Berechtigung. - * @param authentication Das Authentication Objekt - * @param targetObject Das Zielobjekt - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Object targetObject, Object permissionType) { - if (permissionType instanceof PermissionType) { - if (targetObject instanceof Patient) { - return this.securityService.getPersonPoolIdsForPermission(authentication, (PermissionType)permissionType) - .contains(((Patient)targetObject).getPersonPoolCode()); - } else if (targetObject instanceof Procedure) { - return this.securityService.getPersonPoolIdsForPermission(authentication, (PermissionType)permissionType) - .contains(((Procedure)targetObject).getPatient().getPersonPoolCode()); - } - } - return false; + /** + * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit + * angeforderter Berechtigung. + * + * @param authentication Das Authentication Objekt + * @param targetObject Das Zielobjekt + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, Object targetObject, Object permissionType) { + if (permissionType instanceof PermissionType) { + if (targetObject instanceof Patient) { + return this.securityService + .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType) + .contains(((Patient) targetObject).getPersonPoolCode()); + } else if (targetObject instanceof Procedure) { + return this.securityService + .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType) + .contains(((Procedure) targetObject).getPatient().getPersonPoolCode()); + } } + return false; + } - /** - * Auswertung anhand der ID und des Namens des Zielobjekts. - * @param authentication Authentication-Object - * @param targetId ID des Objekts - * @param targetType Name der Zielobjektklasse - * @param permissionType Die angeforderte Berechtigung - * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat - */ - @Override - public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permissionType) { - if (targetId instanceof Integer && permissionType instanceof PermissionType) { - var personPoolCode = getPersonPoolCode((int)targetId, targetType); - if (null != personPoolCode) { - return this.securityService.getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType).contains(personPoolCode); - } - } - return false; + /** + * Auswertung anhand der ID und des Namens des Zielobjekts. + * + * @param authentication Authentication-Object + * @param targetId ID des Objekts + * @param targetType Name der Zielobjektklasse + * @param permissionType Die angeforderte Berechtigung + * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat + */ + @Override + public boolean hasPermission( + Authentication authentication, + Serializable targetId, + String targetType, + Object permissionType) { + if (targetId instanceof Integer && permissionType instanceof PermissionType) { + var personPoolCode = getPersonPoolCode((int) targetId, targetType); + if (null != personPoolCode) { + return this.securityService + .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType) + .contains(personPoolCode); + } } + return false; + } - private String getPersonPoolCode(int id, String type) { - Patient patient = null; + private String getPersonPoolCode(int id, String type) { + Patient patient = null; - if (PATIENT.equals(type)) { - patient = onkostarApi.getPatient(id); - } else if (PROCEDURE.equals(type)) { - var procedure = onkostarApi.getProcedure(id); - if (null != procedure) { - patient = procedure.getPatient(); - } - } - - if (null != patient) { - return patient.getPersonPoolCode(); - } - - return null; + if (PATIENT.equals(type)) { + patient = onkostarApi.getPatient(id); + } else if (PROCEDURE.equals(type)) { + var procedure = onkostarApi.getProcedure(id); + if (null != procedure) { + patient = procedure.getPatient(); + } } + if (null != patient) { + return patient.getPersonPoolCode(); + } + return null; + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspects.java b/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspects.java index ae6d82d..1cd4122 100644 --- a/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspects.java +++ b/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspects.java @@ -21,6 +21,7 @@ package dev.dnpm.oshelper.security; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; +import java.util.Arrays; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @@ -30,64 +31,75 @@ import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; -import java.util.Arrays; - @Component @Aspect public class PersonPoolBasedSecurityAspects { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final PersonPoolBasedPermissionEvaluator permissionEvaluator; + private final PersonPoolBasedPermissionEvaluator permissionEvaluator; - public PersonPoolBasedSecurityAspects(PersonPoolBasedPermissionEvaluator permissionEvaluator) { - this.permissionEvaluator = permissionEvaluator; - } + public PersonPoolBasedSecurityAspects(PersonPoolBasedPermissionEvaluator permissionEvaluator) { + this.permissionEvaluator = permissionEvaluator; + } - @AfterReturning(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecuredResult) ", returning = "patient") - public void afterPatient(Patient patient) { - if ( - null != patient - && ! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), patient, PermissionType.READ_WRITE) - ) { - logger.warn("Rückgabe von Patient blockiert: {}", patient.getId()); - throw new IllegalSecuredObjectAccessException(); - } + @AfterReturning( + value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecuredResult) ", + returning = "patient") + public void afterPatient(Patient patient) { + if (null != patient + && !permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + patient, + PermissionType.READ_WRITE)) { + logger.warn("Rückgabe von Patient blockiert: {}", patient.getId()); + throw new IllegalSecuredObjectAccessException(); } + } - @AfterReturning(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecuredResult)", returning = "procedure") - public void afterProcedure(Procedure procedure) { - if ( - null != procedure - && ! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ_WRITE) - ) { - logger.warn("Rückgabe von Prozedur blockiert: {}", procedure.getId()); - throw new IllegalSecuredObjectAccessException(); - } + @AfterReturning( + value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecuredResult)", + returning = "procedure") + public void afterProcedure(Procedure procedure) { + if (null != procedure + && !permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + procedure, + PermissionType.READ_WRITE)) { + logger.warn("Rückgabe von Prozedur blockiert: {}", procedure.getId()); + throw new IllegalSecuredObjectAccessException(); } + } - @Before(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecured)") - public void beforePatient(JoinPoint jp) { - Arrays.stream(jp.getArgs()) - .filter(arg -> arg instanceof Patient) - .forEach(patient -> { - if (! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), patient, PermissionType.READ_WRITE)) { - logger.warn("Zugriff auf Patient blockiert: {}", ((Patient)patient).getId()); - throw new IllegalSecuredObjectAccessException(); - } - }); - } - - @Before(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecured)") - public void beforeProcedure(JoinPoint jp) { - Arrays.stream(jp.getArgs()) - .filter(arg -> arg instanceof Procedure) - .forEach(procedure -> { - if (! permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), procedure, PermissionType.READ_WRITE)) { - logger.warn("Zugriff auf Prozedur blockiert: {}", ((Procedure)procedure).getId()); - throw new IllegalSecuredObjectAccessException(); - } - }); - } + @Before(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecured)") + public void beforePatient(JoinPoint jp) { + Arrays.stream(jp.getArgs()) + .filter(arg -> arg instanceof Patient) + .forEach( + patient -> { + if (!permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + patient, + PermissionType.READ_WRITE)) { + logger.warn("Zugriff auf Patient blockiert: {}", ((Patient) patient).getId()); + throw new IllegalSecuredObjectAccessException(); + } + }); + } + @Before(value = "@annotation(dev.dnpm.oshelper.security.PersonPoolSecured)") + public void beforeProcedure(JoinPoint jp) { + Arrays.stream(jp.getArgs()) + .filter(arg -> arg instanceof Procedure) + .forEach( + procedure -> { + if (!permissionEvaluator.hasPermission( + SecurityContextHolder.getContext().getAuthentication(), + procedure, + PermissionType.READ_WRITE)) { + logger.warn("Zugriff auf Prozedur blockiert: {}", ((Procedure) procedure).getId()); + throw new IllegalSecuredObjectAccessException(); + } + }); + } } diff --git a/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecured.java b/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecured.java index 079da7e..ebd1274 100644 --- a/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecured.java +++ b/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecured.java @@ -28,6 +28,5 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface PersonPoolSecured { - PermissionType value() default PermissionType.READ_WRITE; - + PermissionType value() default PermissionType.READ_WRITE; } diff --git a/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecuredResult.java b/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecuredResult.java index afb0a12..bec530e 100644 --- a/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecuredResult.java +++ b/src/main/java/dev/dnpm/oshelper/security/PersonPoolSecuredResult.java @@ -28,6 +28,5 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface PersonPoolSecuredResult { - PermissionType value() default PermissionType.READ_WRITE; - + PermissionType value() default PermissionType.READ_WRITE; } diff --git a/src/main/java/dev/dnpm/oshelper/security/SecurityService.java b/src/main/java/dev/dnpm/oshelper/security/SecurityService.java index 677645e..46b5bf2 100644 --- a/src/main/java/dev/dnpm/oshelper/security/SecurityService.java +++ b/src/main/java/dev/dnpm/oshelper/security/SecurityService.java @@ -19,61 +19,61 @@ package dev.dnpm.oshelper.security; +import java.util.List; +import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; -import javax.sql.DataSource; -import java.util.List; - -/** - * Service mit Methoden zum Feststellen von sicherheitsrelevanten Informationen eines Benutzers - */ +/** Service mit Methoden zum Feststellen von sicherheitsrelevanten Informationen eines Benutzers */ @Service public class SecurityService { - private final JdbcTemplate jdbcTemplate; - - public SecurityService(final DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); - } + private final JdbcTemplate jdbcTemplate; - List<String> getPersonPoolIdsForPermission(Authentication authentication, PermissionType permissionType) { - var sql = "SELECT p.kennung FROM personenstamm_zugriff " + - " JOIN usergroup u ON personenstamm_zugriff.benutzergruppe_id = u.id " + - " JOIN akteur_usergroup au ON u.id = au.usergroup_id " + - " JOIN akteur a ON au.akteur_id = a.id " + - " JOIN personenstamm p on personenstamm_zugriff.personenstamm_id = p.id " + - " WHERE a.login = ? AND a.aktiv AND a.anmelden_moeglich "; + public SecurityService(final DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } - if (PermissionType.READ_WRITE == permissionType) { - sql += " AND personenstamm_zugriff.bearbeiten "; - } + List<String> getPersonPoolIdsForPermission( + Authentication authentication, PermissionType permissionType) { + var sql = + "SELECT p.kennung FROM personenstamm_zugriff " + + " JOIN usergroup u ON personenstamm_zugriff.benutzergruppe_id = u.id " + + " JOIN akteur_usergroup au ON u.id = au.usergroup_id " + + " JOIN akteur a ON au.akteur_id = a.id " + + " JOIN personenstamm p on personenstamm_zugriff.personenstamm_id = p.id " + + " WHERE a.login = ? AND a.aktiv AND a.anmelden_moeglich "; - var userDetails = (UserDetails)authentication.getPrincipal(); - - return jdbcTemplate - .query(sql, new Object[]{userDetails.getUsername()}, (rs, rowNum) -> rs.getString("kennung")); + if (PermissionType.READ_WRITE == permissionType) { + sql += " AND personenstamm_zugriff.bearbeiten "; } - List<String> getFormNamesForPermission(Authentication authentication, PermissionType permissionType) { + var userDetails = (UserDetails) authentication.getPrincipal(); - var sql = "SELECT df.name FROM formular_usergroup_zugriff " + - " JOIN data_form df ON formular_usergroup_zugriff.formular_id = df.id " + - " JOIN usergroup u ON formular_usergroup_zugriff.usergroup_id = u.id " + - " JOIN akteur_usergroup au ON u.id = au.usergroup_id " + - " JOIN akteur a on au.akteur_id = a.id " + - " WHERE a.login = ? AND a.aktiv AND a.anmelden_moeglich "; + return jdbcTemplate.query( + sql, new Object[] {userDetails.getUsername()}, (rs, rowNum) -> rs.getString("kennung")); + } - if (PermissionType.READ_WRITE == permissionType) { - sql += " AND formular_usergroup_zugriff.bearbeiten "; - } + List<String> getFormNamesForPermission( + Authentication authentication, PermissionType permissionType) { - var userDetails = (UserDetails)authentication.getPrincipal(); + var sql = + "SELECT df.name FROM formular_usergroup_zugriff " + + " JOIN data_form df ON formular_usergroup_zugriff.formular_id = df.id " + + " JOIN usergroup u ON formular_usergroup_zugriff.usergroup_id = u.id " + + " JOIN akteur_usergroup au ON u.id = au.usergroup_id " + + " JOIN akteur a on au.akteur_id = a.id " + + " WHERE a.login = ? AND a.aktiv AND a.anmelden_moeglich "; - return jdbcTemplate - .query(sql, new Object[]{userDetails.getUsername()}, (rs, rowNum) -> rs.getString("name")); + if (PermissionType.READ_WRITE == permissionType) { + sql += " AND formular_usergroup_zugriff.bearbeiten "; } + var userDetails = (UserDetails) authentication.getPrincipal(); + + return jdbcTemplate.query( + sql, new Object[] {userDetails.getUsername()}, (rs, rowNum) -> rs.getString("name")); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/DefaultFormService.java b/src/main/java/dev/dnpm/oshelper/services/DefaultFormService.java index 9548202..e652ee5 100644 --- a/src/main/java/dev/dnpm/oshelper/services/DefaultFormService.java +++ b/src/main/java/dev/dnpm/oshelper/services/DefaultFormService.java @@ -20,10 +20,9 @@ package dev.dnpm.oshelper.services; import dev.dnpm.oshelper.exceptions.FormException; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; import java.util.List; +import javax.sql.DataSource; +import org.springframework.jdbc.core.JdbcTemplate; /** * Standardimplementierung zum Ermitteln von Unter- und Hauptformularen @@ -32,25 +31,27 @@ import java.util.List; */ public class DefaultFormService implements FormService { - private final JdbcTemplate jdbcTemplate; - - public DefaultFormService(final DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); - } - - @Override - public int getMainFormProcedureId(int procedureId) throws FormException { - var sql = "SELECT hauptprozedur_id FROM prozedur WHERE id = ?"; - try { - return jdbcTemplate.queryForObject(sql, (resultSet, i) -> resultSet.getInt("hauptprozedur_id"), procedureId); - } catch (Exception e) { - throw new FormException(String.format("No main form found for subform with ID '%d'", procedureId)); - } + private final JdbcTemplate jdbcTemplate; + + public DefaultFormService(final DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Override + public int getMainFormProcedureId(int procedureId) throws FormException { + var sql = "SELECT hauptprozedur_id FROM prozedur WHERE id = ?"; + try { + return jdbcTemplate.queryForObject( + sql, (resultSet, i) -> resultSet.getInt("hauptprozedur_id"), procedureId); + } catch (Exception e) { + throw new FormException( + String.format("No main form found for subform with ID '%d'", procedureId)); } + } - @Override - public List<Integer> getSubFormProcedureIds(int procedureId) { - var sql = "SELECT id FROM prozedur WHERE hauptprozedur_id = ?"; - return jdbcTemplate.queryForList(sql, Integer.class, procedureId); - } + @Override + public List<Integer> getSubFormProcedureIds(int procedureId) { + var sql = "SELECT id FROM prozedur WHERE hauptprozedur_id = ?"; + return jdbcTemplate.queryForList(sql, Integer.class, procedureId); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/DefaultStudienService.java b/src/main/java/dev/dnpm/oshelper/services/DefaultStudienService.java index 463c1e9..2366c10 100644 --- a/src/main/java/dev/dnpm/oshelper/services/DefaultStudienService.java +++ b/src/main/java/dev/dnpm/oshelper/services/DefaultStudienService.java @@ -20,11 +20,10 @@ package dev.dnpm.oshelper.services; import dev.dnpm.oshelper.dto.Studie; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; import java.util.List; import java.util.stream.Collectors; +import javax.sql.DataSource; +import org.springframework.jdbc.core.JdbcTemplate; /** * Standardimplementierung zum Ermitteln von Studien @@ -33,65 +32,72 @@ import java.util.stream.Collectors; */ public class DefaultStudienService implements StudienService { - private final JdbcTemplate jdbcTemplate; + private final JdbcTemplate jdbcTemplate; - public DefaultStudienService(final DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); - } + public DefaultStudienService(final DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } - @Override - public List<Studie> findAll() { - var sql = "SELECT pcc.name, pcv.version_number, TRIM(studie.studien_nummer) AS studien_nummer, studie.startdatum, studie.endedatum, pcve.code, pcve.shortdesc, pcve.description, studie.aktiv FROM studie " - + "LEFT JOIN category_entry ce ON ce.version_entry_id = studie.property_version_entry " - + "LEFT JOIN property_catalogue_category pcc ON pcc.id = ce.category_id " - + "JOIN property_catalogue_version_entry pcve ON pcve.id = studie.property_version_entry " - + "JOIN property_catalogue_version pcv ON pcv.id = pcve.property_version_id " - + "JOIN property_catalogue pc ON pc.id = pcv.datacatalog_id " - + "WHERE pc.name = 'OS.Studien'" - + "ORDER BY TRIM(studie.studien_nummer)"; + @Override + public List<Studie> findAll() { + var sql = + "SELECT pcc.name, pcv.version_number, TRIM(studie.studien_nummer) AS studien_nummer, studie.startdatum, studie.endedatum, pcve.code, pcve.shortdesc, pcve.description, studie.aktiv FROM studie " + + "LEFT JOIN category_entry ce ON ce.version_entry_id = studie.property_version_entry " + + "LEFT JOIN property_catalogue_category pcc ON pcc.id = ce.category_id " + + "JOIN property_catalogue_version_entry pcve ON pcve.id = studie.property_version_entry " + + "JOIN property_catalogue_version pcv ON pcv.id = pcve.property_version_id " + + "JOIN property_catalogue pc ON pc.id = pcv.datacatalog_id " + + "WHERE pc.name = 'OS.Studien'" + + "ORDER BY TRIM(studie.studien_nummer)"; - return this.jdbcTemplate.query(sql, (resultSet, i) -> new Studie( + return this.jdbcTemplate.query( + sql, + (resultSet, i) -> + new Studie( resultSet.getString("name"), resultSet.getInt("version_number"), resultSet.getString("code"), resultSet.getString("studien_nummer"), resultSet.getString("shortdesc"), resultSet.getString("description"), - resultSet.getBoolean("aktiv") - )); - } + resultSet.getBoolean("aktiv"))); + } - @Override - public List<Studie> findByQuery(String query) { - var sql = "SELECT pcc.name, pcv.version_number, TRIM(studie.studien_nummer) AS studien_nummer, studie.startdatum, studie.endedatum, pcve.code, pcve.shortdesc, pcve.description, studie.aktiv FROM studie " - + "LEFT JOIN category_entry ce ON ce.version_entry_id = studie.property_version_entry " - + "LEFT JOIN property_catalogue_category pcc ON pcc.id = ce.category_id " - + "JOIN property_catalogue_version_entry pcve ON pcve.id = studie.property_version_entry " - + "JOIN property_catalogue_version pcv ON pcv.id = pcve.property_version_id " - + "JOIN property_catalogue pc ON pc.id = pcv.datacatalog_id " - + "WHERE pc.name = 'OS.Studien' AND (pcve.shortdesc LIKE ? OR pcve.description LIKE ? OR studie.studien_nummer LIKE ?)" - + "ORDER BY TRIM(studie.studien_nummer)"; + @Override + public List<Studie> findByQuery(String query) { + var sql = + "SELECT pcc.name, pcv.version_number, TRIM(studie.studien_nummer) AS studien_nummer, studie.startdatum, studie.endedatum, pcve.code, pcve.shortdesc, pcve.description, studie.aktiv FROM studie " + + "LEFT JOIN category_entry ce ON ce.version_entry_id = studie.property_version_entry " + + "LEFT JOIN property_catalogue_category pcc ON pcc.id = ce.category_id " + + "JOIN property_catalogue_version_entry pcve ON pcve.id = studie.property_version_entry " + + "JOIN property_catalogue_version pcv ON pcv.id = pcve.property_version_id " + + "JOIN property_catalogue pc ON pc.id = pcv.datacatalog_id " + + "WHERE pc.name = 'OS.Studien' AND (pcve.shortdesc LIKE ? OR pcve.description LIKE ? OR studie.studien_nummer LIKE ?)" + + "ORDER BY TRIM(studie.studien_nummer)"; - var like = String.format("%%%s%%", query); + var like = String.format("%%%s%%", query); - return this.jdbcTemplate.query(sql, new Object[]{like, like, like}, (resultSet, i) -> new Studie( + return this.jdbcTemplate.query( + sql, + new Object[] {like, like, like}, + (resultSet, i) -> + new Studie( resultSet.getString("name"), resultSet.getInt("version_number"), resultSet.getString("code"), resultSet.getString("studien_nummer"), resultSet.getString("shortdesc"), resultSet.getString("description"), - resultSet.getBoolean("aktiv") - )); - } + resultSet.getBoolean("aktiv"))); + } - @Override - public List<Studie> findActive() { - return findAll().stream().filter(Studie::isActive).collect(Collectors.toList()); - } + @Override + public List<Studie> findActive() { + return findAll().stream().filter(Studie::isActive).collect(Collectors.toList()); + } - @Override - public List<Studie> findActiveByQuery(String query) { - return findByQuery(query).stream().filter(Studie::isActive).collect(Collectors.toList()); - } + @Override + public List<Studie> findActiveByQuery(String query) { + return findByQuery(query).stream().filter(Studie::isActive).collect(Collectors.toList()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/FormService.java b/src/main/java/dev/dnpm/oshelper/services/FormService.java index 1e89d57..f48dcd2 100644 --- a/src/main/java/dev/dnpm/oshelper/services/FormService.java +++ b/src/main/java/dev/dnpm/oshelper/services/FormService.java @@ -19,52 +19,53 @@ package dev.dnpm.oshelper.services; -import dev.dnpm.oshelper.exceptions.FormException; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.constants.JaNeinUnbekannt; - +import dev.dnpm.oshelper.exceptions.FormException; import java.util.List; public interface FormService { - /** - * Diese Methode übergibt die Prozedur-ID des zugehörigen Hauptformulars zu einem Unterformular - * Siehe auch: <a href="https://github.com/CCC-MF/onkostar-plugin-forminfo/blob/master/src/main/java/de/ukw/ccc/onkostar/forminfo/services/FormInfoService.java">FormInfoService.java</a> - * - * @param procedureId Die Prozedur-ID des Unterformulars - * @return Die Prozedur-ID des zugehörigen Hauptformulars - * @throws FormException Wird geworfen, wenn ein Fehler auftrat - */ - int getMainFormProcedureId(int procedureId) throws FormException; - - /** - * Diese Methode übergibt die Prozedur-IDs von Unterformularen zu einem Formular - * Siehe auch: <a href="https://github.com/CCC-MF/onkostar-plugin-forminfo/blob/master/src/main/java/de/ukw/ccc/onkostar/forminfo/services/FormInfoService.java">FormInfoService.java</a> - * - * @param procedureId Die Prozedur-ID des Formulars - * @return Eine Liste mit Prozedur-IDs der Unterformulare - */ - List<Integer> getSubFormProcedureIds(int procedureId); + /** + * Diese Methode übergibt die Prozedur-ID des zugehörigen Hauptformulars zu einem Unterformular + * Siehe auch: <a + * href="https://github.com/CCC-MF/onkostar-plugin-forminfo/blob/master/src/main/java/de/ukw/ccc/onkostar/forminfo/services/FormInfoService.java">FormInfoService.java</a> + * + * @param procedureId Die Prozedur-ID des Unterformulars + * @return Die Prozedur-ID des zugehörigen Hauptformulars + * @throws FormException Wird geworfen, wenn ein Fehler auftrat + */ + int getMainFormProcedureId(int procedureId) throws FormException; - /** - * Prüft, ob ein Formularfeld in der Prozedur einen Wert hat oder null ist - * @param procedure Die zu prüfende Prozedur - * @param fieldName Der Formularfeldname - * @return Gibt <code>true</code> zurück, wenn das Feld einen Wert hat - */ - static boolean hasValue(final Procedure procedure, final String fieldName) { - return null != procedure.getValue(fieldName); - } + /** + * Diese Methode übergibt die Prozedur-IDs von Unterformularen zu einem Formular Siehe auch: <a + * href="https://github.com/CCC-MF/onkostar-plugin-forminfo/blob/master/src/main/java/de/ukw/ccc/onkostar/forminfo/services/FormInfoService.java">FormInfoService.java</a> + * + * @param procedureId Die Prozedur-ID des Formulars + * @return Eine Liste mit Prozedur-IDs der Unterformulare + */ + List<Integer> getSubFormProcedureIds(int procedureId); - /** - * Prüft, ob ein Formularfeld mit Ja/Nein/Unbekannt den Wert Ja hat - * @param procedure Die zu prüfende Prozedur - * @param fieldName Der Formularfeldname - * @return Gibt <code>true</code> zurück, wenn das Feld den Wert "Ja" hat - */ - static boolean isYes(final Procedure procedure, final String fieldName) { - return hasValue(procedure, fieldName) - && procedure.getValue(fieldName).getString().equals(JaNeinUnbekannt.JA.getCode()); - } + /** + * Prüft, ob ein Formularfeld in der Prozedur einen Wert hat oder null ist + * + * @param procedure Die zu prüfende Prozedur + * @param fieldName Der Formularfeldname + * @return Gibt <code>true</code> zurück, wenn das Feld einen Wert hat + */ + static boolean hasValue(final Procedure procedure, final String fieldName) { + return null != procedure.getValue(fieldName); + } + /** + * Prüft, ob ein Formularfeld mit Ja/Nein/Unbekannt den Wert Ja hat + * + * @param procedure Die zu prüfende Prozedur + * @param fieldName Der Formularfeldname + * @return Gibt <code>true</code> zurück, wenn das Feld den Wert "Ja" hat + */ + static boolean isYes(final Procedure procedure, final String fieldName) { + return hasValue(procedure, fieldName) + && procedure.getValue(fieldName).getString().equals(JaNeinUnbekannt.JA.getCode()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/SettingsService.java b/src/main/java/dev/dnpm/oshelper/services/SettingsService.java index 61ef193..82dfcfc 100644 --- a/src/main/java/dev/dnpm/oshelper/services/SettingsService.java +++ b/src/main/java/dev/dnpm/oshelper/services/SettingsService.java @@ -20,48 +20,50 @@ package dev.dnpm.oshelper.services; import dev.dnpm.oshelper.database.SettingsRepository; - import java.util.Optional; -/** - * Implementiert den Dienst zur Ermittlung von Systemeinstellungen - */ +/** Implementiert den Dienst zur Ermittlung von Systemeinstellungen */ public class SettingsService { - private final SettingsRepository settingsRepository; + private final SettingsRepository settingsRepository; - public SettingsService(final SettingsRepository settingsRepository) { - this.settingsRepository = settingsRepository; - } + public SettingsService(final SettingsRepository settingsRepository) { + this.settingsRepository = settingsRepository; + } - /** - * Übergibt ein <code>Optional</code> 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<String> getSetting(String name) { - var sid = settingsRepository.findByName(name); - if (null == sid) { - return Optional.empty(); - } - return Optional.of(sid.getValue()); + /** + * Übergibt ein <code>Optional</code> 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<String> getSetting(String name) { + var sid = settingsRepository.findByName(name); + if (null == sid) { + return Optional.empty(); } + return Optional.of(sid.getValue()); + } - /** - * Übergibt die SID als <code>Optional</code> - * @return Optional mit Wert der SID - */ - public Optional<String> getSID() { - return getSetting("SID"); - } + /** + * Übergibt die SID als <code>Optional</code> + * + * @return Optional mit Wert der SID + */ + public Optional<String> getSID() { + return getSetting("SID"); + } - /** - * Übergibt die Einstellung für <code>mehrere_mtb_in_mtbepisode</code> - * @return Übergibt <code>true</code>, wenn <code>mehrere_mtb_in_mtbepisode</code> auf "Ja" gesetzt ist. - */ - @Deprecated(since = "2.1.0", forRemoval = true) - public boolean multipleMtbsInMtbEpisode() { - var setting = getSetting("mehrere_mtb_in_mtbepisode"); - return setting.isPresent() && setting.get().equals("true"); - } + /** + * Übergibt die Einstellung für <code>mehrere_mtb_in_mtbepisode</code> + * + * @return Übergibt <code>true</code>, wenn <code>mehrere_mtb_in_mtbepisode</code> auf "Ja" + * gesetzt ist. + */ + @Deprecated(since = "2.1.0", forRemoval = true) + public boolean multipleMtbsInMtbEpisode() { + var setting = getSetting("mehrere_mtb_in_mtbepisode"); + return setting.isPresent() && setting.get().equals("true"); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/StudienService.java b/src/main/java/dev/dnpm/oshelper/services/StudienService.java index 0e0314e..f39c7e9 100644 --- a/src/main/java/dev/dnpm/oshelper/services/StudienService.java +++ b/src/main/java/dev/dnpm/oshelper/services/StudienService.java @@ -20,39 +20,39 @@ package dev.dnpm.oshelper.services; import dev.dnpm.oshelper.dto.Studie; - import java.util.List; public interface StudienService { - /** - * Übergibt eine Liste mit allen Studien - * - * @return Liste mit allen Studien - */ - List<Studie> findAll(); - - /** - * Übergibt eine Liste mit Studien, deren (Kurz-)Beschreibung oder Studiennummer den übergebenen Wert enthalten - * - * @param query Wert der enthalten sein muss - * @return Gefilterte Liste mit Studien - */ - List<Studie> findByQuery(String query); - - /** - * Übergibt eine Liste mit aktiven Studien - * - * @return Liste mit aktiven Studien - */ - List<Studie> findActive(); - - /** - * Übergibt eine Liste mit aktiven Studien, deren (Kurz-)Beschreibung oder Studiennummer den übergebenen Wert enthalten - * - * @param query Wert der enthalten sein muss - * @return Gefilterte Liste mit aktiven Studien - */ - List<Studie> findActiveByQuery(String query); - + /** + * Übergibt eine Liste mit allen Studien + * + * @return Liste mit allen Studien + */ + List<Studie> findAll(); + + /** + * Übergibt eine Liste mit Studien, deren (Kurz-)Beschreibung oder Studiennummer den übergebenen + * Wert enthalten + * + * @param query Wert der enthalten sein muss + * @return Gefilterte Liste mit Studien + */ + List<Studie> findByQuery(String query); + + /** + * Übergibt eine Liste mit aktiven Studien + * + * @return Liste mit aktiven Studien + */ + List<Studie> findActive(); + + /** + * Übergibt eine Liste mit aktiven Studien, deren (Kurz-)Beschreibung oder Studiennummer den + * übergebenen Wert enthalten + * + * @param query Wert der enthalten sein muss + * @return Gefilterte Liste mit aktiven Studien + */ + List<Studie> findActiveByQuery(String query); } diff --git a/src/main/java/dev/dnpm/oshelper/services/TherapieMitEcogService.java b/src/main/java/dev/dnpm/oshelper/services/TherapieMitEcogService.java index 5ae1093..3353e41 100644 --- a/src/main/java/dev/dnpm/oshelper/services/TherapieMitEcogService.java +++ b/src/main/java/dev/dnpm/oshelper/services/TherapieMitEcogService.java @@ -19,31 +19,31 @@ package dev.dnpm.oshelper.services; -import dev.dnpm.oshelper.dto.EcogStatusWithDate; import de.itc.onkostar.api.Patient; - +import dev.dnpm.oshelper.dto.EcogStatusWithDate; import java.util.List; import java.util.Optional; /** * Schnittstelle zum Ermitteln von ECOG-Statusinformationen * - * @since 0.6.0 + * @since 0.6.0 */ public interface TherapieMitEcogService { - /** - * Ermittelt den letzten bekannten ECOG-Status aus allen Therapieformularen des Patienten - * @param patient Der zu verwendende Patient - * @return Der ECOG-Status als String oder leeres Optional - */ - Optional<String> latestEcogStatus(Patient patient); - - /** - * Ermittelt jeden bekannten ECOG-Status aus allen Therapieformularen des Patienten - * @param patient Der zu verwendende Patient - * @return Eine Liste mit Datum und ECOG-Status als String - */ - List<EcogStatusWithDate> ecogStatus(Patient patient); + /** + * Ermittelt den letzten bekannten ECOG-Status aus allen Therapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Der ECOG-Status als String oder leeres Optional + */ + Optional<String> latestEcogStatus(Patient patient); + /** + * Ermittelt jeden bekannten ECOG-Status aus allen Therapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Eine Liste mit Datum und ECOG-Status als String + */ + List<EcogStatusWithDate> ecogStatus(Patient patient); } diff --git a/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerService.java b/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerService.java index 0a3346a..edfeddd 100644 --- a/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerService.java +++ b/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerService.java @@ -29,19 +29,20 @@ import de.itc.onkostar.api.Procedure; @Deprecated(forRemoval = true, since = "2.0.0") public interface ConsentManagerService { - /** - * Wende Consent an, wenn dieses Consent-Formular gespeichert wird - * @param procedure Prozedur des Consent-Formulars - */ - void applyConsent(Procedure procedure); - - /** - * Optionale Prüfung, ob die angegebene Prozedur angewendet werden kann. - * @param procedure Anzuwendende Prozedur - * @return Gibt <code>true</code> zurück, wenn die Prozedur angewendet werden kann. - */ - default boolean canApply(Procedure procedure) { - return null != procedure; - } + /** + * Wende Consent an, wenn dieses Consent-Formular gespeichert wird + * + * @param procedure Prozedur des Consent-Formulars + */ + void applyConsent(Procedure procedure); + /** + * Optionale Prüfung, ob die angegebene Prozedur angewendet werden kann. + * + * @param procedure Anzuwendende Prozedur + * @return Gibt <code>true</code> zurück, wenn die Prozedur angewendet werden kann. + */ + default boolean canApply(Procedure procedure) { + return null != procedure; + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactory.java b/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactory.java index 3f548a0..81d864b 100644 --- a/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactory.java +++ b/src/main/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactory.java @@ -24,25 +24,22 @@ import de.itc.onkostar.api.IOnkostarApi; @Deprecated(forRemoval = true, since = "2.0.0") public class ConsentManagerServiceFactory { - private final IOnkostarApi onkostarApi; - - public ConsentManagerServiceFactory( - final IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; + private final IOnkostarApi onkostarApi; + + public ConsentManagerServiceFactory(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } + + public ConsentManagerService currentUsableInstance() { + var consentFormName = onkostarApi.getGlobalSetting("consentform"); + + switch (consentFormName) { + case "Excel-Formular": + return new UkwConsentManagerService(this.onkostarApi); + case "MR.Consent": + return new MrConsentManagerService(this.onkostarApi); + default: + return procedure -> {}; } - - public ConsentManagerService currentUsableInstance() { - var consentFormName = onkostarApi.getGlobalSetting("consentform"); - - switch (consentFormName) { - case "Excel-Formular": - return new UkwConsentManagerService(this.onkostarApi); - case "MR.Consent": - return new MrConsentManagerService(this.onkostarApi); - default: - return procedure -> {}; - } - } - + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/consent/MrConsentManagerService.java b/src/main/java/dev/dnpm/oshelper/services/consent/MrConsentManagerService.java index ca2cba5..c01568a 100644 --- a/src/main/java/dev/dnpm/oshelper/services/consent/MrConsentManagerService.java +++ b/src/main/java/dev/dnpm/oshelper/services/consent/MrConsentManagerService.java @@ -19,10 +19,12 @@ package dev.dnpm.oshelper.services.consent; -import dev.dnpm.oshelper.VerweisVon; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import dev.dnpm.oshelper.VerweisVon; +import java.util.List; +import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -31,9 +33,6 @@ import org.hibernate.type.StandardBasicTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Map; - /** * Detailimplementierung für das Formular `MR.Consent` * @@ -42,105 +41,113 @@ import java.util.Map; @Deprecated(forRemoval = true, since = "2.0.0") public class MrConsentManagerService implements ConsentManagerService { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final IOnkostarApi onkostarApi; - - public MrConsentManagerService(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } - - @Override - public boolean canApply(Procedure procedure) { - return null != procedure && procedure.getFormName().equals("MR.Consent"); - } - - /** - * Wende Consent an, wenn dieses Consent-Formular gespeichert wird - * - * @param procedure Prozedur des Consent-Formulars - */ - @Override - public void applyConsent(Procedure procedure) { - int value = 0; - try { - SessionFactory sessionFactory = onkostarApi.getSessionFactory(); - Session session = sessionFactory.getCurrentSession(); - // geänderte Werte checken - String sql1 = "select id, max(timestamp) AS datum from aenderungsprotokoll where entity_id = '" + procedure.getId() + "'"; - SQLQuery query1 = session.createSQLQuery(sql1) - .addScalar("id", StandardBasicTypes.INTEGER) - .addScalar("datum", StandardBasicTypes.TIMESTAMP); - logger.info("Wert-Check: {}", query1.uniqueResult()); - - String sql = "SELECT prozedur.id AS procedure_id, prozedur.data_form_id, data_catalogue.name AS data_catalogue, data_catalogue_entry.name AS data_catalogue_entry, data_form.description AS formname, prozedur.beginndatum AS datum " + - "FROM prozedur " + - "LEFT JOIN data_form_data_catalogue ON data_form_data_catalogue.data_form_id = prozedur.data_form_id " + - "LEFT JOIN data_catalogue_entry ON data_catalogue_entry.data_catalogue_id = data_form_data_catalogue.data_catalogue_id " + - "LEFT JOIN data_catalogue ON data_catalogue.id = data_catalogue_entry.data_catalogue_id " + - "LEFT JOIN data_form ON data_form.id = prozedur.data_form_id " + - "WHERE patient_id = " + procedure.getPatientId() + " " + - "AND geloescht = 0 " + - "AND data_catalogue_entry.type = 'formReference' " + - "GROUP BY prozedur.id, prozedur.data_form_id, data_catalogue.name, data_catalogue_entry.name"; - - SQLQuery query = session.createSQLQuery(sql) - .addScalar("procedure_id", StandardBasicTypes.INTEGER) - .addScalar("data_form_id", StandardBasicTypes.INTEGER) - .addScalar("data_catalogue", StandardBasicTypes.STRING) - .addScalar("data_catalogue_entry", StandardBasicTypes.STRING) - .addScalar("formname", StandardBasicTypes.STRING) - .addScalar("datum", StandardBasicTypes.DATE); - - query.setResultTransformer(Transformers.aliasToBean(VerweisVon.class)); - - @SuppressWarnings("unchecked") - List<VerweisVon> result = query.list(); - - for (VerweisVon verweisVon : result) { - sql = verweisVon.getSQL(); - query = session.createSQLQuery(sql) - .addScalar("value", StandardBasicTypes.INTEGER); - if (query.uniqueResult() != null) { - value = (Integer) query.uniqueResult(); - } - if (value == procedure.getId()) { - saveReferencedProcedure(procedure, verweisVon); - value = 0; - } - } - } catch (RuntimeException e) { - logger.error("Sonstiger Fehler bei der Ausführung von analyze()", e); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final IOnkostarApi onkostarApi; + + public MrConsentManagerService(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } + + @Override + public boolean canApply(Procedure procedure) { + return null != procedure && procedure.getFormName().equals("MR.Consent"); + } + + /** + * Wende Consent an, wenn dieses Consent-Formular gespeichert wird + * + * @param procedure Prozedur des Consent-Formulars + */ + @Override + public void applyConsent(Procedure procedure) { + int value = 0; + try { + SessionFactory sessionFactory = onkostarApi.getSessionFactory(); + Session session = sessionFactory.getCurrentSession(); + // geänderte Werte checken + String sql1 = + "select id, max(timestamp) AS datum from aenderungsprotokoll where entity_id = '" + + procedure.getId() + + "'"; + SQLQuery query1 = + session + .createSQLQuery(sql1) + .addScalar("id", StandardBasicTypes.INTEGER) + .addScalar("datum", StandardBasicTypes.TIMESTAMP); + logger.info("Wert-Check: {}", query1.uniqueResult()); + + String sql = + "SELECT prozedur.id AS procedure_id, prozedur.data_form_id, data_catalogue.name AS data_catalogue, data_catalogue_entry.name AS data_catalogue_entry, data_form.description AS formname, prozedur.beginndatum AS datum " + + "FROM prozedur " + + "LEFT JOIN data_form_data_catalogue ON data_form_data_catalogue.data_form_id = prozedur.data_form_id " + + "LEFT JOIN data_catalogue_entry ON data_catalogue_entry.data_catalogue_id = data_form_data_catalogue.data_catalogue_id " + + "LEFT JOIN data_catalogue ON data_catalogue.id = data_catalogue_entry.data_catalogue_id " + + "LEFT JOIN data_form ON data_form.id = prozedur.data_form_id " + + "WHERE patient_id = " + + procedure.getPatientId() + + " " + + "AND geloescht = 0 " + + "AND data_catalogue_entry.type = 'formReference' " + + "GROUP BY prozedur.id, prozedur.data_form_id, data_catalogue.name, data_catalogue_entry.name"; + + SQLQuery query = + session + .createSQLQuery(sql) + .addScalar("procedure_id", StandardBasicTypes.INTEGER) + .addScalar("data_form_id", StandardBasicTypes.INTEGER) + .addScalar("data_catalogue", StandardBasicTypes.STRING) + .addScalar("data_catalogue_entry", StandardBasicTypes.STRING) + .addScalar("formname", StandardBasicTypes.STRING) + .addScalar("datum", StandardBasicTypes.DATE); + + query.setResultTransformer(Transformers.aliasToBean(VerweisVon.class)); + + @SuppressWarnings("unchecked") + List<VerweisVon> result = query.list(); + + for (VerweisVon verweisVon : result) { + sql = verweisVon.getSQL(); + query = session.createSQLQuery(sql).addScalar("value", StandardBasicTypes.INTEGER); + if (query.uniqueResult() != null) { + value = (Integer) query.uniqueResult(); + } + if (value == procedure.getId()) { + saveReferencedProcedure(procedure, verweisVon); + value = 0; } + } + } catch (RuntimeException e) { + logger.error("Sonstiger Fehler bei der Ausführung von analyze()", e); } - - private void saveReferencedProcedure(Procedure prozedur, VerweisVon verweisVon) { - Procedure andereprozedur = onkostarApi.getProcedure(verweisVon.getProcedure_id()); - try { - Map<String, Item> felder = prozedur.getAllValues(); - for (Map.Entry<String, Item> feld : felder.entrySet()) { - if (feld.getKey().startsWith("Consent")) { - if (feld.getKey().equals("ConsentStatusEinwilligungDNPM")) { - switch (feld.getValue().getValue().toString()) { - case "z": - andereprozedur.setValue(feld.getKey(), new Item(feld.getKey(), "active")); - break; - case "a": - case "w": - andereprozedur.setValue(feld.getKey(), new Item(feld.getKey(), "rejected")); - break; - default: - break; - } - } else { - andereprozedur.setValue(feld.getKey(), prozedur.getValue(feld.getKey())); - } - } + } + + private void saveReferencedProcedure(Procedure prozedur, VerweisVon verweisVon) { + Procedure andereprozedur = onkostarApi.getProcedure(verweisVon.getProcedure_id()); + try { + Map<String, Item> felder = prozedur.getAllValues(); + for (Map.Entry<String, Item> feld : felder.entrySet()) { + if (feld.getKey().startsWith("Consent")) { + if (feld.getKey().equals("ConsentStatusEinwilligungDNPM")) { + switch (feld.getValue().getValue().toString()) { + case "z": + andereprozedur.setValue(feld.getKey(), new Item(feld.getKey(), "active")); + break; + case "a": + case "w": + andereprozedur.setValue(feld.getKey(), new Item(feld.getKey(), "rejected")); + break; + default: + break; } - onkostarApi.saveProcedure(andereprozedur); - } catch (Exception e) { - logger.error("Kann Prozedur nicht speichern", e); + } else { + andereprozedur.setValue(feld.getKey(), prozedur.getValue(feld.getKey())); + } } + } + onkostarApi.saveProcedure(andereprozedur); + } catch (Exception e) { + logger.error("Kann Prozedur nicht speichern", e); } - + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerService.java b/src/main/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerService.java index fdf4f7b..32f7219 100644 --- a/src/main/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerService.java +++ b/src/main/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerService.java @@ -22,11 +22,10 @@ package dev.dnpm.oshelper.services.consent; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.util.Comparator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Comparator; - /** * Detailimplementierung für das Formular `Excel-Formular` * @@ -35,58 +34,60 @@ import java.util.Comparator; @Deprecated(forRemoval = true, since = "2.0.0") public class UkwConsentManagerService implements ConsentManagerService { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - public UkwConsentManagerService(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } + public UkwConsentManagerService(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } - @Override - public boolean canApply(Procedure procedure) { - return null != procedure && procedure.getFormName().equals("Excel-Formular"); - } + @Override + public boolean canApply(Procedure procedure) { + return null != procedure && procedure.getFormName().equals("Excel-Formular"); + } - /** - * Wende Consent an, wenn dieses Consent-Formular gespeichert wird - * - * @param procedure Prozedur des Consent-Formulars - */ - @Override - public void applyConsent(Procedure procedure) { - var refdnpmklinikanamnese = procedure.getValue("refdnpmklinikanamnese").getInt(); - var dnpmKlinikAnamnese = this.onkostarApi.getProcedure(refdnpmklinikanamnese); + /** + * Wende Consent an, wenn dieses Consent-Formular gespeichert wird + * + * @param procedure Prozedur des Consent-Formulars + */ + @Override + public void applyConsent(Procedure procedure) { + var refdnpmklinikanamnese = procedure.getValue("refdnpmklinikanamnese").getInt(); + var dnpmKlinikAnamnese = this.onkostarApi.getProcedure(refdnpmklinikanamnese); - if (null == dnpmKlinikAnamnese) { - return; - } - - var consents = procedure.getSubProceduresMap().get("ufdnpmconsent"); - - if (null == consents) { - return; - } - - consents.stream() - .max(Comparator.comparing(Procedure::getStartDate)) - .ifPresent(lastConsent -> { - var date = lastConsent.getStartDate(); - var status = lastConsent.getValue("status"); - if (null == date || null == status || status.getString().isBlank()) { - logger.warn("Kein DNPM-Einwilligungstatus angegeben"); - return; - } + if (null == dnpmKlinikAnamnese) { + return; + } - dnpmKlinikAnamnese.setValue("ConsentStatusEinwilligungDNPM", new Item("Einwilligung", status.getString())); - dnpmKlinikAnamnese.setValue("ConsentDatumEinwilligungDNPM", new Item("DatumEinwilligung", date)); + var consents = procedure.getSubProceduresMap().get("ufdnpmconsent"); - try { - onkostarApi.saveProcedure(dnpmKlinikAnamnese, false); - } catch (Exception e) { - logger.error("Kann DNPM-Einwilligungstatus nicht aktualisieren", e); - } - }); + if (null == consents) { + return; } + consents.stream() + .max(Comparator.comparing(Procedure::getStartDate)) + .ifPresent( + lastConsent -> { + var date = lastConsent.getStartDate(); + var status = lastConsent.getValue("status"); + if (null == date || null == status || status.getString().isBlank()) { + logger.warn("Kein DNPM-Einwilligungstatus angegeben"); + return; + } + + dnpmKlinikAnamnese.setValue( + "ConsentStatusEinwilligungDNPM", new Item("Einwilligung", status.getString())); + dnpmKlinikAnamnese.setValue( + "ConsentDatumEinwilligungDNPM", new Item("DatumEinwilligung", date)); + + try { + onkostarApi.saveProcedure(dnpmKlinikAnamnese, false); + } catch (Exception e) { + logger.error("Kann DNPM-Einwilligungstatus nicht aktualisieren", e); + } + }); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/MolekulargenetikFormService.java b/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/MolekulargenetikFormService.java index 8216818..19cbc4c 100644 --- a/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/MolekulargenetikFormService.java +++ b/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/MolekulargenetikFormService.java @@ -19,21 +19,19 @@ package dev.dnpm.oshelper.services.molekulargenetik; -import dev.dnpm.oshelper.dto.Variant; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.dto.Variant; import java.util.List; -/** - * Schnittstellenbeschreibung für Methoden zum Formular "OS.Molekulargenetik" - */ +/** Schnittstellenbeschreibung für Methoden zum Formular "OS.Molekulargenetik" */ public interface MolekulargenetikFormService { - /** - * Ermittelt alle (unterstützten) Varianten zur Prozedur eines Formulars "OS.Molekulargenetik" - * @param procedure Die Prozedur zum Formular "OS.Molekulargenetik" - * @return Die unterstützten Varianten oder eine leere Liste, wenn keine Varianten gefunden wurden. - */ - List<Variant> getVariants(Procedure procedure); - + /** + * Ermittelt alle (unterstützten) Varianten zur Prozedur eines Formulars "OS.Molekulargenetik" + * + * @param procedure Die Prozedur zum Formular "OS.Molekulargenetik" + * @return Die unterstützten Varianten oder eine leere Liste, wenn keine Varianten gefunden + * wurden. + */ + List<Variant> getVariants(Procedure procedure); } diff --git a/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekulargenetikFormService.java b/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekulargenetikFormService.java index 71f2435..5111ac7 100644 --- a/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekulargenetikFormService.java +++ b/src/main/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekulargenetikFormService.java @@ -19,46 +19,47 @@ package dev.dnpm.oshelper.services.molekulargenetik; -import dev.dnpm.oshelper.dto.Variant; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.dto.Variant; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class OsMolekulargenetikFormService implements MolekulargenetikFormService { - /** - * Ermittelt alle (unterstützten) Varianten zur Prozedur eines Formulars "OS.Molekulargenetik" (oder Variante) - * Unterstützte Varianten sind: - * <uL> - * <li>Einfache Variante - * <li>CNV - * <li>Fusion - * @param procedure Die Prozedur zum Formular "OS.Molekulargenetik" (oder Variante) - * @return Die unterstützten Varianten oder eine leere Liste, wenn keine Varianten gefunden wurden. - */ - @Override - public List<Variant> getVariants(Procedure procedure) { - if (! procedureWithUsableFormVariant(procedure)) { - return List.of(); - } - - var subforms = procedure.getSubProceduresMap().get("MolekulargenetischeUntersuchung"); - if (null == subforms) { - return List.of(); - } - - return subforms.stream() - .map(Variant::fromProcedure) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toList()); - + /** + * Ermittelt alle (unterstützten) Varianten zur Prozedur eines Formulars "OS.Molekulargenetik" + * (oder Variante) Unterstützte Varianten sind: + * + * <uL> + * <li>Einfache Variante + * <li>CNV + * <li>Fusion + * + * @param procedure Die Prozedur zum Formular "OS.Molekulargenetik" (oder Variante) + * @return Die unterstützten Varianten oder eine leere Liste, wenn keine Varianten gefunden + * wurden. + */ + @Override + public List<Variant> getVariants(Procedure procedure) { + if (!procedureWithUsableFormVariant(procedure)) { + return List.of(); } - private boolean procedureWithUsableFormVariant(Procedure procedure) { - return "OS.Molekulargenetik".equals(procedure.getFormName()) - || "UKER.Molekulargenetik".equals(procedure.getFormName()); + var subforms = procedure.getSubProceduresMap().get("MolekulargenetischeUntersuchung"); + if (null == subforms) { + return List.of(); } + + return subforms.stream() + .map(Variant::fromProcedure) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } + + private boolean procedureWithUsableFormVariant(Procedure procedure) { + return "OS.Molekulargenetik".equals(procedure.getFormName()) + || "UKER.Molekulargenetik".equals(procedure.getFormName()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapper.java b/src/main/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapper.java index 03532d6..53d4620 100644 --- a/src/main/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapper.java @@ -21,7 +21,6 @@ package dev.dnpm.oshelper.services.mtb; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; - import java.util.ArrayList; import java.util.Comparator; import java.util.Optional; @@ -29,55 +28,56 @@ import java.util.Optional; @Deprecated(forRemoval = true, since = "2.1.0") public class MrMtbAnmeldungToProtocolMapper implements ProcedureToProtocolMapper { - private final IOnkostarApi onkostarApi; - - public MrMtbAnmeldungToProtocolMapper(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } + private final IOnkostarApi onkostarApi; - /** - * Wandelt eine Prozedur mit Formularnamen "MR.MTB_Anmeldung" in ein {@link Optional} mit einer - * Zeichenkette oder im Fehlerfall in ein leeres Optional um. - * - * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. - * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. - */ - @Override - public Optional<String> apply(Procedure procedure) { - if ((!procedure.getFormName().equals("MR.MTB_Anmeldung"))) { - throw new AssertionError("Procedure is not of form type 'MR.MTB_Anmeldung'"); - } + public MrMtbAnmeldungToProtocolMapper(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + } - var resultParts = new ArrayList<String>(); + /** + * Wandelt eine Prozedur mit Formularnamen "MR.MTB_Anmeldung" in ein {@link Optional} mit einer + * Zeichenkette oder im Fehlerfall in ein leeres Optional um. + * + * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. + * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. + */ + @Override + public Optional<String> apply(Procedure procedure) { + if ((!procedure.getFormName().equals("MR.MTB_Anmeldung"))) { + throw new AssertionError("Procedure is not of form type 'MR.MTB_Anmeldung'"); + } - var fragestellung = procedure.getValue("Fragestellung"); - if (null != fragestellung && !fragestellung.getString().isBlank()) { - resultParts.add(String.format("Fragestellung:%n%s", fragestellung.getString())); - } + var resultParts = new ArrayList<String>(); - var refEmpfehlung = procedure.getValue("Empfehlung"); - if (null != refEmpfehlung && refEmpfehlung.getInt() > 0) { - var empfehlungsProzedur = onkostarApi.getProcedure(refEmpfehlung.getInt()); - var refEinzelempfehlungen = onkostarApi.getSubprocedures(empfehlungsProzedur.getId()); + var fragestellung = procedure.getValue("Fragestellung"); + if (null != fragestellung && !fragestellung.getString().isBlank()) { + resultParts.add(String.format("Fragestellung:%n%s", fragestellung.getString())); + } - if (null != refEinzelempfehlungen) { - refEinzelempfehlungen.stream() - .sorted(Comparator.comparingInt(proc -> proc.getValue("Prioritaet").getInt())) - .forEach(proc -> { - if (proc.getFormName().equals("MR.MTB_Einzelempfehlung")) { - var empfehlung = proc.getValue("Empfehlung"); - if (null != empfehlung && !empfehlung.getString().isBlank()) { - resultParts.add(String.format("Empfehlung:%n%s", empfehlung.getString())); - } - } - }); - } - } + var refEmpfehlung = procedure.getValue("Empfehlung"); + if (null != refEmpfehlung && refEmpfehlung.getInt() > 0) { + var empfehlungsProzedur = onkostarApi.getProcedure(refEmpfehlung.getInt()); + var refEinzelempfehlungen = onkostarApi.getSubprocedures(empfehlungsProzedur.getId()); - if (resultParts.isEmpty()) { - return Optional.empty(); - } + if (null != refEinzelempfehlungen) { + refEinzelempfehlungen.stream() + .sorted(Comparator.comparingInt(proc -> proc.getValue("Prioritaet").getInt())) + .forEach( + proc -> { + if (proc.getFormName().equals("MR.MTB_Einzelempfehlung")) { + var empfehlung = proc.getValue("Empfehlung"); + if (null != empfehlung && !empfehlung.getString().isBlank()) { + resultParts.add(String.format("Empfehlung:%n%s", empfehlung.getString())); + } + } + }); + } + } - return Optional.of(String.join("\n\n", resultParts)); + if (resultParts.isEmpty()) { + return Optional.empty(); } + + return Optional.of(String.join("\n\n", resultParts)); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapper.java b/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapper.java index cf992f8..67b3d81 100644 --- a/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapper.java @@ -20,10 +20,8 @@ package dev.dnpm.oshelper.services.mtb; import de.itc.onkostar.api.Procedure; - import java.util.Optional; - /** * Mapper zum Ermitteln des Protokollauszugs für Formular "OS.Tumorkonferenz" * @@ -32,32 +30,36 @@ import java.util.Optional; @Deprecated(forRemoval = true, since = "2.1.0") public class OsTumorkonferenzToProtocolMapper implements ProcedureToProtocolMapper { - /** - * Wandelt eine Prozedur mit Formularnamen "OS.Tumorkonferenz" in ein {@link Optional} mit einer - * Zeichenkette oder im Fehlerfall in ein leeres Optional um. - * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. - * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. - */ - @Override - public Optional<String> apply(Procedure procedure) { - if ((!procedure.getFormName().equals("OS.Tumorkonferenz"))) { - throw new AssertionError("Procedure is not of form type 'OS.Tumorkonferenz'"); - } - - var fragestellung = procedure.getValue("Fragestellung"); - var empfehlung = procedure.getValue("Empfehlung"); + /** + * Wandelt eine Prozedur mit Formularnamen "OS.Tumorkonferenz" in ein {@link Optional} mit einer + * Zeichenkette oder im Fehlerfall in ein leeres Optional um. + * + * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. + * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. + */ + @Override + public Optional<String> apply(Procedure procedure) { + if ((!procedure.getFormName().equals("OS.Tumorkonferenz"))) { + throw new AssertionError("Procedure is not of form type 'OS.Tumorkonferenz'"); + } - if ( - null != fragestellung && !fragestellung.getString().isBlank() - && null != empfehlung && !empfehlung.getString().isBlank() - ) { - return Optional.of(String.format("Fragestellung:%n%s%n%nEmpfehlung:%n%s", fragestellung.getString(), empfehlung.getString())); - } else if (null != fragestellung && !fragestellung.getString().isBlank()) { - return Optional.of(fragestellung.getString()); - } else if (null != empfehlung && !empfehlung.getString().isBlank()) { - return Optional.of(empfehlung.getString()); - } + var fragestellung = procedure.getValue("Fragestellung"); + var empfehlung = procedure.getValue("Empfehlung"); - return Optional.empty(); + if (null != fragestellung + && !fragestellung.getString().isBlank() + && null != empfehlung + && !empfehlung.getString().isBlank()) { + return Optional.of( + String.format( + "Fragestellung:%n%s%n%nEmpfehlung:%n%s", + fragestellung.getString(), empfehlung.getString())); + } else if (null != fragestellung && !fragestellung.getString().isBlank()) { + return Optional.of(fragestellung.getString()); + } else if (null != empfehlung && !empfehlung.getString().isBlank()) { + return Optional.of(empfehlung.getString()); } + + return Optional.empty(); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java b/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java index c1c7bac..7a387c1 100644 --- a/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java @@ -20,7 +20,6 @@ package dev.dnpm.oshelper.services.mtb; import de.itc.onkostar.api.Procedure; - import java.util.Optional; /** @@ -31,32 +30,35 @@ import java.util.Optional; @Deprecated(forRemoval = true, since = "2.1.0") public class OsTumorkonferenzVarianteUkwToProtocolMapper implements ProcedureToProtocolMapper { - /** - * Wandelt eine Prozedur mit Formularnamen "OS.Tumorkonferenz.VarianteUKW" in ein {@link Optional} mit einer - * Zeichenkette oder im Fehlerfall in ein leeres Optional um. - * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. - * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. - */ - @Override - public Optional<String> apply(Procedure procedure) { - if ((!procedure.getFormName().equals("OS.Tumorkonferenz.VarianteUKW"))) { - throw new AssertionError("Procedure is not of form type 'OS.Tumorkonferenz.VarianteUKW'"); - } - + /** + * Wandelt eine Prozedur mit Formularnamen "OS.Tumorkonferenz.VarianteUKW" in ein {@link Optional} + * mit einer Zeichenkette oder im Fehlerfall in ein leeres Optional um. + * + * @param procedure Die Prozedur, für die eine Zusammenfassung ermittelt werden soll. + * @return Das {@link Optional} mit, im Erfolgsfall, der Zusammenfassung für die Prozedur. + */ + @Override + public Optional<String> apply(Procedure procedure) { + if ((!procedure.getFormName().equals("OS.Tumorkonferenz.VarianteUKW"))) { + throw new AssertionError("Procedure is not of form type 'OS.Tumorkonferenz.VarianteUKW'"); + } - var fragestellung = procedure.getValue("Fragestellung"); - var empfehlung = procedure.getValue("Empfehlung"); + var fragestellung = procedure.getValue("Fragestellung"); + var empfehlung = procedure.getValue("Empfehlung"); - if ( - null != fragestellung && !fragestellung.getString().isBlank() - && null != empfehlung && !empfehlung.getString().isBlank() - ) { - return Optional.of(String.format("Fragestellung:%n%s%n%nEmpfehlung:%n%s", fragestellung.getString().trim(), empfehlung.getString().trim())); - } else if (null != fragestellung && !fragestellung.getString().isBlank()) { - return Optional.of(fragestellung.getString().trim()); - } else if (null != empfehlung && !empfehlung.getString().isBlank()) { - return Optional.of(empfehlung.getString().trim()); - } - return Optional.empty(); + if (null != fragestellung + && !fragestellung.getString().isBlank() + && null != empfehlung + && !empfehlung.getString().isBlank()) { + return Optional.of( + String.format( + "Fragestellung:%n%s%n%nEmpfehlung:%n%s", + fragestellung.getString().trim(), empfehlung.getString().trim())); + } else if (null != fragestellung && !fragestellung.getString().isBlank()) { + return Optional.of(fragestellung.getString().trim()); + } else if (null != empfehlung && !empfehlung.getString().isBlank()) { + return Optional.of(empfehlung.getString().trim()); } + return Optional.empty(); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/mtb/ProcedureToProtocolMapper.java b/src/main/java/dev/dnpm/oshelper/services/mtb/ProcedureToProtocolMapper.java index 93d30d7..8a09f5d 100644 --- a/src/main/java/dev/dnpm/oshelper/services/mtb/ProcedureToProtocolMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/mtb/ProcedureToProtocolMapper.java @@ -20,7 +20,6 @@ package dev.dnpm.oshelper.services.mtb; import de.itc.onkostar.api.Procedure; - import java.util.Optional; import java.util.function.Function; diff --git a/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieService.java b/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieService.java index 622f841..49fa149 100644 --- a/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieService.java +++ b/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieService.java @@ -19,12 +19,11 @@ package dev.dnpm.oshelper.services.strahlentherapie; -import dev.dnpm.oshelper.dto.EcogStatusWithDate; -import dev.dnpm.oshelper.services.SettingsService; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.dto.EcogStatusWithDate; +import dev.dnpm.oshelper.services.SettingsService; import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -38,56 +37,59 @@ import java.util.stream.Collectors; */ public class DefaultStrahlentherapieService implements StrahlentherapieService { - private static final String ECOG_FIELD = "ECOGvorTherapie"; + private static final String ECOG_FIELD = "ECOGvorTherapie"; - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - private final SettingsService settingsService; + private final SettingsService settingsService; - public DefaultStrahlentherapieService(final IOnkostarApi onkostarApi, final SettingsService settingsService) { - this.onkostarApi = onkostarApi; - this.settingsService = settingsService; - } + public DefaultStrahlentherapieService( + final IOnkostarApi onkostarApi, final SettingsService settingsService) { + this.onkostarApi = onkostarApi; + this.settingsService = settingsService; + } - /** - * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten - * - * @param patient Der zu verwendende Patient - * @return Der ECOG-Status als String oder leeres Optional - */ - @Override - public Optional<String> latestEcogStatus(Patient patient) { - return ecogStatus(patient).stream() - .max(Comparator.comparing(EcogStatusWithDate::getDate)) - .map(EcogStatusWithDate::getStatus); - } + /** + * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Der ECOG-Status als String oder leeres Optional + */ + @Override + public Optional<String> latestEcogStatus(Patient patient) { + return ecogStatus(patient).stream() + .max(Comparator.comparing(EcogStatusWithDate::getDate)) + .map(EcogStatusWithDate::getStatus); + } - /** - * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten - * - * @param patient Der zu verwendende Patient - * @return Eine Liste mit Datum und ECOG-Status als String - */ - @Override - public List<EcogStatusWithDate> ecogStatus(Patient patient) { - return patient.getDiseases().stream() - .flatMap(disease -> onkostarApi.getProceduresForDiseaseByForm(disease.getId(), getFormName()).stream()) - .filter(procedure -> null != procedure.getStartDate()) - .sorted(Comparator.comparing(Procedure::getStartDate)) - .map(procedure -> { - try { - return new EcogStatusWithDate(procedure.getStartDate(), procedure.getValue(ECOG_FIELD).getString()); - } catch (IllegalArgumentException e) { - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } + /** + * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Eine Liste mit Datum und ECOG-Status als String + */ + @Override + public List<EcogStatusWithDate> ecogStatus(Patient patient) { + return patient.getDiseases().stream() + .flatMap( + disease -> + onkostarApi.getProceduresForDiseaseByForm(disease.getId(), getFormName()).stream()) + .filter(procedure -> null != procedure.getStartDate()) + .sorted(Comparator.comparing(Procedure::getStartDate)) + .map( + procedure -> { + try { + return new EcogStatusWithDate( + procedure.getStartDate(), procedure.getValue(ECOG_FIELD).getString()); + } catch (IllegalArgumentException e) { + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } - private String getFormName() { - return settingsService - .getSetting("strahlentherapieform") - .orElse("OS.Strahlentherapie"); - } + private String getFormName() { + return settingsService.getSetting("strahlentherapieform").orElse("OS.Strahlentherapie"); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/StrahlentherapieService.java b/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/StrahlentherapieService.java index c410dfc..9b0a1f3 100644 --- a/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/StrahlentherapieService.java +++ b/src/main/java/dev/dnpm/oshelper/services/strahlentherapie/StrahlentherapieService.java @@ -24,6 +24,6 @@ import dev.dnpm.oshelper.services.TherapieMitEcogService; /** * Service für Systemtherapieformulare * - * @since 0.6.0 + * @since 0.6.0 */ public interface StrahlentherapieService extends TherapieMitEcogService {} diff --git a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieService.java b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieService.java index 7c73dbe..22c7f13 100644 --- a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieService.java +++ b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieService.java @@ -19,12 +19,11 @@ package dev.dnpm.oshelper.services.systemtherapie; -import dev.dnpm.oshelper.dto.EcogStatusWithDate; -import dev.dnpm.oshelper.services.SettingsService; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.dto.EcogStatusWithDate; +import dev.dnpm.oshelper.services.SettingsService; import java.util.*; import java.util.stream.Collectors; @@ -35,83 +34,86 @@ import java.util.stream.Collectors; */ public class DefaultSystemtherapieService implements SystemtherapieService { - private static final String ECOG_FIELD = "ECOGvorTherapie"; + private static final String ECOG_FIELD = "ECOGvorTherapie"; - private final IOnkostarApi onkostarApi; + private final IOnkostarApi onkostarApi; - private final SettingsService settingsService; + private final SettingsService settingsService; - public DefaultSystemtherapieService(final IOnkostarApi onkostarApi, final SettingsService settingsService) { - this.onkostarApi = onkostarApi; - this.settingsService = settingsService; - } + public DefaultSystemtherapieService( + final IOnkostarApi onkostarApi, final SettingsService settingsService) { + this.onkostarApi = onkostarApi; + this.settingsService = settingsService; + } - /** - * Ermittelt eine Zusammenfassung der systemischen Therapien für eine Erkrankung - * - * @param diseaseId Die ID der Erkrankung - * @return Zusammenfassung der systemischen Therapien - */ - @Override - public List<Map<String, String>> getSystemischeTherapienFromDiagnose(int diseaseId) { - List<Map<String, String>> result = new ArrayList<>(); - for (Procedure prozedur : onkostarApi.getProceduresForDiseaseByForm(diseaseId, getFormName())) { - prozedurToProzedurwerteMapper(prozedur).apply(prozedur).ifPresent(result::add); - } - return result; + /** + * Ermittelt eine Zusammenfassung der systemischen Therapien für eine Erkrankung + * + * @param diseaseId Die ID der Erkrankung + * @return Zusammenfassung der systemischen Therapien + */ + @Override + public List<Map<String, String>> getSystemischeTherapienFromDiagnose(int diseaseId) { + List<Map<String, String>> result = new ArrayList<>(); + for (Procedure prozedur : onkostarApi.getProceduresForDiseaseByForm(diseaseId, getFormName())) { + prozedurToProzedurwerteMapper(prozedur).apply(prozedur).ifPresent(result::add); } + return result; + } - /** - * Übergibt aktuell immer den Mapper für das Formular "OS.Systemische Therapie", - * da beide bekannte Varianten damit gemappt werden können. - * - * @param procedure Die Prozedur für die ein Mapper erstellt werden soll - * @return Der Mapper für die Prozedur - */ - @Override - public ProzedurToProzedurwerteMapper prozedurToProzedurwerteMapper(Procedure procedure) { - return new OsSystemischeTherapieToProzedurwerteMapper(); - } + /** + * Übergibt aktuell immer den Mapper für das Formular "OS.Systemische Therapie", da beide bekannte + * Varianten damit gemappt werden können. + * + * @param procedure Die Prozedur für die ein Mapper erstellt werden soll + * @return Der Mapper für die Prozedur + */ + @Override + public ProzedurToProzedurwerteMapper prozedurToProzedurwerteMapper(Procedure procedure) { + return new OsSystemischeTherapieToProzedurwerteMapper(); + } - /** - * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten - * - * @param patient Der zu verwendende Patient - * @return Der ECOG-Status als String oder leeres Optional - */ - @Override - public Optional<String> latestEcogStatus(Patient patient) { - return ecogStatus(patient).stream() - .max(Comparator.comparing(EcogStatusWithDate::getDate)) - .map(EcogStatusWithDate::getStatus); - } + /** + * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Der ECOG-Status als String oder leeres Optional + */ + @Override + public Optional<String> latestEcogStatus(Patient patient) { + return ecogStatus(patient).stream() + .max(Comparator.comparing(EcogStatusWithDate::getDate)) + .map(EcogStatusWithDate::getStatus); + } - /** - * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten - * - * @param patient Der zu verwendende Patient - * @return Eine Liste mit Datum und ECOG-Status als String - */ - @Override - public List<EcogStatusWithDate> ecogStatus(Patient patient) { - return patient.getDiseases().stream() - .flatMap(disease -> onkostarApi.getProceduresForDiseaseByForm(disease.getId(), getFormName()).stream()) - .filter(procedure -> null != procedure.getStartDate()) - .sorted(Comparator.comparing(Procedure::getStartDate)) - .map(procedure -> { - try { - return new EcogStatusWithDate(procedure.getStartDate(), procedure.getValue(ECOG_FIELD).getString()); - } catch (IllegalArgumentException e) { - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } + /** + * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten + * + * @param patient Der zu verwendende Patient + * @return Eine Liste mit Datum und ECOG-Status als String + */ + @Override + public List<EcogStatusWithDate> ecogStatus(Patient patient) { + return patient.getDiseases().stream() + .flatMap( + disease -> + onkostarApi.getProceduresForDiseaseByForm(disease.getId(), getFormName()).stream()) + .filter(procedure -> null != procedure.getStartDate()) + .sorted(Comparator.comparing(Procedure::getStartDate)) + .map( + procedure -> { + try { + return new EcogStatusWithDate( + procedure.getStartDate(), procedure.getValue(ECOG_FIELD).getString()); + } catch (IllegalArgumentException e) { + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } - private String getFormName() { - return settingsService - .getSetting("systemtherapieform") - .orElse("OS.Systemische Therapie"); - } + private String getFormName() { + return settingsService.getSetting("systemtherapieform").orElse("OS.Systemische Therapie"); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/OsSystemischeTherapieToProzedurwerteMapper.java b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/OsSystemischeTherapieToProzedurwerteMapper.java index f671381..0e7455d 100644 --- a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/OsSystemischeTherapieToProzedurwerteMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/OsSystemischeTherapieToProzedurwerteMapper.java @@ -24,11 +24,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import dev.dnpm.oshelper.atc.AtcCode; +import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; - /** * Implementierung zum Mappen des Formulars "OS.Systemische Therapie" auf die Prozedurwerte * @@ -36,74 +35,74 @@ import java.util.*; */ public class OsSystemischeTherapieToProzedurwerteMapper implements ProzedurToProzedurwerteMapper { - private static final Logger logger = LoggerFactory.getLogger(OsSystemischeTherapieToProzedurwerteMapper.class); + private static final Logger logger = + LoggerFactory.getLogger(OsSystemischeTherapieToProzedurwerteMapper.class); - @Override - public Optional<Map<String, String>> apply(Procedure procedure) { - try { - return Optional.of(getProzedurwerte(procedure)); - } catch (Exception e) { - logger.error("Fehler beim Mappen der Prozedur auf Prozedurwerte", e); - return Optional.empty(); - } + @Override + public Optional<Map<String, String>> apply(Procedure procedure) { + try { + return Optional.of(getProzedurwerte(procedure)); + } catch (Exception e) { + logger.error("Fehler beim Mappen der Prozedur auf Prozedurwerte", e); + return Optional.empty(); } + } - private static Map<String, String> getProzedurwerte(Procedure prozedur) { - List<String> wirkstoffListe = new ArrayList<>(); - // SubstanzenCodesListe enthält die Liste der SubstanzenCodes - List<Map<String, String>> substanzenCodesListe = new ArrayList<>(); + private static Map<String, String> getProzedurwerte(Procedure prozedur) { + List<String> wirkstoffListe = new ArrayList<>(); + // SubstanzenCodesListe enthält die Liste der SubstanzenCodes + List<Map<String, String>> substanzenCodesListe = new ArrayList<>(); - // alle Werte der Prozedur auslesen - Map<String, Item> alleWerte = prozedur.getAllValues(); - // Prozedurwerte enthält nur die interessanten Werte - Map<String, String> prozedurwerte = new HashMap<>(); - // alle Werte durchgehen und die interessanten übernehmen - if (alleWerte.containsKey("Beendigung")) { - prozedurwerte.put("Beendigung", alleWerte.get("Beendigung").getValue()); - } - if (alleWerte.containsKey("Ergebnis")) { - prozedurwerte.put("Ergebnis", alleWerte.get("Ergebnis").getValue()); - } - if (alleWerte.containsKey("Beginn")) { - prozedurwerte.put("Beginn", alleWerte.get("Beginn").getString()); - } - if (alleWerte.containsKey("Ende")) { - prozedurwerte.put("Ende", alleWerte.get("Ende").getString()); - } - if (alleWerte.containsKey("SubstanzenList")) { - List<Map<String, String>> substanzList = alleWerte.get("SubstanzenList").getValue(); - for (var substanz : substanzList) { - var substanzCodes = getSubstanzCode(substanz); - substanzenCodesListe.add(substanzCodes); - wirkstoffListe.add(substanzCodes.get("substance")); - } - } - - prozedurwerte.put("Wirkstoffe", String.join(", ", wirkstoffListe)); - try { - ObjectMapper mapper = new ObjectMapper(); - prozedurwerte.put("WirkstoffCodes", mapper.writeValueAsString(substanzenCodesListe)); - } catch (JsonProcessingException e) { - logger.error("Kann 'WirkstoffCodes' nicht in JSON-String mappen", e); - } + // alle Werte der Prozedur auslesen + Map<String, Item> alleWerte = prozedur.getAllValues(); + // Prozedurwerte enthält nur die interessanten Werte + Map<String, String> prozedurwerte = new HashMap<>(); + // alle Werte durchgehen und die interessanten übernehmen + if (alleWerte.containsKey("Beendigung")) { + prozedurwerte.put("Beendigung", alleWerte.get("Beendigung").getValue()); + } + if (alleWerte.containsKey("Ergebnis")) { + prozedurwerte.put("Ergebnis", alleWerte.get("Ergebnis").getValue()); + } + if (alleWerte.containsKey("Beginn")) { + prozedurwerte.put("Beginn", alleWerte.get("Beginn").getString()); + } + if (alleWerte.containsKey("Ende")) { + prozedurwerte.put("Ende", alleWerte.get("Ende").getString()); + } + if (alleWerte.containsKey("SubstanzenList")) { + List<Map<String, String>> substanzList = alleWerte.get("SubstanzenList").getValue(); + for (var substanz : substanzList) { + var substanzCodes = getSubstanzCode(substanz); + substanzenCodesListe.add(substanzCodes); + wirkstoffListe.add(substanzCodes.get("substance")); + } + } - return prozedurwerte; + prozedurwerte.put("Wirkstoffe", String.join(", ", wirkstoffListe)); + try { + ObjectMapper mapper = new ObjectMapper(); + prozedurwerte.put("WirkstoffCodes", mapper.writeValueAsString(substanzenCodesListe)); + } catch (JsonProcessingException e) { + logger.error("Kann 'WirkstoffCodes' nicht in JSON-String mappen", e); } - private static Map<String, String> getSubstanzCode(Map<String, String> substanz) { - Map<String, String> substanzCode = new HashMap<>(); - if (substanz.containsKey("Substanz")) { - if (AtcCode.isAtcCode(substanz.get("Substanz"))) { - substanzCode.put("system", "ATC"); - } else { - substanzCode.put("system", "other"); - } - substanzCode.put("code", substanz.get("Substanz")); + return prozedurwerte; + } - } - if (substanz.containsKey("Substanz_shortDescription")) { - substanzCode.put("substance", substanz.get("Substanz_shortDescription")); - } - return substanzCode; + private static Map<String, String> getSubstanzCode(Map<String, String> substanz) { + Map<String, String> substanzCode = new HashMap<>(); + if (substanz.containsKey("Substanz")) { + if (AtcCode.isAtcCode(substanz.get("Substanz"))) { + substanzCode.put("system", "ATC"); + } else { + substanzCode.put("system", "other"); + } + substanzCode.put("code", substanz.get("Substanz")); + } + if (substanz.containsKey("Substanz_shortDescription")) { + substanzCode.put("substance", substanz.get("Substanz_shortDescription")); } + return substanzCode; + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapper.java b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapper.java index e2af851..c8a6829 100644 --- a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapper.java +++ b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapper.java @@ -20,7 +20,6 @@ package dev.dnpm.oshelper.services.systemtherapie; import de.itc.onkostar.api.Procedure; - import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -30,4 +29,5 @@ import java.util.function.Function; * * @since 0.2.0 */ -public interface ProzedurToProzedurwerteMapper extends Function<Procedure, Optional<Map<String, String>>> {} +public interface ProzedurToProzedurwerteMapper + extends Function<Procedure, Optional<Map<String, String>>> {} diff --git a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/SystemtherapieService.java b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/SystemtherapieService.java index 63216a0..2be4cc4 100644 --- a/src/main/java/dev/dnpm/oshelper/services/systemtherapie/SystemtherapieService.java +++ b/src/main/java/dev/dnpm/oshelper/services/systemtherapie/SystemtherapieService.java @@ -19,30 +19,30 @@ package dev.dnpm.oshelper.services.systemtherapie; -import dev.dnpm.oshelper.services.TherapieMitEcogService; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.services.TherapieMitEcogService; import java.util.List; import java.util.Map; /** * Service für Systemtherapieformulare * - * @since 0.2.0 + * @since 0.2.0 */ public interface SystemtherapieService extends TherapieMitEcogService { - /** - * Ermittelt eine Zusammenfassung der systemischen Therapien für eine Erkrankung - * @param diseaseId Die ID der Erkrankung - * @return Die Zusammenfassung der systemischen Therapien - */ - List<Map<String, String>> getSystemischeTherapienFromDiagnose(int diseaseId); - - /** - * Erstellt den Mapper for die Prozedur - * @param procedure Die Prozedur für die ein Mapper erstellt werden soll - * @return Der erstellte ProzedurToProzedurwerteMapper - */ - ProzedurToProzedurwerteMapper prozedurToProzedurwerteMapper(Procedure procedure); + /** + * Ermittelt eine Zusammenfassung der systemischen Therapien für eine Erkrankung + * + * @param diseaseId Die ID der Erkrankung + * @return Die Zusammenfassung der systemischen Therapien + */ + List<Map<String, String>> getSystemischeTherapienFromDiagnose(int diseaseId); + /** + * Erstellt den Mapper for die Prozedur + * + * @param procedure Die Prozedur für die ein Mapper erstellt werden soll + * @return Der erstellte ProzedurToProzedurwerteMapper + */ + ProzedurToProzedurwerteMapper prozedurToProzedurwerteMapper(Procedure procedure); } diff --git a/src/main/java/dev/dnpm/oshelper/services/therapieplan/AbstractTherapieplanService.java b/src/main/java/dev/dnpm/oshelper/services/therapieplan/AbstractTherapieplanService.java index 4542972..cd04e1f 100644 --- a/src/main/java/dev/dnpm/oshelper/services/therapieplan/AbstractTherapieplanService.java +++ b/src/main/java/dev/dnpm/oshelper/services/therapieplan/AbstractTherapieplanService.java @@ -19,43 +19,44 @@ package dev.dnpm.oshelper.services.therapieplan; -import dev.dnpm.oshelper.services.FormService; import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.services.FormService; import java.util.List; import java.util.stream.Collectors; public abstract class AbstractTherapieplanService implements TherapieplanService { - protected final IOnkostarApi onkostarApi; + protected final IOnkostarApi onkostarApi; - protected final FormService formService; + protected final FormService formService; - protected AbstractTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { - this.onkostarApi = onkostarApi; - this.formService = formService; - } - - @Override - public List<Procedure> findReferencedFollowUpsForSubform(Procedure procedure) { - if (null == procedure || !"DNPM UF Einzelempfehlung".equals(procedure.getFormName())) { - return List.of(); - } + protected AbstractTherapieplanService( + final IOnkostarApi onkostarApi, final FormService formService) { + this.onkostarApi = onkostarApi; + this.formService = formService; + } - return procedure.getDiseaseIds().stream() - .flatMap(diseaseId -> onkostarApi.getProceduresForDiseaseByForm(diseaseId, "DNPM FollowUp").stream()) - .filter(p -> p.getValue("LinkTherapieempfehlung").getInt() == procedure.getId()) - .collect(Collectors.toList()); + @Override + public List<Procedure> findReferencedFollowUpsForSubform(Procedure procedure) { + if (null == procedure || !"DNPM UF Einzelempfehlung".equals(procedure.getFormName())) { + return List.of(); } - @Override - public List<Procedure> findReferencedFollowUpsForSubform(int procedureId) { - var procedure = this.onkostarApi.getProcedure(procedureId); - if (null == procedure || !"DNPM UF Einzelempfehlung".equals(procedure.getFormName())) { - return List.of(); - } - return findReferencedFollowUpsForSubform(procedure); + return procedure.getDiseaseIds().stream() + .flatMap( + diseaseId -> + onkostarApi.getProceduresForDiseaseByForm(diseaseId, "DNPM FollowUp").stream()) + .filter(p -> p.getValue("LinkTherapieempfehlung").getInt() == procedure.getId()) + .collect(Collectors.toList()); + } + + @Override + public List<Procedure> findReferencedFollowUpsForSubform(int procedureId) { + var procedure = this.onkostarApi.getProcedure(procedureId); + if (null == procedure || !"DNPM UF Einzelempfehlung".equals(procedure.getFormName())) { + return List.of(); } - + return findReferencedFollowUpsForSubform(procedure); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanService.java b/src/main/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanService.java index df1902e..4f5d716 100644 --- a/src/main/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanService.java +++ b/src/main/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanService.java @@ -19,197 +19,192 @@ package dev.dnpm.oshelper.services.therapieplan; -import dev.dnpm.oshelper.services.FormService; +import static dev.dnpm.oshelper.services.FormService.hasValue; +import static dev.dnpm.oshelper.services.FormService.isYes; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import dev.dnpm.oshelper.services.FormService; import java.util.Date; import java.util.List; import java.util.Objects; - -import static dev.dnpm.oshelper.services.FormService.hasValue; -import static dev.dnpm.oshelper.services.FormService.isYes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DefaultTherapieplanService extends AbstractTherapieplanService { - public static final String FORMFIELD_REFERSTEMTB = "referstemtb"; - public static final String FORMFIELD_HUMANGENBERATUNG = "humangenberatung"; - public static final String FORMFIELD_REEVALUATION = "reevaluation"; - public static final String FORMFIELD_DATUM = "datum"; - public static final String FORMFIELD_REFTKHUMANGENBER = "reftkhumangenber"; - public static final String FORMFIELD_DATUMTKHUMANGENBER = "datumtkhumangenber"; - public static final String FORMFIELD_REFTKREEVALUATION = "reftkreevaluation"; - public static final String FORMFIELD_DATUMTKREEVALUATION = "datumtkreevaluation"; - public static final String FORMFIELD_MTB = "mtb"; - public static final String FORMFIELD_UFEEDATUM = "ufeedatum"; - public static final String FORMFIELD_REFTUMORKONFERENZ = "reftumorkonferenz"; - public static final String FORMFIELD_UFRBDATUM = "ufrbdatum"; - - public static final String DATAFIELD_REF_TK_HUMANGENBER = "ref_tk_humangenber"; - public static final String DATAFIELD_DATUM_TK_HUMANGENBER = "datum_tk_humangenber"; - public static final String DATAFIELD_DATUM = "datum"; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public DefaultTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { - super(onkostarApi, formService); + public static final String FORMFIELD_REFERSTEMTB = "referstemtb"; + public static final String FORMFIELD_HUMANGENBERATUNG = "humangenberatung"; + public static final String FORMFIELD_REEVALUATION = "reevaluation"; + public static final String FORMFIELD_DATUM = "datum"; + public static final String FORMFIELD_REFTKHUMANGENBER = "reftkhumangenber"; + public static final String FORMFIELD_DATUMTKHUMANGENBER = "datumtkhumangenber"; + public static final String FORMFIELD_REFTKREEVALUATION = "reftkreevaluation"; + public static final String FORMFIELD_DATUMTKREEVALUATION = "datumtkreevaluation"; + public static final String FORMFIELD_MTB = "mtb"; + public static final String FORMFIELD_UFEEDATUM = "ufeedatum"; + public static final String FORMFIELD_REFTUMORKONFERENZ = "reftumorkonferenz"; + public static final String FORMFIELD_UFRBDATUM = "ufrbdatum"; + + public static final String DATAFIELD_REF_TK_HUMANGENBER = "ref_tk_humangenber"; + public static final String DATAFIELD_DATUM_TK_HUMANGENBER = "datum_tk_humangenber"; + public static final String DATAFIELD_DATUM = "datum"; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public DefaultTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { + super(onkostarApi, formService); + } + + /** + * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen "Humangenetische + * Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. + * + * @param procedure Die Prozedur mit Hauptformular + */ + @Override + public void updateRequiredMtbEntries(Procedure procedure) { + this.updateMtbInSections(procedure); + this.updateMtbInSubforms(procedure); + } + + /** + * Finde verlinkte MTBs in Hauptformular und Unterformularen + * + * @param procedure Die Prozedur mit Hauptformular + * @return Liste mit verlinkten MTBs + */ + @Override + public List<Procedure> findReferencedMtbs(Procedure procedure) { + if (!hasValue(procedure, FORMFIELD_REFERSTEMTB)) { + return List.of(); + } + + var mtbProcedure = + this.onkostarApi.getProcedure(procedure.getValue(FORMFIELD_REFERSTEMTB).getInt()); + if (null == mtbProcedure) { + return List.of(); } + return List.of(mtbProcedure); + } + + /** + * Finde verlinkte MTBs in Hauptformular und Unterformularen + * + * @param procedureId ID der Prozedur mit Hauptformular + * @return Liste mit verlinkten MTBs + */ + @Override + public List<Procedure> findReferencedMtbs(int procedureId) { + var procedure = this.onkostarApi.getProcedure(procedureId); + if (null == procedure) { + return List.of(); + } + return findReferencedMtbs(procedure); + } + + private void updateMtbInSections(Procedure procedure) { + if (!isYes(procedure, FORMFIELD_HUMANGENBERATUNG) + && !isYes(procedure, FORMFIELD_REEVALUATION)) { + return; + } + + var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt(); + var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate(); + var noUpdateRequired = true; - /** - * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen - * "Humangenetische Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. - * - * @param procedure Die Prozedur mit Hauptformular - */ - @Override - public void updateRequiredMtbEntries(Procedure procedure) { - this.updateMtbInSections(procedure); - this.updateMtbInSubforms(procedure); + if (isYes(procedure, FORMFIELD_HUMANGENBERATUNG) + && (!hasValue(procedure, FORMFIELD_REFTKHUMANGENBER) + || mtbReference != procedure.getValue(FORMFIELD_REFTKHUMANGENBER).getInt())) { + procedure.setValue( + FORMFIELD_REFTKHUMANGENBER, new Item(DATAFIELD_REF_TK_HUMANGENBER, mtbReference)); + noUpdateRequired = false; } - /** - * Finde verlinkte MTBs in Hauptformular und Unterformularen - * - * @param procedure Die Prozedur mit Hauptformular - * @return Liste mit verlinkten MTBs - */ - @Override - public List<Procedure> findReferencedMtbs(Procedure procedure) { - if (!hasValue(procedure, FORMFIELD_REFERSTEMTB)) { - return List.of(); - } - - var mtbProcedure = this.onkostarApi.getProcedure(procedure.getValue(FORMFIELD_REFERSTEMTB).getInt()); - if (null == mtbProcedure) { - return List.of(); - } - return List.of(mtbProcedure); + if (isYes(procedure, FORMFIELD_HUMANGENBERATUNG) + && (!hasValue(procedure, FORMFIELD_DATUMTKHUMANGENBER) + || !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKHUMANGENBER).getDate()))) { + procedure.setValue( + FORMFIELD_DATUMTKHUMANGENBER, new Item(DATAFIELD_DATUM_TK_HUMANGENBER, mtbDate)); + noUpdateRequired = false; } - /** - * Finde verlinkte MTBs in Hauptformular und Unterformularen - * - * @param procedureId ID der Prozedur mit Hauptformular - * @return Liste mit verlinkten MTBs - */ - @Override - public List<Procedure> findReferencedMtbs(int procedureId) { - var procedure = this.onkostarApi.getProcedure(procedureId); - if (null == procedure) { - return List.of(); - } - return findReferencedMtbs(procedure); + if (isYes(procedure, FORMFIELD_REEVALUATION) + && (!hasValue(procedure, FORMFIELD_REFTKREEVALUATION) + || mtbReference != procedure.getValue(FORMFIELD_REFTKREEVALUATION).getInt())) { + procedure.setValue( + FORMFIELD_REFTKREEVALUATION, new Item("ref_tk_reevaluation", mtbReference)); + noUpdateRequired = false; } - private void updateMtbInSections(Procedure procedure) { - if (!isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && !isYes(procedure, FORMFIELD_REEVALUATION)) { - return; - } - - var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt(); - var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate(); - var noUpdateRequired = true; - - if ( - isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && ( - !hasValue(procedure, FORMFIELD_REFTKHUMANGENBER) - || mtbReference != procedure.getValue(FORMFIELD_REFTKHUMANGENBER).getInt() - ) - ) { - procedure.setValue(FORMFIELD_REFTKHUMANGENBER, new Item(DATAFIELD_REF_TK_HUMANGENBER, mtbReference)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && ( - !hasValue(procedure, FORMFIELD_DATUMTKHUMANGENBER) - || !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKHUMANGENBER).getDate()) - ) - ) { - procedure.setValue(FORMFIELD_DATUMTKHUMANGENBER, new Item(DATAFIELD_DATUM_TK_HUMANGENBER, mtbDate)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, FORMFIELD_REEVALUATION) && ( - !hasValue(procedure, FORMFIELD_REFTKREEVALUATION) - || mtbReference != procedure.getValue(FORMFIELD_REFTKREEVALUATION).getInt() - ) - ) { - procedure.setValue(FORMFIELD_REFTKREEVALUATION, new Item("ref_tk_reevaluation", mtbReference)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, FORMFIELD_REEVALUATION) && ( - !hasValue(procedure, FORMFIELD_DATUMTKREEVALUATION) - || !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKREEVALUATION).getDate()) - ) - ) { - procedure.setValue(FORMFIELD_DATUMTKREEVALUATION, new Item("datum_tk_reevaluation", mtbDate)); - noUpdateRequired = false; - } - - if (noUpdateRequired) { - return; - } - - try { - onkostarApi.saveProcedure(procedure, false); - } catch (Exception e) { - logger.error("Formular 'DNPM Therapieplan' konnte nicht aktualisiert werden", e); - } + if (isYes(procedure, FORMFIELD_REEVALUATION) + && (!hasValue(procedure, FORMFIELD_DATUMTKREEVALUATION) + || !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKREEVALUATION).getDate()))) { + procedure.setValue(FORMFIELD_DATUMTKREEVALUATION, new Item("datum_tk_reevaluation", mtbDate)); + noUpdateRequired = false; } - private void updateMtbInSubforms(Procedure procedure) { - if ( - !hasValue(procedure, FORMFIELD_REFERSTEMTB) || !hasValue(procedure, FORMFIELD_DATUM) - ) { - return; - } - - var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt(); - var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate(); - - formService.getSubFormProcedureIds(procedure.getId()).stream() - .map(onkostarApi::getProcedure) - .filter(Objects::nonNull) - .forEach(subform -> { - if (isUsableEinzelempfehlung(subform, mtbReference, mtbDate)) { - subform.setValue(FORMFIELD_MTB, new Item("ref_tumorkonferenz", mtbReference)); - subform.setValue(FORMFIELD_UFEEDATUM, new Item(DATAFIELD_DATUM, mtbDate)); - - try { - onkostarApi.saveProcedure(subform, false); - } catch (Exception e) { - logger.error("Formular 'DNPM UF Einzelempfehlung' konnte nicht aktualisiert werden", e); - } - } - - - if (isUsableRebiopsie(subform, mtbReference, mtbDate)) { - subform.setValue(FORMFIELD_REFTUMORKONFERENZ, new Item("ref_tumorkonferenz", mtbReference)); - subform.setValue(FORMFIELD_UFRBDATUM, new Item(DATAFIELD_DATUM, mtbDate)); - - try { - onkostarApi.saveProcedure(subform, false); - } catch (Exception e) { - logger.error("Formular 'DNPM UF Rebiopsie' konnte nicht aktualisiert werden", e); - } - } - - }); + if (noUpdateRequired) { + return; } - private static boolean isUsableRebiopsie(Procedure subform, int mtbReference, Date mtbDate) { - return subform.getFormName().equals("DNPM UF Rebiopsie") && mtbReference != subform.getValue(FORMFIELD_REFTUMORKONFERENZ).getInt() && !mtbDate.equals(subform.getValue(FORMFIELD_UFRBDATUM).getDate()); + try { + onkostarApi.saveProcedure(procedure, false); + } catch (Exception e) { + logger.error("Formular 'DNPM Therapieplan' konnte nicht aktualisiert werden", e); } + } - private static boolean isUsableEinzelempfehlung(Procedure subform, int mtbReference, Date mtbDate) { - return subform.getFormName().equals("DNPM UF Einzelempfehlung") && mtbReference != subform.getValue(FORMFIELD_MTB).getInt() && !mtbDate.equals(subform.getValue(FORMFIELD_UFEEDATUM).getDate()); + private void updateMtbInSubforms(Procedure procedure) { + if (!hasValue(procedure, FORMFIELD_REFERSTEMTB) || !hasValue(procedure, FORMFIELD_DATUM)) { + return; } + var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt(); + var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate(); + + formService.getSubFormProcedureIds(procedure.getId()).stream() + .map(onkostarApi::getProcedure) + .filter(Objects::nonNull) + .forEach( + subform -> { + if (isUsableEinzelempfehlung(subform, mtbReference, mtbDate)) { + subform.setValue(FORMFIELD_MTB, new Item("ref_tumorkonferenz", mtbReference)); + subform.setValue(FORMFIELD_UFEEDATUM, new Item(DATAFIELD_DATUM, mtbDate)); + + try { + onkostarApi.saveProcedure(subform, false); + } catch (Exception e) { + logger.error( + "Formular 'DNPM UF Einzelempfehlung' konnte nicht aktualisiert werden", e); + } + } + + if (isUsableRebiopsie(subform, mtbReference, mtbDate)) { + subform.setValue( + FORMFIELD_REFTUMORKONFERENZ, new Item("ref_tumorkonferenz", mtbReference)); + subform.setValue(FORMFIELD_UFRBDATUM, new Item(DATAFIELD_DATUM, mtbDate)); + + try { + onkostarApi.saveProcedure(subform, false); + } catch (Exception e) { + logger.error("Formular 'DNPM UF Rebiopsie' konnte nicht aktualisiert werden", e); + } + } + }); + } + + private static boolean isUsableRebiopsie(Procedure subform, int mtbReference, Date mtbDate) { + return subform.getFormName().equals("DNPM UF Rebiopsie") + && mtbReference != subform.getValue(FORMFIELD_REFTUMORKONFERENZ).getInt() + && !mtbDate.equals(subform.getValue(FORMFIELD_UFRBDATUM).getDate()); + } + + private static boolean isUsableEinzelempfehlung( + Procedure subform, int mtbReference, Date mtbDate) { + return subform.getFormName().equals("DNPM UF Einzelempfehlung") + && mtbReference != subform.getValue(FORMFIELD_MTB).getInt() + && !mtbDate.equals(subform.getValue(FORMFIELD_UFEEDATUM).getDate()); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/therapieplan/MultipleMtbTherapieplanService.java b/src/main/java/dev/dnpm/oshelper/services/therapieplan/MultipleMtbTherapieplanService.java index d6cf537..ff7408e 100644 --- a/src/main/java/dev/dnpm/oshelper/services/therapieplan/MultipleMtbTherapieplanService.java +++ b/src/main/java/dev/dnpm/oshelper/services/therapieplan/MultipleMtbTherapieplanService.java @@ -19,73 +19,74 @@ package dev.dnpm.oshelper.services.therapieplan; -import dev.dnpm.oshelper.services.FormService; +import static dev.dnpm.oshelper.services.FormService.hasValue; +import static dev.dnpm.oshelper.services.FormService.isYes; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; - +import dev.dnpm.oshelper.services.FormService; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import static dev.dnpm.oshelper.services.FormService.hasValue; -import static dev.dnpm.oshelper.services.FormService.isYes; - @Deprecated(forRemoval = true, since = "2.0.0") public class MultipleMtbTherapieplanService extends AbstractTherapieplanService { - public MultipleMtbTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { - super(onkostarApi, formService); - } + public MultipleMtbTherapieplanService( + final IOnkostarApi onkostarApi, final FormService formService) { + super(onkostarApi, formService); + } - @Override - public void updateRequiredMtbEntries(Procedure procedure) { - // No action required - } + @Override + public void updateRequiredMtbEntries(Procedure procedure) { + // No action required + } - @Override - public List<Procedure> findReferencedMtbs(Procedure procedure) { - var procedureIds = new ArrayList<Integer>(); + @Override + public List<Procedure> findReferencedMtbs(Procedure procedure) { + var procedureIds = new ArrayList<Integer>(); - var mtbReference = procedure.getValue("referstemtb").getInt(); - procedureIds.add(mtbReference); + var mtbReference = procedure.getValue("referstemtb").getInt(); + procedureIds.add(mtbReference); - if (isYes(procedure, "humangenberatung") && hasValue(procedure, "reftkhumangenber")) { - procedureIds.add(procedure.getValue("reftkhumangenber").getInt()); - } + if (isYes(procedure, "humangenberatung") && hasValue(procedure, "reftkhumangenber")) { + procedureIds.add(procedure.getValue("reftkhumangenber").getInt()); + } - if (isYes(procedure, "reevaluation") && hasValue(procedure, "reftkreevaluation")) { - procedureIds.add(procedure.getValue("reftkreevaluation").getInt()); - } + if (isYes(procedure, "reevaluation") && hasValue(procedure, "reftkreevaluation")) { + procedureIds.add(procedure.getValue("reftkreevaluation").getInt()); + } - formService.getSubFormProcedureIds(procedure.getId()).stream() - .map(onkostarApi::getProcedure) - .filter(Objects::nonNull) - .forEach(subform -> { - if (subform.getFormName().equals("DNPM UF Einzelempfehlung")) { - procedureIds.add(subform.getValue("mtb").getInt()); - } + formService.getSubFormProcedureIds(procedure.getId()).stream() + .map(onkostarApi::getProcedure) + .filter(Objects::nonNull) + .forEach( + subform -> { + if (subform.getFormName().equals("DNPM UF Einzelempfehlung")) { + procedureIds.add(subform.getValue("mtb").getInt()); + } - if (subform.getFormName().equals("DNPM UF Rebiopsie")) { - procedureIds.add(subform.getValue("reftumorkonferenz").getInt()); - } - }); + if (subform.getFormName().equals("DNPM UF Rebiopsie")) { + procedureIds.add(subform.getValue("reftumorkonferenz").getInt()); + } + }); - return procedureIds.stream() - .distinct() - .map(onkostarApi::getProcedure) - .filter(Objects::nonNull) - .sorted(Comparator.comparing(Procedure::getStartDate)) - .collect(Collectors.toList()); - } + return procedureIds.stream() + .distinct() + .map(onkostarApi::getProcedure) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(Procedure::getStartDate)) + .collect(Collectors.toList()); + } - @Override - public List<Procedure> findReferencedMtbs(int procedureId) { - var procedure = this.onkostarApi.getProcedure(procedureId); - if (null == procedure) { - return List.of(); - } - return findReferencedMtbs(procedure); + @Override + public List<Procedure> findReferencedMtbs(int procedureId) { + var procedure = this.onkostarApi.getProcedure(procedureId); + if (null == procedure) { + return List.of(); } + return findReferencedMtbs(procedure); + } } diff --git a/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanService.java b/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanService.java index b22a75d..bfdbf76 100644 --- a/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanService.java +++ b/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanService.java @@ -20,49 +20,47 @@ package dev.dnpm.oshelper.services.therapieplan; import de.itc.onkostar.api.Procedure; - import java.util.List; public interface TherapieplanService { - /** - * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen - * "Humangenetische Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. - * - * @param procedure Die Prozedur mit Hauptformular - */ - void updateRequiredMtbEntries(Procedure procedure); - - /** - * Finde verlinkte MTBs in Hauptformular und Unterformularen - * - * @param procedure Die Prozedur mit Hauptformular - * @return Liste mit verlinkten MTBs - */ - List<Procedure> findReferencedMtbs(Procedure procedure); + /** + * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen "Humangenetische + * Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. + * + * @param procedure Die Prozedur mit Hauptformular + */ + void updateRequiredMtbEntries(Procedure procedure); - /** - * Finde verlinkte MTBs in Hauptformular und Unterformularen - * - * @param procedureId ID der Prozedur mit Hauptformular - * @return Liste mit verlinkten MTBs - */ - List<Procedure> findReferencedMtbs(int procedureId); + /** + * Finde verlinkte MTBs in Hauptformular und Unterformularen + * + * @param procedure Die Prozedur mit Hauptformular + * @return Liste mit verlinkten MTBs + */ + List<Procedure> findReferencedMtbs(Procedure procedure); - /** - * Finde verlinkte FollowUps für DNPM UF Einzelempfehlung - * - * @param procedure Die DNPM UF Einzelempfehlung Prozedur - * @return Liste mit verlinkten FollowUps - */ - List<Procedure> findReferencedFollowUpsForSubform(Procedure procedure); + /** + * Finde verlinkte MTBs in Hauptformular und Unterformularen + * + * @param procedureId ID der Prozedur mit Hauptformular + * @return Liste mit verlinkten MTBs + */ + List<Procedure> findReferencedMtbs(int procedureId); - /** - * Finde verlinkte FollowUps für DNPM UF Einzelempfehlung - * - * @param procedureId ID der Prozedur - * @return Liste mit verlinkten FollowUps - */ - List<Procedure> findReferencedFollowUpsForSubform(int procedureId); + /** + * Finde verlinkte FollowUps für DNPM UF Einzelempfehlung + * + * @param procedure Die DNPM UF Einzelempfehlung Prozedur + * @return Liste mit verlinkten FollowUps + */ + List<Procedure> findReferencedFollowUpsForSubform(Procedure procedure); + /** + * Finde verlinkte FollowUps für DNPM UF Einzelempfehlung + * + * @param procedureId ID der Prozedur + * @return Liste mit verlinkten FollowUps + */ + List<Procedure> findReferencedFollowUpsForSubform(int procedureId); } diff --git a/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactory.java b/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactory.java index 0b9222c..889f9c8 100644 --- a/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactory.java +++ b/src/main/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactory.java @@ -19,28 +19,26 @@ package dev.dnpm.oshelper.services.therapieplan; +import de.itc.onkostar.api.IOnkostarApi; import dev.dnpm.oshelper.services.FormService; import dev.dnpm.oshelper.services.SettingsService; -import de.itc.onkostar.api.IOnkostarApi; public class TherapieplanServiceFactory { - private final IOnkostarApi onkostarApi; - - private final FormService formService; + private final IOnkostarApi onkostarApi; - @SuppressWarnings("unused") - public TherapieplanServiceFactory( - final IOnkostarApi onkostarApi, - final SettingsService settingsService, - final FormService formService - ) { - this.onkostarApi = onkostarApi; - this.formService = formService; - } + private final FormService formService; - public TherapieplanService currentUsableInstance() { - return new DefaultTherapieplanService(onkostarApi, formService); - } + @SuppressWarnings("unused") + public TherapieplanServiceFactory( + final IOnkostarApi onkostarApi, + final SettingsService settingsService, + final FormService formService) { + this.onkostarApi = onkostarApi; + this.formService = formService; + } + public TherapieplanService currentUsableInstance() { + return new DefaultTherapieplanService(onkostarApi, formService); + } } diff --git a/src/test/java/de/itc/utils/DateFormats.java b/src/test/java/de/itc/utils/DateFormats.java index 1723f4a..8ee58e0 100644 --- a/src/test/java/de/itc/utils/DateFormats.java +++ b/src/test/java/de/itc/utils/DateFormats.java @@ -22,14 +22,13 @@ package de.itc.utils; import java.util.Date; /** - * Diese Klasse dient nur Testzwecken, da die Klasse und enthaltene(n) Methode(n) von der Onkostar-API - * benötigt und verwendet werden, nicht jedoch in der Onkostar-API-JAR enthalten sind. + * Diese Klasse dient nur Testzwecken, da die Klasse und enthaltene(n) Methode(n) von der + * Onkostar-API benötigt und verwendet werden, nicht jedoch in der Onkostar-API-JAR enthalten sind. * Das tatsächliche Verhalten innerhalb von Onkostar wird abweichen. */ public class DateFormats { - public static Date parseDate(String value) { - return null; - } - + public static Date parseDate(String value) { + return null; + } } diff --git a/src/test/java/de/itc/utils/MapUtilities.java b/src/test/java/de/itc/utils/MapUtilities.java index 9afb2a8..5e5594a 100644 --- a/src/test/java/de/itc/utils/MapUtilities.java +++ b/src/test/java/de/itc/utils/MapUtilities.java @@ -20,22 +20,20 @@ package de.itc.utils; import com.fasterxml.jackson.databind.ObjectMapper; - import java.util.LinkedHashMap; /** - * Diese Klasse dient nur Testzwecken, da die Klasse und enthaltene(n) Methode(n) von der Onkostar-API - * benötigt und verwendet werden, nicht jedoch in der Onkostar-API-JAR enthalten sind. + * Diese Klasse dient nur Testzwecken, da die Klasse und enthaltene(n) Methode(n) von der + * Onkostar-API benötigt und verwendet werden, nicht jedoch in der Onkostar-API-JAR enthalten sind. * Das tatsächliche Verhalten innerhalb von Onkostar wird abweichen. */ public class MapUtilities { - public static ObjectMapper getObjectMapper() { - return null; - } - - public static LinkedHashMap stringToMap(String value) { - return null; - } + public static ObjectMapper getObjectMapper() { + return null; + } + public static LinkedHashMap stringToMap(String value) { + return null; + } } diff --git a/src/test/java/dev/dnpm/oshelper/ConsentManagerTest.java b/src/test/java/dev/dnpm/oshelper/ConsentManagerTest.java index b0dc6a9..80e7298 100644 --- a/src/test/java/dev/dnpm/oshelper/ConsentManagerTest.java +++ b/src/test/java/dev/dnpm/oshelper/ConsentManagerTest.java @@ -19,64 +19,62 @@ package dev.dnpm.oshelper; +import static org.mockito.Mockito.*; + +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Procedure; import dev.dnpm.oshelper.analyzer.ConsentManager; import dev.dnpm.oshelper.services.consent.ConsentManagerServiceFactory; import dev.dnpm.oshelper.services.consent.MrConsentManagerService; -import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Procedure; 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.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class ConsentManagerTest { - private IOnkostarApi onkostarApi; - - private ConsentManagerServiceFactory consentManagerServiceFactory; + private IOnkostarApi onkostarApi; - private ConsentManager consentManager; + private ConsentManagerServiceFactory consentManagerServiceFactory; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock ConsentManagerServiceFactory consentManagerServiceFactory - ) { - this.onkostarApi = onkostarApi; - this.consentManagerServiceFactory = consentManagerServiceFactory; - this.consentManager = new ConsentManager(onkostarApi, consentManagerServiceFactory); - } + private ConsentManager consentManager; - @Test - void shouldRunServiceMethodsOnAnalyzeCalled() { - var consentManagerServiceMock = mock(MrConsentManagerService.class); + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock ConsentManagerServiceFactory consentManagerServiceFactory) { + this.onkostarApi = onkostarApi; + this.consentManagerServiceFactory = consentManagerServiceFactory; + this.consentManager = new ConsentManager(onkostarApi, consentManagerServiceFactory); + } - when(consentManagerServiceMock.canApply(any(Procedure.class))).thenReturn(true); + @Test + void shouldRunServiceMethodsOnAnalyzeCalled() { + var consentManagerServiceMock = mock(MrConsentManagerService.class); - when(this.consentManagerServiceFactory.currentUsableInstance()) - .thenReturn(consentManagerServiceMock); + when(consentManagerServiceMock.canApply(any(Procedure.class))).thenReturn(true); - this.consentManager.analyze(new Procedure(onkostarApi), null); + when(this.consentManagerServiceFactory.currentUsableInstance()) + .thenReturn(consentManagerServiceMock); - verify(consentManagerServiceMock, times(1)).applyConsent(any(Procedure.class)); - } + this.consentManager.analyze(new Procedure(onkostarApi), null); - @Test - void shouldNotRunServiceMethodsIfProcedureCannotBeAppliesForForm() { - var consentManagerServiceMock = mock(MrConsentManagerService.class); + verify(consentManagerServiceMock, times(1)).applyConsent(any(Procedure.class)); + } - when(consentManagerServiceMock.canApply(any(Procedure.class))).thenReturn(false); + @Test + void shouldNotRunServiceMethodsIfProcedureCannotBeAppliesForForm() { + var consentManagerServiceMock = mock(MrConsentManagerService.class); - when(this.consentManagerServiceFactory.currentUsableInstance()) - .thenReturn(consentManagerServiceMock); + when(consentManagerServiceMock.canApply(any(Procedure.class))).thenReturn(false); - this.consentManager.analyze(new Procedure(onkostarApi), null); + when(this.consentManagerServiceFactory.currentUsableInstance()) + .thenReturn(consentManagerServiceMock); - verify(consentManagerServiceMock, times(0)).applyConsent(any(Procedure.class)); - } + this.consentManager.analyze(new Procedure(onkostarApi), null); + verify(consentManagerServiceMock, times(0)).applyConsent(any(Procedure.class)); + } } diff --git a/src/test/java/dev/dnpm/oshelper/DNPMHelperTest.java b/src/test/java/dev/dnpm/oshelper/DNPMHelperTest.java index 839db4c..87f1771 100644 --- a/src/test/java/dev/dnpm/oshelper/DNPMHelperTest.java +++ b/src/test/java/dev/dnpm/oshelper/DNPMHelperTest.java @@ -19,15 +19,23 @@ package dev.dnpm.oshelper; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Item; +import de.itc.onkostar.api.Patient; +import de.itc.onkostar.api.Procedure; import dev.dnpm.oshelper.analyzer.DNPMHelper; import dev.dnpm.oshelper.security.DelegatingDataBasedPermissionEvaluator; import dev.dnpm.oshelper.security.IllegalSecuredObjectAccessException; import dev.dnpm.oshelper.security.PermissionType; import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; -import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Item; -import de.itc.onkostar.api.Patient; -import de.itc.onkostar.api.Procedure; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -39,154 +47,149 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class DNPMHelperTest { - private IOnkostarApi onkostarApi; + private IOnkostarApi onkostarApi; - private SystemtherapieService systemtherapieService; + private SystemtherapieService systemtherapieService; - private DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; + private DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; - private DNPMHelper dnpmHelper; + private DNPMHelper dnpmHelper; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock SystemtherapieService systemtherapieService, - @Mock DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.systemtherapieService = systemtherapieService; - this.delegatingDataBasedPermissionEvaluator = delegatingDataBasedPermissionEvaluator; - this.dnpmHelper = new DNPMHelper(onkostarApi, systemtherapieService, delegatingDataBasedPermissionEvaluator); - } + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock SystemtherapieService systemtherapieService, + @Mock DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator) { + this.onkostarApi = onkostarApi; + this.systemtherapieService = systemtherapieService; + this.delegatingDataBasedPermissionEvaluator = delegatingDataBasedPermissionEvaluator; + this.dnpmHelper = + new DNPMHelper(onkostarApi, systemtherapieService, delegatingDataBasedPermissionEvaluator); + } + + @Test + void testShouldRequestSystemischeTherapienFromDiagnose() { + dnpmHelper.getSystemischeTherapienFromDiagnose(Map.of("DiagnoseId", 1234)); + + var captor = ArgumentCaptor.forClass(Integer.class); + verify(systemtherapieService, times(1)).getSystemischeTherapienFromDiagnose(captor.capture()); + assertThat(captor.getValue()).isEqualTo(1234); + } + + @Test + void testShouldReturnNullIfNoDiagnoseIdCallingGetSystemischeTherapienFromDiagnose() { + var actual = dnpmHelper.getSystemischeTherapienFromDiagnose(new HashMap<>()); + + assertThat(actual).isNull(); + } + + @Test + void testShouldReturnNullIfNoProcedureIdCallingGetEmpfehlung() { + var actual = dnpmHelper.getEmpfehlung(new HashMap<>()); + + assertThat(actual).isNull(); + } + + @Nested + class UpdateEmpfehlungPrioTests { @Test - void testShouldRequestSystemischeTherapienFromDiagnose() { - dnpmHelper.getSystemischeTherapienFromDiagnose(Map.of("DiagnoseId", 1234)); + void testShouldReturnFalseIfNoRidAndNoBdCallingUpdateEmpfehlungPrio() { + var actual = dnpmHelper.updateEmpfehlungPrio(new HashMap<>()); - var captor = ArgumentCaptor.forClass(Integer.class); - verify(systemtherapieService, times(1)).getSystemischeTherapienFromDiagnose(captor.capture()); - assertThat(captor.getValue()).isEqualTo(1234); + assertThat(actual).isEqualTo(false); } @Test - void testShouldReturnNullIfNoDiagnoseIdCallingGetSystemischeTherapienFromDiagnose() { - var actual = dnpmHelper.getSystemischeTherapienFromDiagnose(new HashMap<>()); + void testShouldReturnFalseIfNoRidCallingUpdateEmpfehlungPrio() { + var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("bd", "2023-01-01")); - assertThat(actual).isNull(); + assertThat(actual).isEqualTo(false); } @Test - void testShouldReturnNullIfNoProcedureIdCallingGetEmpfehlung() { - var actual = dnpmHelper.getEmpfehlung(new HashMap<>()); + void testShouldReturnFalseIfNoBdCallingUpdateEmpfehlungPrio() { + var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234)); - assertThat(actual).isNull(); + assertThat(actual).isEqualTo(false); } - @Nested - class UpdateEmpfehlungPrioTests { - - @Test - void testShouldReturnFalseIfNoRidAndNoBdCallingUpdateEmpfehlungPrio() { - var actual = dnpmHelper.updateEmpfehlungPrio(new HashMap<>()); + @Test + void testShouldReturnTrueIfRidAndBdPresentCallingUpdateEmpfehlungPrio() { + var sessionFactory = mock(SessionFactory.class); + var session = mock(Session.class); + var query = mock(SQLQuery.class); - assertThat(actual).isEqualTo(false); - } + when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); + when(sessionFactory.getCurrentSession()).thenReturn(session); + when(session.createSQLQuery(anyString())).thenReturn(query); - @Test - void testShouldReturnFalseIfNoRidCallingUpdateEmpfehlungPrio() { - var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("bd", "2023-01-01")); + var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234, "bd", "2023-01-01")); - assertThat(actual).isEqualTo(false); - } + assertThat(actual).isEqualTo(true); + } - @Test - void testShouldReturnFalseIfNoBdCallingUpdateEmpfehlungPrio() { - var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234)); + @Test + void testShouldCreateSqlQueryWithRidAndBdCallingUpdateEmpfehlungPrio() { + var sessionFactory = mock(SessionFactory.class); + var session = mock(Session.class); + var query = mock(SQLQuery.class); - assertThat(actual).isEqualTo(false); - } + when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); + when(sessionFactory.getCurrentSession()).thenReturn(session); + when(session.createSQLQuery(anyString())).thenReturn(query); - @Test - void testShouldReturnTrueIfRidAndBdPresentCallingUpdateEmpfehlungPrio() { - var sessionFactory = mock(SessionFactory.class); - var session = mock(Session.class); - var query = mock(SQLQuery.class); + dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234, "bd", "2023-01-01")); - when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); - when(sessionFactory.getCurrentSession()).thenReturn(session); - when(session.createSQLQuery(anyString())).thenReturn(query); + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isEqualTo("UPDATE prozedur SET beginndatum = '2023-01-01' WHERE id = '1234' "); + } + } - var actual = dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234, "bd", "2023-01-01")); + @Nested + class GetProzedurenFromDiagnoseTests { + @Test + void testShouldReturnEmptyStringOnParamCheckIfNoDataFormParamGiven() { + var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("DiagnoseId", 1, "PatientId", 2)); + assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - assertThat(actual).isEqualTo(true); - } + verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); + } - @Test - void testShouldCreateSqlQueryWithRidAndBdCallingUpdateEmpfehlungPrio() { - var sessionFactory = mock(SessionFactory.class); - var session = mock(Session.class); - var query = mock(SQLQuery.class); + @Test + void testShouldReturnEmptyStringOnParamCheckIfNoDiagnoseIdParamGiven() { + var actual = + dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "PatientId", 2)); + assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); - when(sessionFactory.getCurrentSession()).thenReturn(session); - when(session.createSQLQuery(anyString())).thenReturn(query); + verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); + } - dnpmHelper.updateEmpfehlungPrio(Map.of("rid", 1234, "bd", "2023-01-01")); + @Test + void testShouldReturnEmptyStringOnParamCheckIfNoPatientIdParamGiven() { + var actual = + dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "DiagnoseId", 1)); + assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).isEqualTo("UPDATE prozedur SET beginndatum = '2023-01-01' WHERE id = '1234' "); - } + verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); + } + @Test + void testShouldRequestProceduresIfRequiredParamsGiven() { + dnpmHelper.getProzedurenFromDiagnose( + Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); + verify(onkostarApi, times(1)).getProceduresByPatientId(anyInt()); } - @Nested - class GetProzedurenFromDiagnoseTests { - @Test - void testShouldReturnEmptyStringOnParamCheckIfNoDataFormParamGiven() { - var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("DiagnoseId", 1, "PatientId", 2)); - assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - - verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); - } - - @Test - void testShouldReturnEmptyStringOnParamCheckIfNoDiagnoseIdParamGiven() { - var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "PatientId", 2)); - assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - - verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); - } - - @Test - void testShouldReturnEmptyStringOnParamCheckIfNoPatientIdParamGiven() { - var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "DiagnoseId", 1)); - assertThat(actual).isExactlyInstanceOf(String.class).isEmpty(); - - verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); - } - - @Test - void testShouldRequestProceduresIfRequiredParamsGiven() { - dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); - verify(onkostarApi, times(1)).getProceduresByPatientId(anyInt()); - } - - @Test - void testShouldNotReturnProceduresNotRelatedToDisease() { - doAnswer(invocationOnMock -> { + @Test + void testShouldNotReturnProceduresNotRelatedToDisease() { + doAnswer( + invocationOnMock -> { var procedure = new Procedure(onkostarApi); procedure.setFormName("OS.Example1"); procedure.setId(11); @@ -194,15 +197,20 @@ class DNPMHelperTest { procedure.setValue("formfield", new Item("formfield", "Wert11")); return List.of(procedure); - }).when(onkostarApi).getProceduresByPatientId(anyInt()); - - var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); - assertThat(actual).isEqualTo("[]"); - } + }) + .when(onkostarApi) + .getProceduresByPatientId(anyInt()); + + var actual = + dnpmHelper.getProzedurenFromDiagnose( + Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); + assertThat(actual).isEqualTo("[]"); + } - @Test - void testShouldReturnProcedures() { - doAnswer(invocationOnMock -> { + @Test + void testShouldReturnProcedures() { + doAnswer( + invocationOnMock -> { var procedure1 = new Procedure(onkostarApi); procedure1.setFormName("OS.Example1"); procedure1.setId(11); @@ -225,90 +233,102 @@ class DNPMHelperTest { procedure3.setValue("formfield", new Item("formfield", "Wert12")); return List.of(procedure1, procedure2, procedure3); - }).when(onkostarApi).getProceduresByPatientId(anyInt()); - - var actual = dnpmHelper.getProzedurenFromDiagnose(Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); - assertThat(actual).contains("OS.Example1", "OS.Example2", "Wert11", "Wert21", "Wert12"); - } + }) + .when(onkostarApi) + .getProceduresByPatientId(anyInt()); + + var actual = + dnpmHelper.getProzedurenFromDiagnose( + Map.of("dataForm", "OS.Example", "DiagnoseId", 1, "PatientId", 2)); + assertThat(actual).contains("OS.Example1", "OS.Example2", "Wert11", "Wert21", "Wert12"); } + } - @Nested - class GetVerweiseTests { + @Nested + class GetVerweiseTests { - @Test - void testShouldReturnEmptyArrayIfNoProcedureIdParamGiven() { - var actual = dnpmHelper.getVerweise(Map.of("PatientId", 2)); - assertThat(actual).isNull(); + @Test + void testShouldReturnEmptyArrayIfNoProcedureIdParamGiven() { + var actual = dnpmHelper.getVerweise(Map.of("PatientId", 2)); + assertThat(actual).isNull(); - verify(onkostarApi, times(0)).getSessionFactory(); - } + verify(onkostarApi, times(0)).getSessionFactory(); + } - @Test - void testShouldReturnEmptyArrayIfNoPatientIdParamGiven() { - var actual = dnpmHelper.getVerweise(Map.of("ProcedureId", 1)); - assertThat(actual).isNull(); + @Test + void testShouldReturnEmptyArrayIfNoPatientIdParamGiven() { + var actual = dnpmHelper.getVerweise(Map.of("ProcedureId", 1)); + assertThat(actual).isNull(); - verify(onkostarApi, times(0)).getSessionFactory(); - } + verify(onkostarApi, times(0)).getSessionFactory(); + } - @Test - void testShouldRequestSessionFactoryIfRequiredParamsGiven() { - dnpmHelper.getVerweise(Map.of("ProcedureId", 1, "PatientId", 2)); - verify(onkostarApi, times(1)).getSessionFactory(); - } + @Test + void testShouldRequestSessionFactoryIfRequiredParamsGiven() { + dnpmHelper.getVerweise(Map.of("ProcedureId", 1, "PatientId", 2)); + verify(onkostarApi, times(1)).getSessionFactory(); + } - @Test - void testShouldCreateSqlQueryWithPatientId() { - var sessionFactory = mock(SessionFactory.class); - var session = mock(Session.class); - var query = mock(SQLQuery.class); + @Test + void testShouldCreateSqlQueryWithPatientId() { + var sessionFactory = mock(SessionFactory.class); + var session = mock(Session.class); + var query = mock(SQLQuery.class); - when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); - when(sessionFactory.getCurrentSession()).thenReturn(session); - when(session.createSQLQuery(anyString())).thenReturn(query); + when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); + when(sessionFactory.getCurrentSession()).thenReturn(session); + when(session.createSQLQuery(anyString())).thenReturn(query); - dnpmHelper.getVerweise(Map.of("ProcedureId", 1, "PatientId", 2)); + dnpmHelper.getVerweise(Map.of("ProcedureId", 1, "PatientId", 2)); - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).contains("WHERE patient_id = 2 AND geloescht = 0"); - } + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).contains("WHERE patient_id = 2 AND geloescht = 0"); + } - @Test - void testShouldReturnEcogStatusList() { - when(delegatingDataBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(true); + @Test + void testShouldReturnEcogStatusList() { + when(delegatingDataBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); - doAnswer(invocationOnMock -> { + doAnswer( + invocationOnMock -> { var id = invocationOnMock.getArgument(0, Integer.class); var patient = new Patient(onkostarApi); patient.setId(id); return patient; - }).when(onkostarApi).getPatient(anyInt()); + }) + .when(onkostarApi) + .getPatient(anyInt()); - dnpmHelper.getEcogStatus(Map.of("PatientId", 42)); + dnpmHelper.getEcogStatus(Map.of("PatientId", 42)); - var argumentCaptor = ArgumentCaptor.forClass(Patient.class); - verify(systemtherapieService, times(1)).ecogStatus(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).isNotNull(); - assertThat(argumentCaptor.getValue().getId()).isEqualTo(42); - } + var argumentCaptor = ArgumentCaptor.forClass(Patient.class); + verify(systemtherapieService, times(1)).ecogStatus(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).isNotNull(); + assertThat(argumentCaptor.getValue().getId()).isEqualTo(42); + } - @Test - void testShouldNotReturnEcogStatusListIfNoPermissionGranted() { - when(delegatingDataBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(false); + @Test + void testShouldNotReturnEcogStatusListIfNoPermissionGranted() { + when(delegatingDataBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(false); - doAnswer(invocationOnMock -> { + doAnswer( + invocationOnMock -> { var id = invocationOnMock.getArgument(0, Integer.class); var patient = new Patient(onkostarApi); patient.setId(id); return patient; - }).when(onkostarApi).getPatient(anyInt()); - - assertThrows(IllegalSecuredObjectAccessException.class, () -> dnpmHelper.getEcogStatus(Map.of("PatientId", 42))); - } + }) + .when(onkostarApi) + .getPatient(anyInt()); + assertThrows( + IllegalSecuredObjectAccessException.class, + () -> dnpmHelper.getEcogStatus(Map.of("PatientId", 42))); } - + } } diff --git a/src/test/java/dev/dnpm/oshelper/MerkmalskatalogTest.java b/src/test/java/dev/dnpm/oshelper/MerkmalskatalogTest.java index f57dd8f..e393d17 100644 --- a/src/test/java/dev/dnpm/oshelper/MerkmalskatalogTest.java +++ b/src/test/java/dev/dnpm/oshelper/MerkmalskatalogTest.java @@ -19,8 +19,12 @@ package dev.dnpm.oshelper; -import dev.dnpm.oshelper.analyzer.Merkmalskatalog; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; +import dev.dnpm.oshelper.analyzer.Merkmalskatalog; +import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -31,57 +35,49 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class MerkmalskatalogTest { - private IOnkostarApi onkostarApi; - - private Merkmalskatalog merkmalskatalog; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.merkmalskatalog = new Merkmalskatalog(onkostarApi); - } + private Merkmalskatalog merkmalskatalog; - @Test - void testShouldReturnNullOnParamCheckIfNoMerkmalskatalogParamGiven() { - var actual = merkmalskatalog.getMerkmalskatalog(Map.of("Spalten", "id, code")); - assertThat(actual).isNull(); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.merkmalskatalog = new Merkmalskatalog(onkostarApi); + } - verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); - } + @Test + void testShouldReturnNullOnParamCheckIfNoMerkmalskatalogParamGiven() { + var actual = merkmalskatalog.getMerkmalskatalog(Map.of("Spalten", "id, code")); + assertThat(actual).isNull(); - @Test - void testShouldReturnNullOnParamCheckIfNoSpaltenParamGiven() { - var actual = merkmalskatalog.getMerkmalskatalog(Map.of("Merkmalskatalog", "MK1")); - assertThat(actual).isNull(); + verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); + } - verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); - } + @Test + void testShouldReturnNullOnParamCheckIfNoSpaltenParamGiven() { + var actual = merkmalskatalog.getMerkmalskatalog(Map.of("Merkmalskatalog", "MK1")); + assertThat(actual).isNull(); - @Test - void testShouldCreateSqlQueryWithMerkmalskatalog() { - var sessionFactory = mock(SessionFactory.class); - var session = mock(Session.class); - var query = mock(SQLQuery.class); + verify(onkostarApi, times(0)).getProceduresByPatientId(anyInt()); + } - when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); - when(sessionFactory.getCurrentSession()).thenReturn(session); - when(session.createSQLQuery(anyString())).thenReturn(query); + @Test + void testShouldCreateSqlQueryWithMerkmalskatalog() { + var sessionFactory = mock(SessionFactory.class); + var session = mock(Session.class); + var query = mock(SQLQuery.class); - merkmalskatalog.getMerkmalskatalog(Map.of("Merkmalskatalog", "MK1", "Spalten", "id, code")); + when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); + when(sessionFactory.getCurrentSession()).thenReturn(session); + when(session.createSQLQuery(anyString())).thenReturn(query); - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).contains("WHERE name = 'MK1' AND aktiv = 1"); - } + merkmalskatalog.getMerkmalskatalog(Map.of("Merkmalskatalog", "MK1", "Spalten", "id, code")); + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(session, times(1)).createSQLQuery(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).contains("WHERE name = 'MK1' AND aktiv = 1"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/analyzer/AnalyzerUtilsTest.java b/src/test/java/dev/dnpm/oshelper/analyzer/AnalyzerUtilsTest.java index 009ce34..18100a6 100644 --- a/src/test/java/dev/dnpm/oshelper/analyzer/AnalyzerUtilsTest.java +++ b/src/test/java/dev/dnpm/oshelper/analyzer/AnalyzerUtilsTest.java @@ -19,138 +19,141 @@ package dev.dnpm.oshelper.analyzer; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; +import static org.assertj.core.api.Assertions.assertThat; import java.util.Map; import java.util.Optional; import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; class AnalyzerUtilsTest { - private final Map<String, Object> input = Map.of("value1", 1, "valueA", "A", "valueTrue", true); - - private static Set<TestTypeData> 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) - ); + private final Map<String, Object> input = Map.of("value1", 1, "valueA", "A", "valueTrue", true); + + private static Set<TestTypeData> 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> 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; } - @ParameterizedTest - @MethodSource("testTypeData") - void testShouldReturnExpectedResultForTypedCheck(TestTypeData testData) { - var actual = AnalyzerUtils.requiredValuePresent(input, testData.key, testData.type); - assertThat(actual).isEqualTo(testData.result); + public TestTypeData withExpectedResult(boolean result) { + this.result = result; + return this; } - private static Set<TestMatchData> 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); + @Override + public String toString() { + return String.format("key: '%s', type: %s, result: %s", key, type.getSimpleName(), 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(); - } + private static class TestMatchData { + public final String key; + public final String regexp; - @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")); + public boolean result; - 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(); + public TestMatchData(String key, String regexp) { + this.key = key; + this.regexp = regexp; } - @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(); + public TestMatchData withExpectedResult(boolean result) { + this.result = result; + return this; } - 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); - } + @Override + public String toString() { + return String.format("key: '%s', regexp: '%s', result: %s", key, regexp, 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); - } - } - + } } diff --git a/src/test/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzerTest.java b/src/test/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzerTest.java index 092e85d..3e33574 100644 --- a/src/test/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzerTest.java +++ b/src/test/java/dev/dnpm/oshelper/analyzer/EinzelempfehlungAnalyzerTest.java @@ -19,12 +19,17 @@ package dev.dnpm.oshelper.analyzer; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Procedure; import dev.dnpm.oshelper.security.PermissionType; import dev.dnpm.oshelper.security.PersonPoolBasedPermissionEvaluator; import dev.dnpm.oshelper.services.StudienService; import dev.dnpm.oshelper.services.molekulargenetik.MolekulargenetikFormService; -import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Procedure; +import java.util.HashMap; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -32,91 +37,88 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.HashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class EinzelempfehlungAnalyzerTest { - private IOnkostarApi onkostarApi; - - private StudienService studienService; - - private MolekulargenetikFormService molekulargenetikFormService; - - private PersonPoolBasedPermissionEvaluator permissionEvaluator; - - private EinzelempfehlungAnalyzer analyzer; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock StudienService studienService, - @Mock MolekulargenetikFormService molekulargenetikFormService, - @Mock PersonPoolBasedPermissionEvaluator permissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.studienService = studienService; - this.molekulargenetikFormService = molekulargenetikFormService; - this.permissionEvaluator = permissionEvaluator; - this.analyzer = new EinzelempfehlungAnalyzer(onkostarApi, studienService, molekulargenetikFormService, permissionEvaluator); - } - - @Test - void testShouldRequestVariantsFromMolekulargenetikFormService() { - doAnswer(invocationOnMock -> new Procedure(this.onkostarApi)).when(onkostarApi).getProcedure(anyInt()); - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(true); - - analyzer.getVariants(Map.of("id", 123)); - verify(molekulargenetikFormService, times(1)).getVariants(any(Procedure.class)); - } - - @Test - void shouldRequestAllStudienForEmptyQueryString() { - var input = Map.of("q", (Object) " "); - this.analyzer.getStudien(input); - - verify(studienService, times(1)).findActive(); - } - - @Test - void shouldRequestActiveStudienForEmptyInputMap() { - var input = new HashMap<String, Object>(); - this.analyzer.getStudien(input); - - verify(studienService, times(1)).findActive(); - } - - @Test - void shouldRequestFilteredActiveStudien() { - var input = Map.of("q", (Object) "NCT-123"); - this.analyzer.getStudien(input); - - var captor = ArgumentCaptor.forClass(String.class); - verify(studienService, times(1)).findActiveByQuery(captor.capture()); - assertThat(captor.getValue()).isEqualTo("NCT-123"); - } - - @Test - void shouldRequestActiveStudien() { - var input = Map.of("q", (Object) ""); - this.analyzer.getStudien(input); - - verify(studienService, times(1)).findActive(); - } - - @Test - void shouldRequestAllFilteredtudien() { - var input = Map.of("q", (Object) "NCT-123"); - this.analyzer.getStudien(input); - - var captor = ArgumentCaptor.forClass(String.class); - verify(studienService, times(1)).findActiveByQuery(captor.capture()); - assertThat(captor.getValue()).isEqualTo("NCT-123"); - } - + private IOnkostarApi onkostarApi; + + private StudienService studienService; + + private MolekulargenetikFormService molekulargenetikFormService; + + private PersonPoolBasedPermissionEvaluator permissionEvaluator; + + private EinzelempfehlungAnalyzer analyzer; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock StudienService studienService, + @Mock MolekulargenetikFormService molekulargenetikFormService, + @Mock PersonPoolBasedPermissionEvaluator permissionEvaluator) { + this.onkostarApi = onkostarApi; + this.studienService = studienService; + this.molekulargenetikFormService = molekulargenetikFormService; + this.permissionEvaluator = permissionEvaluator; + this.analyzer = + new EinzelempfehlungAnalyzer( + onkostarApi, studienService, molekulargenetikFormService, permissionEvaluator); + } + + @Test + void testShouldRequestVariantsFromMolekulargenetikFormService() { + doAnswer(invocationOnMock -> new Procedure(this.onkostarApi)) + .when(onkostarApi) + .getProcedure(anyInt()); + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(true); + + analyzer.getVariants(Map.of("id", 123)); + verify(molekulargenetikFormService, times(1)).getVariants(any(Procedure.class)); + } + + @Test + void shouldRequestAllStudienForEmptyQueryString() { + var input = Map.of("q", (Object) " "); + this.analyzer.getStudien(input); + + verify(studienService, times(1)).findActive(); + } + + @Test + void shouldRequestActiveStudienForEmptyInputMap() { + var input = new HashMap<String, Object>(); + this.analyzer.getStudien(input); + + verify(studienService, times(1)).findActive(); + } + + @Test + void shouldRequestFilteredActiveStudien() { + var input = Map.of("q", (Object) "NCT-123"); + this.analyzer.getStudien(input); + + var captor = ArgumentCaptor.forClass(String.class); + verify(studienService, times(1)).findActiveByQuery(captor.capture()); + assertThat(captor.getValue()).isEqualTo("NCT-123"); + } + + @Test + void shouldRequestActiveStudien() { + var input = Map.of("q", (Object) ""); + this.analyzer.getStudien(input); + + verify(studienService, times(1)).findActive(); + } + + @Test + void shouldRequestAllFilteredtudien() { + var input = Map.of("q", (Object) "NCT-123"); + this.analyzer.getStudien(input); + + var captor = ArgumentCaptor.forClass(String.class); + verify(studienService, times(1)).findActiveByQuery(captor.capture()); + assertThat(captor.getValue()).isEqualTo("NCT-123"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzerTest.java b/src/test/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzerTest.java index ee06c35..3a9b03f 100644 --- a/src/test/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzerTest.java +++ b/src/test/java/dev/dnpm/oshelper/analyzer/FollowUpAnalyzerTest.java @@ -19,6 +19,9 @@ package dev.dnpm.oshelper.analyzer; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; @@ -29,71 +32,65 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class FollowUpAnalyzerTest { - private IOnkostarApi onkostarApi; - - private FollowUpAnalyzer followUpAnalyzer; + private IOnkostarApi onkostarApi; - @BeforeEach - void setUp( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.followUpAnalyzer = new FollowUpAnalyzer(onkostarApi); - } + private FollowUpAnalyzer followUpAnalyzer; - @Test - void shouldBacklinkEinzelempfehlungUsingOnkostarApi() throws Exception { - var einzelempfehlung = new Procedure(onkostarApi); - einzelempfehlung.setId(1234); + @BeforeEach + void setUp(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.followUpAnalyzer = new FollowUpAnalyzer(onkostarApi); + } - when(onkostarApi.getProcedure(anyInt())).thenReturn(einzelempfehlung); + @Test + void shouldBacklinkEinzelempfehlungUsingOnkostarApi() throws Exception { + var einzelempfehlung = new Procedure(onkostarApi); + einzelempfehlung.setId(1234); - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", 1234)); + when(onkostarApi.getProcedure(anyInt())).thenReturn(einzelempfehlung); - followUpAnalyzer.analyze(procedure, null); + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", 1234)); - var procedureIdCaptor = ArgumentCaptor.forClass(Integer.class); - verify(onkostarApi, times(1)).getProcedure(procedureIdCaptor.capture()); - assertThat(procedureIdCaptor.getValue()).isEqualTo(einzelempfehlung.getId()); + followUpAnalyzer.analyze(procedure, null); - var procedureCaptor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(procedureCaptor.capture()); - assertThat(procedureCaptor.getValue()).isNotNull(); - assertThat(procedureCaptor.getValue().getId()).isEqualTo(einzelempfehlung.getId()); - } + var procedureIdCaptor = ArgumentCaptor.forClass(Integer.class); + verify(onkostarApi, times(1)).getProcedure(procedureIdCaptor.capture()); + assertThat(procedureIdCaptor.getValue()).isEqualTo(einzelempfehlung.getId()); - @Test - void shouldNotBacklinkEinzelempfehlungIfNoEinzelempfehlungSelected() throws Exception { - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); + var procedureCaptor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(procedureCaptor.capture()); + assertThat(procedureCaptor.getValue()).isNotNull(); + assertThat(procedureCaptor.getValue().getId()).isEqualTo(einzelempfehlung.getId()); + } - followUpAnalyzer.analyze(procedure, null); + @Test + void shouldNotBacklinkEinzelempfehlungIfNoEinzelempfehlungSelected() throws Exception { + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); - verify(onkostarApi, times(0)).getProcedure(anyInt()); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class)); - } + followUpAnalyzer.analyze(procedure, null); - @Test - void shouldNotBacklinkEinzelempfehlungIfEinzelempfehlungDoesNotExist() throws Exception { - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", 1234)); + verify(onkostarApi, times(0)).getProcedure(anyInt()); + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class)); + } - followUpAnalyzer.analyze(procedure, null); + @Test + void shouldNotBacklinkEinzelempfehlungIfEinzelempfehlungDoesNotExist() throws Exception { + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", 1234)); - var procedureIdCaptor = ArgumentCaptor.forClass(Integer.class); - verify(onkostarApi, times(1)).getProcedure(procedureIdCaptor.capture()); - assertThat(procedureIdCaptor.getValue()).isEqualTo(1234); + followUpAnalyzer.analyze(procedure, null); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class)); - } + var procedureIdCaptor = ArgumentCaptor.forClass(Integer.class); + verify(onkostarApi, times(1)).getProcedure(procedureIdCaptor.capture()); + assertThat(procedureIdCaptor.getValue()).isEqualTo(1234); + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class)); + } } diff --git a/src/test/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzerTest.java b/src/test/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzerTest.java index c1f0b28..41a658a 100644 --- a/src/test/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzerTest.java +++ b/src/test/java/dev/dnpm/oshelper/analyzer/TherapieMitEcogAnalyzerTest.java @@ -19,10 +19,17 @@ package dev.dnpm.oshelper.analyzer; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import de.itc.onkostar.api.*; import dev.dnpm.oshelper.dto.EcogStatusWithDate; import dev.dnpm.oshelper.services.strahlentherapie.StrahlentherapieService; import dev.dnpm.oshelper.services.systemtherapie.SystemtherapieService; -import de.itc.onkostar.api.*; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -30,154 +37,153 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class TherapieMitEcogAnalyzerTest { - private IOnkostarApi onkostarApi; - - private StrahlentherapieService strahlentherapieService; - - private SystemtherapieService systemtherapieService; - - private TherapieMitEcogAnalyzer therapieMitEcogAnalyzer; - - private Disease dummyDisease(int id, Date diagnosisDate) { - var disease = new Disease(onkostarApi); - disease.setId(id); - disease.setDiagnosisDate(diagnosisDate); - return disease; - } - - private Date daysPassed(int days) { - return Date.from(Instant.now().minus(days, ChronoUnit.DAYS)); - } - - @BeforeEach - void setUp( - @Mock IOnkostarApi onkostarApi, - @Mock StrahlentherapieService strahlentherapieService, - @Mock SystemtherapieService systemtherapieService - ) { - this.onkostarApi = onkostarApi; - this.strahlentherapieService = strahlentherapieService; - this.systemtherapieService = systemtherapieService; - this.therapieMitEcogAnalyzer = new TherapieMitEcogAnalyzer(onkostarApi, strahlentherapieService, systemtherapieService); - } - - @Test - void shouldInsertNewEcogStatus() throws Exception { - final var diagnosisDate = daysPassed(7); - final var ecogDate = daysPassed(1); - final var procedureDate = daysPassed(1); - - doAnswer(invocationOnMock -> List.of(new EcogStatusWithDate(ecogDate, "0"))) - .when(systemtherapieService).ecogStatus(any(Patient.class)); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setStartDate(procedureDate); - procedure.setEditState(ProcedureEditStateType.COMPLETED); - procedure.setPatientId(1); - procedure.setPatient(patient); - procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - doAnswer(invocationOnMock -> List.of(dummyDisease(42, diagnosisDate))).when(this.onkostarApi).getDiseasesByPatientId(anyInt()); - - doAnswer(invocationOnMock -> List.of(procedure)).when(onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); - - var idCaptor = ArgumentCaptor.forClass(Integer.class); - var formNameCaptor = ArgumentCaptor.forClass(String.class); - verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(idCaptor.capture(), formNameCaptor.capture()); - assertThat(idCaptor.getValue()).isEqualTo(42); - assertThat(formNameCaptor.getValue()).isEqualTo("DNPM Klinik/Anamnese"); - - verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldNotModifyEcogStatusIfNoCompletedSystemTherapy() throws Exception { - final var diagnosisDate = daysPassed(7); - final var procedureDate = daysPassed(1); - - doAnswer(invocationOnMock -> List.of()) - .when(systemtherapieService).ecogStatus(any(Patient.class)); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setStartDate(procedureDate); - procedure.setEditState(ProcedureEditStateType.COMPLETED); - procedure.setPatientId(1); - procedure.setPatient(patient); - procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); - - verify(onkostarApi, times(0)).getProceduresForDiseaseByForm(anyInt(), anyString()); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldNotIncludeEcogStatusBeforeDiagnosisDate() throws Exception { - final var diagnosisDate = daysPassed(7); - final var ecogDate = daysPassed(28); - final var procedureDate = daysPassed(1); - - doAnswer(invocationOnMock -> List.of(new EcogStatusWithDate(ecogDate, "0"))) - .when(systemtherapieService).ecogStatus(any(Patient.class)); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setStartDate(procedureDate); - procedure.setEditState(ProcedureEditStateType.COMPLETED); - procedure.setPatientId(1); - procedure.setPatient(patient); - procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); - - verify(onkostarApi, times(0)).getProceduresForDiseaseByForm(anyInt(), anyString()); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldRequestEcogFromStrahlentherapieAndSystemtherapie() { - final var diagnosisDate = daysPassed(7); - final var procedureDate = daysPassed(1); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var procedure = new Procedure(onkostarApi); - procedure.setId(1000); - procedure.setStartDate(procedureDate); - procedure.setEditState(ProcedureEditStateType.COMPLETED); - procedure.setPatientId(1); - procedure.setPatient(patient); - procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); - - verify(strahlentherapieService, times(1)).ecogStatus(any()); - verify(systemtherapieService, times(1)).ecogStatus(any()); - } - + private IOnkostarApi onkostarApi; + + private StrahlentherapieService strahlentherapieService; + + private SystemtherapieService systemtherapieService; + + private TherapieMitEcogAnalyzer therapieMitEcogAnalyzer; + + private Disease dummyDisease(int id, Date diagnosisDate) { + var disease = new Disease(onkostarApi); + disease.setId(id); + disease.setDiagnosisDate(diagnosisDate); + return disease; + } + + private Date daysPassed(int days) { + return Date.from(Instant.now().minus(days, ChronoUnit.DAYS)); + } + + @BeforeEach + void setUp( + @Mock IOnkostarApi onkostarApi, + @Mock StrahlentherapieService strahlentherapieService, + @Mock SystemtherapieService systemtherapieService) { + this.onkostarApi = onkostarApi; + this.strahlentherapieService = strahlentherapieService; + this.systemtherapieService = systemtherapieService; + this.therapieMitEcogAnalyzer = + new TherapieMitEcogAnalyzer(onkostarApi, strahlentherapieService, systemtherapieService); + } + + @Test + void shouldInsertNewEcogStatus() throws Exception { + final var diagnosisDate = daysPassed(7); + final var ecogDate = daysPassed(1); + final var procedureDate = daysPassed(1); + + doAnswer(invocationOnMock -> List.of(new EcogStatusWithDate(ecogDate, "0"))) + .when(systemtherapieService) + .ecogStatus(any(Patient.class)); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setStartDate(procedureDate); + procedure.setEditState(ProcedureEditStateType.COMPLETED); + procedure.setPatientId(1); + procedure.setPatient(patient); + procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + doAnswer(invocationOnMock -> List.of(dummyDisease(42, diagnosisDate))) + .when(this.onkostarApi) + .getDiseasesByPatientId(anyInt()); + + doAnswer(invocationOnMock -> List.of(procedure)) + .when(onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); + + var idCaptor = ArgumentCaptor.forClass(Integer.class); + var formNameCaptor = ArgumentCaptor.forClass(String.class); + verify(onkostarApi, times(1)) + .getProceduresForDiseaseByForm(idCaptor.capture(), formNameCaptor.capture()); + assertThat(idCaptor.getValue()).isEqualTo(42); + assertThat(formNameCaptor.getValue()).isEqualTo("DNPM Klinik/Anamnese"); + + verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldNotModifyEcogStatusIfNoCompletedSystemTherapy() throws Exception { + final var diagnosisDate = daysPassed(7); + final var procedureDate = daysPassed(1); + + doAnswer(invocationOnMock -> List.of()) + .when(systemtherapieService) + .ecogStatus(any(Patient.class)); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setStartDate(procedureDate); + procedure.setEditState(ProcedureEditStateType.COMPLETED); + procedure.setPatientId(1); + procedure.setPatient(patient); + procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); + + verify(onkostarApi, times(0)).getProceduresForDiseaseByForm(anyInt(), anyString()); + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldNotIncludeEcogStatusBeforeDiagnosisDate() throws Exception { + final var diagnosisDate = daysPassed(7); + final var ecogDate = daysPassed(28); + final var procedureDate = daysPassed(1); + + doAnswer(invocationOnMock -> List.of(new EcogStatusWithDate(ecogDate, "0"))) + .when(systemtherapieService) + .ecogStatus(any(Patient.class)); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setStartDate(procedureDate); + procedure.setEditState(ProcedureEditStateType.COMPLETED); + procedure.setPatientId(1); + procedure.setPatient(patient); + procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); + + verify(onkostarApi, times(0)).getProceduresForDiseaseByForm(anyInt(), anyString()); + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldRequestEcogFromStrahlentherapieAndSystemtherapie() { + final var diagnosisDate = daysPassed(7); + final var procedureDate = daysPassed(1); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var procedure = new Procedure(onkostarApi); + procedure.setId(1000); + procedure.setStartDate(procedureDate); + procedure.setEditState(ProcedureEditStateType.COMPLETED); + procedure.setPatientId(1); + procedure.setPatient(patient); + procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + therapieMitEcogAnalyzer.analyze(procedure, dummyDisease(10, diagnosisDate)); + + verify(strahlentherapieService, times(1)).ecogStatus(any()); + verify(systemtherapieService, times(1)).ecogStatus(any()); + } } diff --git a/src/test/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzerTest.java b/src/test/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzerTest.java index 0ee1ef8..dc75e51 100644 --- a/src/test/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzerTest.java +++ b/src/test/java/dev/dnpm/oshelper/analyzer/TherapieplanAnalyzerTest.java @@ -19,6 +19,8 @@ package dev.dnpm.oshelper.analyzer; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; import dev.dnpm.oshelper.services.FormService; @@ -30,35 +32,29 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class TherapieplanAnalyzerTest { - @Mock - private IOnkostarApi onkostarApi; - - @Mock - private FormService formService; + @Mock private IOnkostarApi onkostarApi; - @Mock - private TherapieplanServiceFactory therapieplanServiceFactory; + @Mock private FormService formService; - private TherapieplanAnalyzer therapieplanAnalyzer; + @Mock private TherapieplanServiceFactory therapieplanServiceFactory; - @BeforeEach - void setUp() { - this.therapieplanAnalyzer = new TherapieplanAnalyzer(therapieplanServiceFactory); - } + private TherapieplanAnalyzer therapieplanAnalyzer; - @Test - void shouldRunServiceMethodsOnAnalyzeCalled() { - when(this.therapieplanServiceFactory.currentUsableInstance()) - .thenReturn(new DefaultTherapieplanService(onkostarApi, formService)); + @BeforeEach + void setUp() { + this.therapieplanAnalyzer = new TherapieplanAnalyzer(therapieplanServiceFactory); + } - this.therapieplanAnalyzer.analyze(new Procedure(onkostarApi), null); + @Test + void shouldRunServiceMethodsOnAnalyzeCalled() { + when(this.therapieplanServiceFactory.currentUsableInstance()) + .thenReturn(new DefaultTherapieplanService(onkostarApi, formService)); - verify(this.therapieplanServiceFactory, times(1)).currentUsableInstance(); - } + this.therapieplanAnalyzer.analyze(new Procedure(onkostarApi), null); + verify(this.therapieplanServiceFactory, times(1)).currentUsableInstance(); + } } diff --git a/src/test/java/dev/dnpm/oshelper/atc/AgentCodeServiceTest.java b/src/test/java/dev/dnpm/oshelper/atc/AgentCodeServiceTest.java index 7516b08..95030b5 100644 --- a/src/test/java/dev/dnpm/oshelper/atc/AgentCodeServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/atc/AgentCodeServiceTest.java @@ -19,65 +19,61 @@ package dev.dnpm.oshelper.atc; -import dev.dnpm.oshelper.atc.services.AgentCodeService; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import dev.dnpm.oshelper.atc.services.AgentCodeService; import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.Test; class AgentCodeServiceTest { - @Test - void shouldReturnLatestAvailableAgentCodeVersion() { - var testAgentCodes = List.of( - new AtcCode("A01AD05", "Acetylsalicylsäure"), - new AtcCode("A01AD05", "Acetylsalicylsäure", "2025"), - new AtcCode("A01AD05", "Acetylsalicylsäure", "2026"), - new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), - new UnregisteredCode("", "Acetylsalicylsäure") - ); - - var actual = AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byNameAndCode); + @Test + void shouldReturnLatestAvailableAgentCodeVersion() { + var testAgentCodes = + List.of( + new AtcCode("A01AD05", "Acetylsalicylsäure"), + new AtcCode("A01AD05", "Acetylsalicylsäure", "2025"), + new AtcCode("A01AD05", "Acetylsalicylsäure", "2026"), + new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), + new UnregisteredCode("", "Acetylsalicylsäure")); - assertThat(actual).containsAll( - List.of( - new AtcCode("A01AD05", "Acetylsalicylsäure", "2026"), - new UnregisteredCode("", "Acetylsalicylsäure") - ) - ); - } + var actual = + AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byNameAndCode); - @Test - void shouldReturnLatestAvailableAgentCodeVersionByNameOnly() { - var testAgentCodes = List.of( - new AtcCode("A01AD05", "Acetylsalicylsäure"), - new AtcCode("A01AD05", "Acetylsalicylsäure", "2025"), + assertThat(actual) + .containsAll( + List.of( new AtcCode("A01AD05", "Acetylsalicylsäure", "2026"), - new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), - new UnregisteredCode("", "Acetylsalicylsäure") - ); + new UnregisteredCode("", "Acetylsalicylsäure"))); + } - var actual = AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byCodeOnly); + @Test + void shouldReturnLatestAvailableAgentCodeVersionByNameOnly() { + var testAgentCodes = + List.of( + new AtcCode("A01AD05", "Acetylsalicylsäure"), + new AtcCode("A01AD05", "Acetylsalicylsäure", "2025"), + new AtcCode("A01AD05", "Acetylsalicylsäure", "2026"), + new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), + new UnregisteredCode("", "Acetylsalicylsäure")); - assertThat(actual).containsExactly( - new AtcCode("A01AD05", "Acetylsalicylsäure", "2026") - ); - } + var actual = + AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byCodeOnly); - @Test - void shouldReturnLatestAvailableAgentCodeWithoutVersionVersionByNameOnly() { - var testAgentCodes = List.of( - new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), - new AtcCode("A01AD05", "Acetylsalicylsäure"), - new UnregisteredCode("", "Acetylsalicylsäure") - ); + assertThat(actual).containsExactly(new AtcCode("A01AD05", "Acetylsalicylsäure", "2026")); + } - var actual = AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byCodeOnly); + @Test + void shouldReturnLatestAvailableAgentCodeWithoutVersionVersionByNameOnly() { + var testAgentCodes = + List.of( + new UnregisteredCode("A01AD05", "Acetylsalicylsäure"), + new AtcCode("A01AD05", "Acetylsalicylsäure"), + new UnregisteredCode("", "Acetylsalicylsäure")); - assertThat(actual).containsExactly( - new AtcCode("A01AD05", "Acetylsalicylsäure") - ); - } + var actual = + AgentCodeService.latestAgentCodeVersions(testAgentCodes, AgentCodeService.byCodeOnly); + assertThat(actual).containsExactly(new AtcCode("A01AD05", "Acetylsalicylsäure")); + } } diff --git a/src/test/java/dev/dnpm/oshelper/atc/AtcCodeTest.java b/src/test/java/dev/dnpm/oshelper/atc/AtcCodeTest.java index 7e3240d..35fd34e 100644 --- a/src/test/java/dev/dnpm/oshelper/atc/AtcCodeTest.java +++ b/src/test/java/dev/dnpm/oshelper/atc/AtcCodeTest.java @@ -19,29 +19,28 @@ package dev.dnpm.oshelper.atc; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -class AtcCodeTest { +import org.junit.jupiter.api.Test; - @Test - void testShouldDetectAtcCodeScheme() { - assertTrue(AtcCode.isAtcCode("L01")); - assertTrue(AtcCode.isAtcCode("L01A")); - assertTrue(AtcCode.isAtcCode("L01AA")); - assertTrue(AtcCode.isAtcCode("L01AA01")); - } +class AtcCodeTest { - @Test - void testShouldDetectInvalidAtcCodeScheme() { - assertFalse(AtcCode.isAtcCode(null)); - assertFalse(AtcCode.isAtcCode(" ")); - assertFalse(AtcCode.isAtcCode("irgendwas")); - assertFalse(AtcCode.isAtcCode("L00AA")); - assertFalse(AtcCode.isAtcCode("Z01AA")); - assertFalse(AtcCode.isAtcCode("L01AA0")); - } + @Test + void testShouldDetectAtcCodeScheme() { + assertTrue(AtcCode.isAtcCode("L01")); + assertTrue(AtcCode.isAtcCode("L01A")); + assertTrue(AtcCode.isAtcCode("L01AA")); + assertTrue(AtcCode.isAtcCode("L01AA01")); + } + @Test + void testShouldDetectInvalidAtcCodeScheme() { + assertFalse(AtcCode.isAtcCode(null)); + assertFalse(AtcCode.isAtcCode(" ")); + assertFalse(AtcCode.isAtcCode("irgendwas")); + assertFalse(AtcCode.isAtcCode("L00AA")); + assertFalse(AtcCode.isAtcCode("Z01AA")); + assertFalse(AtcCode.isAtcCode("L01AA0")); + } } diff --git a/src/test/java/dev/dnpm/oshelper/atc/CsvAgentCodeServiceTest.java b/src/test/java/dev/dnpm/oshelper/atc/CsvAgentCodeServiceTest.java index 2735e01..82fd837 100644 --- a/src/test/java/dev/dnpm/oshelper/atc/CsvAgentCodeServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/atc/CsvAgentCodeServiceTest.java @@ -19,22 +19,21 @@ package dev.dnpm.oshelper.atc; +import static org.assertj.core.api.Assertions.assertThat; + import dev.dnpm.oshelper.atc.services.AgentCodeService; import dev.dnpm.oshelper.atc.services.CsvAgentCodeService; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - class CsvAgentCodeServiceTest { - AgentCodeService agentCodeService = new CsvAgentCodeService(); - - @Test - void shouldReturnAtcCodeFromEmbeddedResource() { - var actual = agentCodeService.findAgentCodes("Cisplatin", 10); + AgentCodeService agentCodeService = new CsvAgentCodeService(); - assertThat(actual).hasSize(1); - assertThat(actual.get(0).getCode()).isEqualTo("L01XA01"); - } + @Test + void shouldReturnAtcCodeFromEmbeddedResource() { + var actual = agentCodeService.findAgentCodes("Cisplatin", 10); + assertThat(actual).hasSize(1); + assertThat(actual.get(0).getCode()).isEqualTo("L01XA01"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/config/PluginConfigurationTest.java b/src/test/java/dev/dnpm/oshelper/config/PluginConfigurationTest.java index 6b80968..42583ca 100644 --- a/src/test/java/dev/dnpm/oshelper/config/PluginConfigurationTest.java +++ b/src/test/java/dev/dnpm/oshelper/config/PluginConfigurationTest.java @@ -19,47 +19,45 @@ package dev.dnpm.oshelper.config; +import static org.assertj.core.api.Assertions.assertThat; + +import de.itc.onkostar.api.IOnkostarApi; import dev.dnpm.oshelper.services.FormService; import dev.dnpm.oshelper.services.SettingsService; -import dev.dnpm.oshelper.services.therapieplan.TherapieplanServiceFactory; import dev.dnpm.oshelper.services.consent.ConsentManagerServiceFactory; -import de.itc.onkostar.api.IOnkostarApi; +import dev.dnpm.oshelper.services.therapieplan.TherapieplanServiceFactory; 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; - @ExtendWith(MockitoExtension.class) class PluginConfigurationTest { - @Mock - private IOnkostarApi onkostarApi; + @Mock private IOnkostarApi onkostarApi; - @Mock - private SettingsService settingsService; + @Mock private SettingsService settingsService; - @Mock - private FormService formService; + @Mock private FormService formService; - private PluginConfiguration configuration; + private PluginConfiguration configuration; - @BeforeEach - void setup() { - this.configuration = new PluginConfiguration(); - } + @BeforeEach + void setup() { + this.configuration = new PluginConfiguration(); + } - @Test - void testShouldReturnConsentManagerServiceFactory() { - var actual = this.configuration.consentManagerServiceFactory(onkostarApi); - assertThat(actual).isInstanceOf(ConsentManagerServiceFactory.class); - } + @Test + void testShouldReturnConsentManagerServiceFactory() { + var actual = this.configuration.consentManagerServiceFactory(onkostarApi); + assertThat(actual).isInstanceOf(ConsentManagerServiceFactory.class); + } - @Test - void testShouldReturnTherapieplanServiceFactory() { - var actual = this.configuration.therapieplanServiceFactory(onkostarApi, settingsService, formService); - assertThat(actual).isInstanceOf(TherapieplanServiceFactory.class); - } + @Test + void testShouldReturnTherapieplanServiceFactory() { + var actual = + this.configuration.therapieplanServiceFactory(onkostarApi, settingsService, formService); + assertThat(actual).isInstanceOf(TherapieplanServiceFactory.class); + } } diff --git a/src/test/java/dev/dnpm/oshelper/dto/VariantTest.java b/src/test/java/dev/dnpm/oshelper/dto/VariantTest.java index aa39ba3..9ab2b3d 100644 --- a/src/test/java/dev/dnpm/oshelper/dto/VariantTest.java +++ b/src/test/java/dev/dnpm/oshelper/dto/VariantTest.java @@ -19,104 +19,103 @@ package dev.dnpm.oshelper.dto; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - public class VariantTest { - @Test - void testShouldMapVariantFromProcedureForSimpleVariant() { - var procedure = new Procedure(null); - procedure.setId(12345); - procedure.setFormName("OS.Molekulargenetische Untersuchung"); - - procedure.setValue("Ergebnis", new Item("Ergebnis", "P")); - procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); - procedure.setValue("ExonInt", new Item("ExonInt", 123)); - procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - - var actual = Variant.fromProcedure(procedure); - - assertThat(actual).isPresent(); - assertThat(actual.get().getId()).isEqualTo(12345); - assertThat(actual.get().getErgebnis()).isEqualTo("Einfache Variante (Mutation)"); - assertThat(actual.get().getGen()).isEqualTo("BRAF"); - assertThat(actual.get().getExon()).isEqualTo("123"); - assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); - } - - @Test - void testShouldMapVariantFromProcedureForCopyNumberVariation() { - var procedure = new Procedure(null); - procedure.setId(12345); - procedure.setFormName("OS.Molekulargenetische Untersuchung"); - - procedure.setValue("Ergebnis", new Item("Ergebnis", "CNV")); - procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); - procedure.setValue("ExonInt", new Item("ExonInt", 123)); - procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - - var actual = Variant.fromProcedure(procedure); - - assertThat(actual).isPresent(); - assertThat(actual.get().getId()).isEqualTo(12345); - assertThat(actual.get().getErgebnis()).isEqualTo("Copy Number Variation (CNV)"); - assertThat(actual.get().getGen()).isEqualTo("BRAF"); - assertThat(actual.get().getExon()).isEqualTo("123"); - assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); - } - - @Test - void testShouldMapVariantFromProcedureForFusion() { - var procedure = new Procedure(null); - procedure.setId(12345); - procedure.setFormName("OS.Molekulargenetische Untersuchung"); - - procedure.setValue("Ergebnis", new Item("Ergebnis", "F")); - procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); - procedure.setValue("ExonInt", new Item("ExonInt", 123)); - procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - - var actual = Variant.fromProcedure(procedure); - - assertThat(actual).isPresent(); - assertThat(actual.get().getId()).isEqualTo(12345); - assertThat(actual.get().getErgebnis()).isEqualTo("Fusion (Translokation Inversion Insertion)"); - assertThat(actual.get().getGen()).isEqualTo("BRAF"); - assertThat(actual.get().getExon()).isEqualTo("123"); - assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); - } - - @Test - void testShouldNotMapVariantFromProcedureForUnknownVariant() { - var procedure = new Procedure(null); - procedure.setId(12345); - procedure.setFormName("OS.Molekulargenetische Untersuchung"); - - procedure.setValue("Ergebnis", new Item("Ergebnis", "X")); - procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); - procedure.setValue("ExonInt", new Item("ExonInt", 123)); - procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - - var actual = Variant.fromProcedure(procedure); - - assertThat(actual).isEmpty(); - } - - @Test - void testShouldNotMapVariantFromUnknownProcedureForm() { - var procedure = new Procedure(null); - procedure.setId(12345); - procedure.setFormName("ABC.Irgendwas"); - - procedure.setValue("Testfeld", new Item("Testfeld", "T")); - - var actual = Variant.fromProcedure(procedure); - - assertThat(actual).isEmpty(); - } - + @Test + void testShouldMapVariantFromProcedureForSimpleVariant() { + var procedure = new Procedure(null); + procedure.setId(12345); + procedure.setFormName("OS.Molekulargenetische Untersuchung"); + + procedure.setValue("Ergebnis", new Item("Ergebnis", "P")); + procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); + procedure.setValue("ExonInt", new Item("ExonInt", 123)); + procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + + var actual = Variant.fromProcedure(procedure); + + assertThat(actual).isPresent(); + assertThat(actual.get().getId()).isEqualTo(12345); + assertThat(actual.get().getErgebnis()).isEqualTo("Einfache Variante (Mutation)"); + assertThat(actual.get().getGen()).isEqualTo("BRAF"); + assertThat(actual.get().getExon()).isEqualTo("123"); + assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); + } + + @Test + void testShouldMapVariantFromProcedureForCopyNumberVariation() { + var procedure = new Procedure(null); + procedure.setId(12345); + procedure.setFormName("OS.Molekulargenetische Untersuchung"); + + procedure.setValue("Ergebnis", new Item("Ergebnis", "CNV")); + procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); + procedure.setValue("ExonInt", new Item("ExonInt", 123)); + procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + + var actual = Variant.fromProcedure(procedure); + + assertThat(actual).isPresent(); + assertThat(actual.get().getId()).isEqualTo(12345); + assertThat(actual.get().getErgebnis()).isEqualTo("Copy Number Variation (CNV)"); + assertThat(actual.get().getGen()).isEqualTo("BRAF"); + assertThat(actual.get().getExon()).isEqualTo("123"); + assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); + } + + @Test + void testShouldMapVariantFromProcedureForFusion() { + var procedure = new Procedure(null); + procedure.setId(12345); + procedure.setFormName("OS.Molekulargenetische Untersuchung"); + + procedure.setValue("Ergebnis", new Item("Ergebnis", "F")); + procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); + procedure.setValue("ExonInt", new Item("ExonInt", 123)); + procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + + var actual = Variant.fromProcedure(procedure); + + assertThat(actual).isPresent(); + assertThat(actual.get().getId()).isEqualTo(12345); + assertThat(actual.get().getErgebnis()).isEqualTo("Fusion (Translokation Inversion Insertion)"); + assertThat(actual.get().getGen()).isEqualTo("BRAF"); + assertThat(actual.get().getExon()).isEqualTo("123"); + assertThat(actual.get().getPathogenitaetsklasse()).isEqualTo("2"); + } + + @Test + void testShouldNotMapVariantFromProcedureForUnknownVariant() { + var procedure = new Procedure(null); + procedure.setId(12345); + procedure.setFormName("OS.Molekulargenetische Untersuchung"); + + procedure.setValue("Ergebnis", new Item("Ergebnis", "X")); + procedure.setValue("Untersucht", new Item("Untersucht", "BRAF")); + procedure.setValue("ExonInt", new Item("ExonInt", 123)); + procedure.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + + var actual = Variant.fromProcedure(procedure); + + assertThat(actual).isEmpty(); + } + + @Test + void testShouldNotMapVariantFromUnknownProcedureForm() { + var procedure = new Procedure(null); + procedure.setId(12345); + procedure.setFormName("ABC.Irgendwas"); + + procedure.setValue("Testfeld", new Item("Testfeld", "T")); + + var actual = Variant.fromProcedure(procedure); + + assertThat(actual).isEmpty(); + } } diff --git a/src/test/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluatorTest.java b/src/test/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluatorTest.java index 0f615ec..a305bb2 100644 --- a/src/test/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluatorTest.java +++ b/src/test/java/dev/dnpm/oshelper/security/DelegatingDataBasedPermissionEvaluatorTest.java @@ -19,8 +19,14 @@ package dev.dnpm.oshelper.security; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; +import java.util.Collection; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,113 +35,124 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; -import java.util.Collection; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) class DelegatingDataBasedPermissionEvaluatorTest { - private IOnkostarApi onkostarApi; - - private PersonPoolBasedPermissionEvaluator personPoolBasedPermissionEvaluator; - - private FormBasedPermissionEvaluator formBasedPermissionEvaluator; - - private DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock PersonPoolBasedPermissionEvaluator personPoolBasedPermissionEvaluator, - @Mock FormBasedPermissionEvaluator formBasedPermissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.personPoolBasedPermissionEvaluator = personPoolBasedPermissionEvaluator; - this.formBasedPermissionEvaluator = formBasedPermissionEvaluator; - - this.delegatingDataBasedPermissionEvaluator = new DelegatingDataBasedPermissionEvaluator( - List.of(personPoolBasedPermissionEvaluator, formBasedPermissionEvaluator) - ); - } - - @Test - void testShouldGrantPermissionIfAllDelegatedPermissionEvaluatorsGrantsAccessByObject() { - when(personPoolBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))).thenReturn(true); - when(formBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))).thenReturn(true); - - var actual = delegatingDataBasedPermissionEvaluator.hasPermission(new DummyAuthentication(), new Patient(this.onkostarApi), PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldGrantPermissionIfAllDelegatedPermissionEvaluatorsGrantsAccessByIdAndType() { - when(personPoolBasedPermissionEvaluator.hasPermission(any(), anyInt(), anyString(), any(PermissionType.class))).thenReturn(true); - when(formBasedPermissionEvaluator.hasPermission(any(), anyInt(), anyString(), any(PermissionType.class))).thenReturn(true); - - var actual = delegatingDataBasedPermissionEvaluator.hasPermission(new DummyAuthentication(), 123, "Patient", PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldDenyPermissionIfAtLeastOneDelegatedPermissionEvaluatorsDeniesAccessByObject() { - when(personPoolBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))).thenReturn(true); - when(formBasedPermissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))).thenReturn(false); - - var actual = delegatingDataBasedPermissionEvaluator.hasPermission(new DummyAuthentication(), new Patient(this.onkostarApi), PermissionType.READ); - - assertThat(actual).isFalse(); - } - - @Test - void testShouldDenyPermissionIfAtLeastOneDelegatedPermissionEvaluatorsDeniesAccessByIdAndType() { - when(personPoolBasedPermissionEvaluator.hasPermission(any(), anyInt(), anyString(), any(PermissionType.class))).thenReturn(false); - - var actual = delegatingDataBasedPermissionEvaluator.hasPermission(new DummyAuthentication(), 123, "Patient", PermissionType.READ); - - assertThat(actual).isFalse(); - } - + private IOnkostarApi onkostarApi; + + private PersonPoolBasedPermissionEvaluator personPoolBasedPermissionEvaluator; + + private FormBasedPermissionEvaluator formBasedPermissionEvaluator; + + private DelegatingDataBasedPermissionEvaluator delegatingDataBasedPermissionEvaluator; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock PersonPoolBasedPermissionEvaluator personPoolBasedPermissionEvaluator, + @Mock FormBasedPermissionEvaluator formBasedPermissionEvaluator) { + this.onkostarApi = onkostarApi; + this.personPoolBasedPermissionEvaluator = personPoolBasedPermissionEvaluator; + this.formBasedPermissionEvaluator = formBasedPermissionEvaluator; + + this.delegatingDataBasedPermissionEvaluator = + new DelegatingDataBasedPermissionEvaluator( + List.of(personPoolBasedPermissionEvaluator, formBasedPermissionEvaluator)); + } + + @Test + void testShouldGrantPermissionIfAllDelegatedPermissionEvaluatorsGrantsAccessByObject() { + when(personPoolBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); + when(formBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); + + var actual = + delegatingDataBasedPermissionEvaluator.hasPermission( + new DummyAuthentication(), new Patient(this.onkostarApi), PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldGrantPermissionIfAllDelegatedPermissionEvaluatorsGrantsAccessByIdAndType() { + when(personPoolBasedPermissionEvaluator.hasPermission( + any(), anyInt(), anyString(), any(PermissionType.class))) + .thenReturn(true); + when(formBasedPermissionEvaluator.hasPermission( + any(), anyInt(), anyString(), any(PermissionType.class))) + .thenReturn(true); + + var actual = + delegatingDataBasedPermissionEvaluator.hasPermission( + new DummyAuthentication(), 123, "Patient", PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldDenyPermissionIfAtLeastOneDelegatedPermissionEvaluatorsDeniesAccessByObject() { + when(personPoolBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); + when(formBasedPermissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(false); + + var actual = + delegatingDataBasedPermissionEvaluator.hasPermission( + new DummyAuthentication(), new Patient(this.onkostarApi), PermissionType.READ); + + assertThat(actual).isFalse(); + } + + @Test + void testShouldDenyPermissionIfAtLeastOneDelegatedPermissionEvaluatorsDeniesAccessByIdAndType() { + when(personPoolBasedPermissionEvaluator.hasPermission( + any(), anyInt(), anyString(), any(PermissionType.class))) + .thenReturn(false); + + var actual = + delegatingDataBasedPermissionEvaluator.hasPermission( + new DummyAuthentication(), 123, "Patient", PermissionType.READ); + + assertThat(actual).isFalse(); + } } class DummyAuthentication implements Authentication { - @Override - public String getName() { - return "dummy"; - } - - @Override - public Collection<? extends GrantedAuthority> getAuthorities() { - return null; - } - - @Override - public Object getCredentials() { - return null; - } - - @Override - public Object getDetails() { - return null; - } - - @Override - public Object getPrincipal() { - return null; - } - - @Override - public boolean isAuthenticated() { - return false; - } - - @Override - public void setAuthenticated(boolean b) throws IllegalArgumentException { - - } -}
\ No newline at end of file + @Override + public String getName() { + return "dummy"; + } + + @Override + public Collection<? extends GrantedAuthority> getAuthorities() { + return null; + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getDetails() { + return null; + } + + @Override + public Object getPrincipal() { + return null; + } + + @Override + public boolean isAuthenticated() { + return false; + } + + @Override + public void setAuthenticated(boolean b) throws IllegalArgumentException {} +} diff --git a/src/test/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluatorTest.java b/src/test/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluatorTest.java index 6c363d4..60e896a 100644 --- a/src/test/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluatorTest.java +++ b/src/test/java/dev/dnpm/oshelper/security/FormBasedPermissionEvaluatorTest.java @@ -19,9 +19,16 @@ package dev.dnpm.oshelper.security; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,103 +36,123 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.Authentication; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) class FormBasedPermissionEvaluatorTest { - private IOnkostarApi onkostarApi; - - private Authentication dummyAuthentication; - - private SecurityService securityService; - - private FormBasedPermissionEvaluator permissionEvaluator; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock SecurityService securityService, - @Mock DummyAuthentication dummyAuthentication - ) { - this.onkostarApi = onkostarApi; - this.dummyAuthentication = dummyAuthentication; - this.securityService = securityService; - - this.permissionEvaluator = new FormBasedPermissionEvaluator( - onkostarApi, securityService - ); - } - - @Test - void testShouldGrantPermissionByProcedure() { - when(securityService.getFormNamesForPermission(any(Authentication.class), any(PermissionType.class))).thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form2"); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - assertThat(actual).isTrue(); - } - - @Test - void testShouldGrantPermissionByProcedureId() { - when(securityService.getFormNamesForPermission(any(Authentication.class), any(PermissionType.class))).thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); - - doAnswer(invocationOnMock -> { - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form2"); - return object; - }).when(onkostarApi).getProcedure(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, PersonPoolBasedPermissionEvaluator.PROCEDURE, PermissionType.READ); - assertThat(actual).isTrue(); - } - - @Test - void testShouldDenyPermissionByProcedure() { - when(securityService.getFormNamesForPermission(any(Authentication.class), any(PermissionType.class))).thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - assertThat(actual).isFalse(); - } - - @Test - void testShouldDenyPermissionByProcedureId() { - when(securityService.getFormNamesForPermission(any(Authentication.class), any(PermissionType.class))).thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); - - doAnswer(invocationOnMock -> { - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - return object; - }).when(onkostarApi).getProcedure(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, PersonPoolBasedPermissionEvaluator.PROCEDURE, PermissionType.READ); - assertThat(actual).isFalse(); - } - - @Test - void testShouldVoteForPermissionToPatient() { - var object = new Patient(onkostarApi); - object.setPersonPoolCode("Pool1"); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - assertThat(actual).isTrue(); - } - - @Test - void testShouldVoteForPermissionToIdOfTypeProcedure() { - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, FormBasedPermissionEvaluator.PATIENT, PermissionType.READ); - assertThat(actual).isTrue(); - } - + private IOnkostarApi onkostarApi; + + private Authentication dummyAuthentication; + + private SecurityService securityService; + + private FormBasedPermissionEvaluator permissionEvaluator; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock SecurityService securityService, + @Mock DummyAuthentication dummyAuthentication) { + this.onkostarApi = onkostarApi; + this.dummyAuthentication = dummyAuthentication; + this.securityService = securityService; + + this.permissionEvaluator = new FormBasedPermissionEvaluator(onkostarApi, securityService); + } + + @Test + void testShouldGrantPermissionByProcedure() { + when(securityService.getFormNamesForPermission( + any(Authentication.class), any(PermissionType.class))) + .thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form2"); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + assertThat(actual).isTrue(); + } + + @Test + void testShouldGrantPermissionByProcedureId() { + when(securityService.getFormNamesForPermission( + any(Authentication.class), any(PermissionType.class))) + .thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); + + doAnswer( + invocationOnMock -> { + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form2"); + return object; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + PersonPoolBasedPermissionEvaluator.PROCEDURE, + PermissionType.READ); + assertThat(actual).isTrue(); + } + + @Test + void testShouldDenyPermissionByProcedure() { + when(securityService.getFormNamesForPermission( + any(Authentication.class), any(PermissionType.class))) + .thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + assertThat(actual).isFalse(); + } + + @Test + void testShouldDenyPermissionByProcedureId() { + when(securityService.getFormNamesForPermission( + any(Authentication.class), any(PermissionType.class))) + .thenReturn(List.of("OS.Form2", "OS.Form3", "OS.Form5")); + + doAnswer( + invocationOnMock -> { + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + return object; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + PersonPoolBasedPermissionEvaluator.PROCEDURE, + PermissionType.READ); + assertThat(actual).isFalse(); + } + + @Test + void testShouldVoteForPermissionToPatient() { + var object = new Patient(onkostarApi); + object.setPersonPoolCode("Pool1"); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + assertThat(actual).isTrue(); + } + + @Test + void testShouldVoteForPermissionToIdOfTypeProcedure() { + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + FormBasedPermissionEvaluator.PATIENT, + PermissionType.READ); + assertThat(actual).isTrue(); + } } diff --git a/src/test/java/dev/dnpm/oshelper/security/FormBasedSecurityAspectsTest.java b/src/test/java/dev/dnpm/oshelper/security/FormBasedSecurityAspectsTest.java index 54d7873..a7660b6 100644 --- a/src/test/java/dev/dnpm/oshelper/security/FormBasedSecurityAspectsTest.java +++ b/src/test/java/dev/dnpm/oshelper/security/FormBasedSecurityAspectsTest.java @@ -19,6 +19,10 @@ package dev.dnpm.oshelper.security; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; @@ -29,122 +33,118 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class FormBasedSecurityAspectsTest { - private DummyClass dummyClass; - - private IOnkostarApi onkostarApi; - - private FormBasedPermissionEvaluator permissionEvaluator; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock FormBasedPermissionEvaluator permissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.permissionEvaluator = permissionEvaluator; - - // Create proxied instance of DummyClass as done within Onkostar using Spring AOP - var dummyClass = new DummyClass(onkostarApi); - AspectJProxyFactory factory = new AspectJProxyFactory(dummyClass); - FormBasedSecurityAspects securityAspects = new FormBasedSecurityAspects(this.permissionEvaluator); - factory.addAspect(securityAspects); - this.dummyClass = factory.getProxy(); + private DummyClass dummyClass; + + private IOnkostarApi onkostarApi; + + private FormBasedPermissionEvaluator permissionEvaluator; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, @Mock FormBasedPermissionEvaluator permissionEvaluator) { + this.onkostarApi = onkostarApi; + this.permissionEvaluator = permissionEvaluator; + + // Create proxied instance of DummyClass as done within Onkostar using Spring AOP + var dummyClass = new DummyClass(onkostarApi); + AspectJProxyFactory factory = new AspectJProxyFactory(dummyClass); + FormBasedSecurityAspects securityAspects = + new FormBasedSecurityAspects(this.permissionEvaluator); + factory.addAspect(securityAspects); + this.dummyClass = factory.getProxy(); + } + + @Test + void testShouldAllowSecuredMethodCallWithPatientParam() { + this.dummyClass.methodWithPatientParam(new Patient(onkostarApi)); + verify(onkostarApi, times(1)).savePatient(any(Patient.class)); + } + + @Test + void testShouldPreventSecuredMethodCallWithProcedureParam() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows( + Exception.class, + () -> this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi))); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithProcedureParam() throws Exception { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(true); + + this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)); + + verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void testShouldAllowSecuredMethodCallWithPatientReturnValue() { + var actual = this.dummyClass.methodWithPatientReturnValue(1); + assertThat(actual).isNotNull(); + } + + @Test + void testShouldPreventSecuredMethodCallWithProcedureReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows(Exception.class, () -> this.dummyClass.methodWithProcedureReturnValue(1)); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithProcedureReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(true); + + var actual = this.dummyClass.methodWithProcedureReturnValue(1); + + assertThat(actual).isNotNull(); + } + + private static class DummyClass { + + private final IOnkostarApi onkostarApi; + + DummyClass(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; } - @Test - void testShouldAllowSecuredMethodCallWithPatientParam() { - this.dummyClass.methodWithPatientParam(new Patient(onkostarApi)); - verify(onkostarApi, times(1)).savePatient(any(Patient.class)); + @FormSecured + public void methodWithPatientParam(Patient patient) { + this.onkostarApi.savePatient(patient); } - @Test - void testShouldPreventSecuredMethodCallWithProcedureParam() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + @FormSecured + public void methodWithProcedureParam(Procedure procedure) throws Exception { + this.onkostarApi.saveProcedure(procedure, false); } - @Test - void testShouldAllowSecuredMethodCallWithProcedureParam() throws Exception { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(true); - - this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)); - - verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void testShouldAllowSecuredMethodCallWithPatientReturnValue() { - var actual = this.dummyClass.methodWithPatientReturnValue(1); - assertThat(actual).isNotNull(); - } - - @Test - void testShouldPreventSecuredMethodCallWithProcedureReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithProcedureReturnValue(1) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); - } - - @Test - void testShouldAllowSecuredMethodCallWithProcedureReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(true); - - var actual = this.dummyClass.methodWithProcedureReturnValue(1); - - assertThat(actual).isNotNull(); + @FormSecuredResult + public Patient methodWithPatientReturnValue(int id) { + var patient = new Patient(this.onkostarApi); + patient.setId(id); + return patient; } - private static class DummyClass { - - private final IOnkostarApi onkostarApi; - - DummyClass(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } - - @FormSecured - public void methodWithPatientParam(Patient patient) { - this.onkostarApi.savePatient(patient); - } - - @FormSecured - public void methodWithProcedureParam(Procedure procedure) throws Exception { - this.onkostarApi.saveProcedure(procedure, false); - } - - @FormSecuredResult - public Patient methodWithPatientReturnValue(int id) { - var patient = new Patient(this.onkostarApi); - patient.setId(id); - return patient; - } - - @FormSecuredResult - public Procedure methodWithProcedureReturnValue(int id) { - var procedure = new Procedure(this.onkostarApi); - procedure.setId(id); - return procedure; - } + @FormSecuredResult + public Procedure methodWithProcedureReturnValue(int id) { + var procedure = new Procedure(this.onkostarApi); + procedure.setId(id); + return procedure; } - + } } diff --git a/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluatorTest.java b/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluatorTest.java index 1390b76..01e3399 100644 --- a/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluatorTest.java +++ b/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluatorTest.java @@ -19,9 +19,16 @@ package dev.dnpm.oshelper.security; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,151 +36,177 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.Authentication; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) class PersonPoolBasedPermissionEvaluatorTest { - private IOnkostarApi onkostarApi; - - private Authentication dummyAuthentication; - - private PersonPoolBasedPermissionEvaluator permissionEvaluator; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock SecurityService securityService, - @Mock DummyAuthentication dummyAuthentication - ) { - this.onkostarApi = onkostarApi; - this.dummyAuthentication = dummyAuthentication; - - this.permissionEvaluator = new PersonPoolBasedPermissionEvaluator( - onkostarApi, securityService - ); - - when(securityService.getPersonPoolIdsForPermission(any(Authentication.class), any(PermissionType.class))).thenReturn(List.of("Pool2", "Pool3", "Pool5")); - } - - @Test - void testShouldGrantPermissionByPatientObject() { - var object = new Patient(onkostarApi); - object.setPersonPoolCode("Pool2"); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldGrantPermissionByPatientIdAndType() { - doAnswer(invocationOnMock -> { - var object = new Patient(onkostarApi); - object.setPersonPoolCode("Pool2"); - return object; - }).when(onkostarApi).getPatient(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, PersonPoolBasedPermissionEvaluator.PATIENT, PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldDenyPermissionByPatientObject() { - var object = new Patient(onkostarApi); - object.setPersonPoolCode("Pool1"); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - - assertThat(actual).isFalse(); - } - - @Test - void testShouldDenyPermissionByPatientIdAndType() { - doAnswer(invocationOnMock -> { - var object = new Patient(onkostarApi); - object.setPersonPoolCode("Pool1"); - return object; - }).when(onkostarApi).getPatient(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, PersonPoolBasedPermissionEvaluator.PATIENT, PermissionType.READ); - - assertThat(actual).isFalse(); - } - - @Test - void testShouldGrantPermissionByProcedureObject() { - var patient = new Patient(onkostarApi); - patient.setId(1); - patient.setPersonPoolCode("Pool2"); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - object.setPatient(patient); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldGrantPermissionByProcedureIdAndType() { - doAnswer(invocationOnMock -> { - var patient = new Patient(onkostarApi); - patient.setId(1); - patient.setPersonPoolCode("Pool2"); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - object.setPatient(patient); - - return object; - }).when(onkostarApi).getProcedure(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 456, PersonPoolBasedPermissionEvaluator.PROCEDURE, PermissionType.READ); - - assertThat(actual).isTrue(); - } - - @Test - void testShouldDenyPermissionByProcedureObject() { - var patient = new Patient(onkostarApi); - patient.setId(1); - patient.setPersonPoolCode("Pool1"); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - object.setPatient(patient); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); - - assertThat(actual).isFalse(); - } - - @Test - void testShouldDenyPermissionByProcedureIdAndType() { - doAnswer(invocationOnMock -> { - var patient = new Patient(onkostarApi); - patient.setId(1); - patient.setPersonPoolCode("Pool1"); - - var object = new Procedure(onkostarApi); - object.setFormName("OS.Form1"); - object.setPatient(patient); - - return object; - }).when(onkostarApi).getProcedure(anyInt()); - - var actual = permissionEvaluator.hasPermission(this.dummyAuthentication, 123, PersonPoolBasedPermissionEvaluator.PROCEDURE, PermissionType.READ); - - assertThat(actual).isFalse(); - } - -}
\ No newline at end of file + private IOnkostarApi onkostarApi; + + private Authentication dummyAuthentication; + + private PersonPoolBasedPermissionEvaluator permissionEvaluator; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock SecurityService securityService, + @Mock DummyAuthentication dummyAuthentication) { + this.onkostarApi = onkostarApi; + this.dummyAuthentication = dummyAuthentication; + + this.permissionEvaluator = new PersonPoolBasedPermissionEvaluator(onkostarApi, securityService); + + when(securityService.getPersonPoolIdsForPermission( + any(Authentication.class), any(PermissionType.class))) + .thenReturn(List.of("Pool2", "Pool3", "Pool5")); + } + + @Test + void testShouldGrantPermissionByPatientObject() { + var object = new Patient(onkostarApi); + object.setPersonPoolCode("Pool2"); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldGrantPermissionByPatientIdAndType() { + doAnswer( + invocationOnMock -> { + var object = new Patient(onkostarApi); + object.setPersonPoolCode("Pool2"); + return object; + }) + .when(onkostarApi) + .getPatient(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + PersonPoolBasedPermissionEvaluator.PATIENT, + PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldDenyPermissionByPatientObject() { + var object = new Patient(onkostarApi); + object.setPersonPoolCode("Pool1"); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + + assertThat(actual).isFalse(); + } + + @Test + void testShouldDenyPermissionByPatientIdAndType() { + doAnswer( + invocationOnMock -> { + var object = new Patient(onkostarApi); + object.setPersonPoolCode("Pool1"); + return object; + }) + .when(onkostarApi) + .getPatient(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + PersonPoolBasedPermissionEvaluator.PATIENT, + PermissionType.READ); + + assertThat(actual).isFalse(); + } + + @Test + void testShouldGrantPermissionByProcedureObject() { + var patient = new Patient(onkostarApi); + patient.setId(1); + patient.setPersonPoolCode("Pool2"); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + object.setPatient(patient); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldGrantPermissionByProcedureIdAndType() { + doAnswer( + invocationOnMock -> { + var patient = new Patient(onkostarApi); + patient.setId(1); + patient.setPersonPoolCode("Pool2"); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + object.setPatient(patient); + + return object; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 456, + PersonPoolBasedPermissionEvaluator.PROCEDURE, + PermissionType.READ); + + assertThat(actual).isTrue(); + } + + @Test + void testShouldDenyPermissionByProcedureObject() { + var patient = new Patient(onkostarApi); + patient.setId(1); + patient.setPersonPoolCode("Pool1"); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + object.setPatient(patient); + + var actual = + permissionEvaluator.hasPermission(this.dummyAuthentication, object, PermissionType.READ); + + assertThat(actual).isFalse(); + } + + @Test + void testShouldDenyPermissionByProcedureIdAndType() { + doAnswer( + invocationOnMock -> { + var patient = new Patient(onkostarApi); + patient.setId(1); + patient.setPersonPoolCode("Pool1"); + + var object = new Procedure(onkostarApi); + object.setFormName("OS.Form1"); + object.setPatient(patient); + + return object; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + var actual = + permissionEvaluator.hasPermission( + this.dummyAuthentication, + 123, + PersonPoolBasedPermissionEvaluator.PROCEDURE, + PermissionType.READ); + + assertThat(actual).isFalse(); + } +} diff --git a/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspectsTest.java b/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspectsTest.java index 4f03a64..cf7706c 100644 --- a/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspectsTest.java +++ b/src/test/java/dev/dnpm/oshelper/security/PersonPoolBasedSecurityAspectsTest.java @@ -19,6 +19,10 @@ package dev.dnpm.oshelper.security; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Patient; import de.itc.onkostar.api.Procedure; @@ -29,154 +33,153 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class PersonPoolBasedSecurityAspectsTest { - private DummyClass dummyClass; - - private IOnkostarApi onkostarApi; - - private PersonPoolBasedPermissionEvaluator permissionEvaluator; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock PersonPoolBasedPermissionEvaluator permissionEvaluator - ) { - this.onkostarApi = onkostarApi; - this.permissionEvaluator = permissionEvaluator; - - // Create proxied instance of DummyClass as done within Onkostar using Spring AOP - var dummyClass = new DummyClass(onkostarApi); - AspectJProxyFactory factory = new AspectJProxyFactory(dummyClass); - PersonPoolBasedSecurityAspects securityAspects = new PersonPoolBasedSecurityAspects(this.permissionEvaluator); - factory.addAspect(securityAspects); - this.dummyClass = factory.getProxy(); + private DummyClass dummyClass; + + private IOnkostarApi onkostarApi; + + private PersonPoolBasedPermissionEvaluator permissionEvaluator; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock PersonPoolBasedPermissionEvaluator permissionEvaluator) { + this.onkostarApi = onkostarApi; + this.permissionEvaluator = permissionEvaluator; + + // Create proxied instance of DummyClass as done within Onkostar using Spring AOP + var dummyClass = new DummyClass(onkostarApi); + AspectJProxyFactory factory = new AspectJProxyFactory(dummyClass); + PersonPoolBasedSecurityAspects securityAspects = + new PersonPoolBasedSecurityAspects(this.permissionEvaluator); + factory.addAspect(securityAspects); + this.dummyClass = factory.getProxy(); + } + + @Test + void testShouldPreventSecuredMethodCallWithPatientParam() { + when(this.permissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows( + Exception.class, + () -> this.dummyClass.methodWithPatientParam(new Patient(onkostarApi))); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithPatientParam() { + when(this.permissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); + + this.dummyClass.methodWithPatientParam(new Patient(onkostarApi)); + + verify(onkostarApi, times(1)).savePatient(any(Patient.class)); + } + + @Test + void testShouldPreventSecuredMethodCallWithProcedureParam() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows( + Exception.class, + () -> this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi))); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithProcedureParam() throws Exception { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(true); + + this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)); + + verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void testShouldPreventSecuredMethodCallWithPatientReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows(Exception.class, () -> this.dummyClass.methodWithPatientReturnValue(1)); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithPatientReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Patient.class), any(PermissionType.class))) + .thenReturn(true); + + var actual = this.dummyClass.methodWithPatientReturnValue(1); + + assertThat(actual).isNotNull(); + } + + @Test + void testShouldPreventSecuredMethodCallWithProcedureReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(false); + + var exception = + assertThrows(Exception.class, () -> this.dummyClass.methodWithProcedureReturnValue(1)); + assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + } + + @Test + void testShouldAllowSecuredMethodCallWithProcedureReturnValue() { + when(this.permissionEvaluator.hasPermission( + any(), any(Procedure.class), any(PermissionType.class))) + .thenReturn(true); + + var actual = this.dummyClass.methodWithProcedureReturnValue(1); + + assertThat(actual).isNotNull(); + } + + private static class DummyClass { + + private final IOnkostarApi onkostarApi; + + DummyClass(final IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; } - @Test - void testShouldPreventSecuredMethodCallWithPatientParam() { - when(this.permissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithPatientParam(new Patient(onkostarApi)) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + @PersonPoolSecured + public void methodWithPatientParam(Patient patient) { + this.onkostarApi.savePatient(patient); } - @Test - void testShouldAllowSecuredMethodCallWithPatientParam() { - when(this.permissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(true); - - this.dummyClass.methodWithPatientParam(new Patient(onkostarApi)); - - verify(onkostarApi, times(1)).savePatient(any(Patient.class)); + @PersonPoolSecured + public void methodWithProcedureParam(Procedure procedure) throws Exception { + this.onkostarApi.saveProcedure(procedure, false); } - @Test - void testShouldPreventSecuredMethodCallWithProcedureParam() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); + @PersonPoolSecuredResult + public Patient methodWithPatientReturnValue(int id) { + var patient = new Patient(this.onkostarApi); + patient.setId(id); + return patient; } - @Test - void testShouldAllowSecuredMethodCallWithProcedureParam() throws Exception { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(true); - - this.dummyClass.methodWithProcedureParam(new Procedure(onkostarApi)); - - verify(onkostarApi, times(1)).saveProcedure(any(Procedure.class), anyBoolean()); + @PersonPoolSecuredResult + public Procedure methodWithProcedureReturnValue(int id) { + var procedure = new Procedure(this.onkostarApi); + procedure.setId(id); + return procedure; } - - @Test - void testShouldPreventSecuredMethodCallWithPatientReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithPatientReturnValue(1) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); - } - - @Test - void testShouldAllowSecuredMethodCallWithPatientReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Patient.class), any(PermissionType.class))) - .thenReturn(true); - - var actual = this.dummyClass.methodWithPatientReturnValue(1); - - assertThat(actual).isNotNull(); - } - - @Test - void testShouldPreventSecuredMethodCallWithProcedureReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(false); - - var exception = assertThrows( - Exception.class, - () -> this.dummyClass.methodWithProcedureReturnValue(1) - ); - assertThat(exception).isExactlyInstanceOf(IllegalSecuredObjectAccessException.class); - } - - @Test - void testShouldAllowSecuredMethodCallWithProcedureReturnValue() { - when(this.permissionEvaluator.hasPermission(any(), any(Procedure.class), any(PermissionType.class))) - .thenReturn(true); - - var actual = this.dummyClass.methodWithProcedureReturnValue(1); - - assertThat(actual).isNotNull(); - } - - private static class DummyClass { - - private final IOnkostarApi onkostarApi; - - DummyClass(final IOnkostarApi onkostarApi) { - this.onkostarApi = onkostarApi; - } - - @PersonPoolSecured - public void methodWithPatientParam(Patient patient) { - this.onkostarApi.savePatient(patient); - } - - @PersonPoolSecured - public void methodWithProcedureParam(Procedure procedure) throws Exception { - this.onkostarApi.saveProcedure(procedure, false); - } - - @PersonPoolSecuredResult - public Patient methodWithPatientReturnValue(int id) { - var patient = new Patient(this.onkostarApi); - patient.setId(id); - return patient; - } - - @PersonPoolSecuredResult - public Procedure methodWithProcedureReturnValue(int id) { - var procedure = new Procedure(this.onkostarApi); - procedure.setId(id); - return procedure; - } - } - + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/SettingsServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/SettingsServiceTest.java index f0c53de..ce085eb 100644 --- a/src/test/java/dev/dnpm/oshelper/services/SettingsServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/SettingsServiceTest.java @@ -19,6 +19,10 @@ package dev.dnpm.oshelper.services; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doAnswer; + import de.itc.db.dnpm.Setting; import dev.dnpm.oshelper.database.SettingsRepository; import org.junit.jupiter.api.BeforeEach; @@ -27,55 +31,50 @@ 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) class SettingsServiceTest { - private SettingsRepository settingsRepository; + private SettingsRepository settingsRepository; - private SettingsService service; + private SettingsService service; - @BeforeEach - void setUp( - @Mock SettingsRepository settingsRepository - ) { - this.settingsRepository = settingsRepository; - this.service = new SettingsService(settingsRepository); - } + @BeforeEach + void setUp(@Mock SettingsRepository settingsRepository) { + this.settingsRepository = settingsRepository; + this.service = new SettingsService(settingsRepository); + } - @Test - void shouldReturnSID() { - doAnswer(invocationOnMock -> { - var name = invocationOnMock.getArgument(0, String.class); - if (null != name && name.equals("SID")) { + @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()); + } + return null; + }) + .when(settingsRepository) + .findByName(anyString()); - var actual = service.getSID(); - assertThat(actual) - .isPresent() - .contains("12345"); - } + var actual = service.getSID(); + assertThat(actual).isPresent().contains("12345"); + } - @Test - void shouldReturnSIDByName() { - doAnswer(invocationOnMock -> { - var name = invocationOnMock.getArgument(0, String.class); - if (null != name && name.equals("SID")) { + @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() - .contains("12345"); - } + } + return null; + }) + .when(settingsRepository) + .findByName(anyString()); + var actual = service.getSetting("SID"); + assertThat(actual).isPresent().contains("12345"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/StudieTest.java b/src/test/java/dev/dnpm/oshelper/services/StudieTest.java index f8d64c2..b65760a 100644 --- a/src/test/java/dev/dnpm/oshelper/services/StudieTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/StudieTest.java @@ -19,56 +19,32 @@ package dev.dnpm.oshelper.services; +import static org.assertj.core.api.Assertions.assertThat; + import dev.dnpm.oshelper.dto.Studie; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - class StudieTest { - @Test - void shouldDetectStudieWithNctNumber() { - var studie = new Studie( - "Kat 1", - 1, - null, - "Nct-12345678", - "Teststudie 1", - "Teststudie 1", - true - ); - - assertThat(studie.getType()).isEqualTo(Studie.Type.NCT); - } + @Test + void shouldDetectStudieWithNctNumber() { + var studie = new Studie("Kat 1", 1, null, "Nct-12345678", "Teststudie 1", "Teststudie 1", true); - @Test - void shouldDetectStudieWithEudraCtNumber() { - var studie = new Studie( - "Kat 1", - 1, - null, - "2023-012345-12", - "Teststudie 1", - "Teststudie 1", - true - ); + assertThat(studie.getType()).isEqualTo(Studie.Type.NCT); + } - assertThat(studie.getType()).isEqualTo(Studie.Type.EUDRA_CT); - } + @Test + void shouldDetectStudieWithEudraCtNumber() { + var studie = + new Studie("Kat 1", 1, null, "2023-012345-12", "Teststudie 1", "Teststudie 1", true); - @Test - void shouldReturnStudieWithUnknownNumberScheme() { - var studie = new Studie( - "Kat 1", - 1, - "teststudie1", - null, - "Teststudie 1", - "Teststudie 1", - true - ); + assertThat(studie.getType()).isEqualTo(Studie.Type.EUDRA_CT); + } - assertThat(studie.getType()).isEqualTo(Studie.Type.UNKNOWN); - } + @Test + void shouldReturnStudieWithUnknownNumberScheme() { + var studie = new Studie("Kat 1", 1, "teststudie1", null, "Teststudie 1", "Teststudie 1", true); + assertThat(studie.getType()).isEqualTo(Studie.Type.UNKNOWN); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactoryTest.java b/src/test/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactoryTest.java index 57e505b..7d086de 100644 --- a/src/test/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactoryTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/consent/ConsentManagerServiceFactoryTest.java @@ -19,7 +19,13 @@ package dev.dnpm.oshelper.services.consent; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + import de.itc.onkostar.api.IOnkostarApi; +import java.util.Map; +import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -27,43 +33,33 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Map; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) class ConsentManagerServiceFactoryTest { - private IOnkostarApi onkostarApi; - - private ConsentManagerServiceFactory consentManagerServiceFactory; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.consentManagerServiceFactory = new ConsentManagerServiceFactory(onkostarApi); - } + private ConsentManagerServiceFactory consentManagerServiceFactory; - private static Set<Map.Entry<String, Class<? extends ConsentManagerService>>> expectedMappings() { - return Map.ofEntries( - Map.entry("MR.Consent", MrConsentManagerService.class), - Map.entry("Excel-Formular", UkwConsentManagerService.class) - ).entrySet(); - } + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.consentManagerServiceFactory = new ConsentManagerServiceFactory(onkostarApi); + } - @ParameterizedTest - @MethodSource("expectedMappings") - void testShouldMapFormNameToService(Map.Entry<String, Class<?>> expectedMapping) { - when(onkostarApi.getGlobalSetting(anyString())).thenReturn(expectedMapping.getKey()); + private static Set<Map.Entry<String, Class<? extends ConsentManagerService>>> expectedMappings() { + return Map.ofEntries( + Map.entry("MR.Consent", MrConsentManagerService.class), + Map.entry("Excel-Formular", UkwConsentManagerService.class)) + .entrySet(); + } - var actual = consentManagerServiceFactory.currentUsableInstance(); + @ParameterizedTest + @MethodSource("expectedMappings") + void testShouldMapFormNameToService(Map.Entry<String, Class<?>> expectedMapping) { + when(onkostarApi.getGlobalSetting(anyString())).thenReturn(expectedMapping.getKey()); - assertThat(actual).isExactlyInstanceOf(expectedMapping.getValue()); - } + var actual = consentManagerServiceFactory.currentUsableInstance(); + assertThat(actual).isExactlyInstanceOf(expectedMapping.getValue()); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/consent/MrConsentManagerServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/consent/MrConsentManagerServiceTest.java index 12b9208..b747987 100644 --- a/src/test/java/dev/dnpm/oshelper/services/consent/MrConsentManagerServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/consent/MrConsentManagerServiceTest.java @@ -19,6 +19,9 @@ package dev.dnpm.oshelper.services.consent; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Procedure; import org.hibernate.SQLQuery; @@ -32,47 +35,42 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class MrConsentManagerServiceTest { - private IOnkostarApi onkostarApi; - - private MrConsentManagerService service; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.service = new MrConsentManagerService(onkostarApi); - } + private MrConsentManagerService service; - @Test - void testShouldCreateSqlQueriesWithRelatedEntityIds() { - var sessionFactory = mock(SessionFactory.class); - var session = mock(Session.class); - var query = mock(SQLQuery.class); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.service = new MrConsentManagerService(onkostarApi); + } - when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); - when(sessionFactory.getCurrentSession()).thenReturn(session); - when(session.createSQLQuery(anyString())).thenReturn(query); - when(query.addScalar(anyString(), any(Type.class))).thenReturn(query); - when(query.uniqueResult()).thenReturn(""); + @Test + void testShouldCreateSqlQueriesWithRelatedEntityIds() { + var sessionFactory = mock(SessionFactory.class); + var session = mock(Session.class); + var query = mock(SQLQuery.class); - var dummyProzedur = new Procedure(this.onkostarApi); - dummyProzedur.setId(111); - dummyProzedur.setPatientId(123); + when(onkostarApi.getSessionFactory()).thenReturn(sessionFactory); + when(sessionFactory.getCurrentSession()).thenReturn(session); + when(session.createSQLQuery(anyString())).thenReturn(query); + when(query.addScalar(anyString(), any(Type.class))).thenReturn(query); + when(query.uniqueResult()).thenReturn(""); - this.service.applyConsent(dummyProzedur); + var dummyProzedur = new Procedure(this.onkostarApi); + dummyProzedur.setId(111); + dummyProzedur.setPatientId(123); - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(session, times(2)).createSQLQuery(argumentCaptor.capture()); - assertThat(argumentCaptor.getAllValues()).hasSize(2); - assertThat(argumentCaptor.getAllValues().get(0)).contains("where entity_id = '111'"); - assertThat(argumentCaptor.getAllValues().get(1)).contains("WHERE patient_id = 123 AND geloescht = 0"); - } + this.service.applyConsent(dummyProzedur); + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(session, times(2)).createSQLQuery(argumentCaptor.capture()); + assertThat(argumentCaptor.getAllValues()).hasSize(2); + assertThat(argumentCaptor.getAllValues().get(0)).contains("where entity_id = '111'"); + assertThat(argumentCaptor.getAllValues().get(1)) + .contains("WHERE patient_id = 123 AND geloescht = 0"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerServiceTest.java index f21492d..e28dd64 100644 --- a/src/test/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/consent/UkwConsentManagerServiceTest.java @@ -19,9 +19,14 @@ package dev.dnpm.oshelper.services.consent; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.sql.Date; +import java.time.Instant; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,129 +34,125 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.sql.Date; -import java.time.Instant; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class UkwConsentManagerServiceTest { - private IOnkostarApi onkostarApi; - - private UkwConsentManagerService service; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.service = new UkwConsentManagerService(onkostarApi); - } + private IOnkostarApi onkostarApi; - @Test - void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentAvailable() throws Exception { + private UkwConsentManagerService service; - var excelForm = new Procedure(this.onkostarApi); - excelForm.setId(111); - excelForm.setPatientId(123); - excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.service = new UkwConsentManagerService(onkostarApi); + } - var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); - dnpmKlinikAnamneseForm.setId(2); - dnpmKlinikAnamneseForm.setPatientId(123); + @Test + void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentAvailable() throws Exception { - when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); + var excelForm = new Procedure(this.onkostarApi); + excelForm.setId(111); + excelForm.setPatientId(123); + excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); - this.service.applyConsent(excelForm); + var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); + dnpmKlinikAnamneseForm.setId(2); + dnpmKlinikAnamneseForm.setPatientId(123); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); - } + when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); - @Test - void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentDateAvailable() throws Exception { + this.service.applyConsent(excelForm); - var consentSubForm = new Procedure(this.onkostarApi); - consentSubForm.setId(1); - consentSubForm.setPatientId(123); - consentSubForm.setValue("status", new Item("status", "accepted")); + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); + } + @Test + void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentDateAvailable() + throws Exception { - var excelForm = new Procedure(this.onkostarApi); - excelForm.setId(111); - excelForm.setPatientId(123); - excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); - excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); + var consentSubForm = new Procedure(this.onkostarApi); + consentSubForm.setId(1); + consentSubForm.setPatientId(123); + consentSubForm.setValue("status", new Item("status", "accepted")); - var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); - dnpmKlinikAnamneseForm.setId(2); - dnpmKlinikAnamneseForm.setPatientId(123); + var excelForm = new Procedure(this.onkostarApi); + excelForm.setId(111); + excelForm.setPatientId(123); + excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); + excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); - when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); + var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); + dnpmKlinikAnamneseForm.setId(2); + dnpmKlinikAnamneseForm.setPatientId(123); - this.service.applyConsent(excelForm); + when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); - } + this.service.applyConsent(excelForm); - @Test - void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentValueAvailable() throws Exception { + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); + } - var consentSubForm = new Procedure(this.onkostarApi); - consentSubForm.setId(1); - consentSubForm.setPatientId(123); - consentSubForm.setStartDate(Date.from(Instant.parse("2023-04-03T12:00:00Z"))); - consentSubForm.setValue("datum", new Item("datum", Date.from(Instant.parse("2023-04-03T12:00:00Z")))); + @Test + void testShouldSkipUpdateRelatedDnpmKlinikAnamneseFormIfNoConsentValueAvailable() + throws Exception { - var excelForm = new Procedure(this.onkostarApi); - excelForm.setId(111); - excelForm.setPatientId(123); - excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); - excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); + var consentSubForm = new Procedure(this.onkostarApi); + consentSubForm.setId(1); + consentSubForm.setPatientId(123); + consentSubForm.setStartDate(Date.from(Instant.parse("2023-04-03T12:00:00Z"))); + consentSubForm.setValue( + "datum", new Item("datum", Date.from(Instant.parse("2023-04-03T12:00:00Z")))); - var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); - dnpmKlinikAnamneseForm.setId(2); - dnpmKlinikAnamneseForm.setPatientId(123); + var excelForm = new Procedure(this.onkostarApi); + excelForm.setId(111); + excelForm.setPatientId(123); + excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); + excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); - when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); + var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); + dnpmKlinikAnamneseForm.setId(2); + dnpmKlinikAnamneseForm.setPatientId(123); - this.service.applyConsent(excelForm); + when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); - verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); - } + this.service.applyConsent(excelForm); - @Test - void testShouldUpdateRelatedDnpmKlinikAnamneseFormOnFormSave() throws Exception { + verify(onkostarApi, times(0)).saveProcedure(any(Procedure.class), anyBoolean()); + } - var consentSubForm = new Procedure(this.onkostarApi); - consentSubForm.setId(1); - consentSubForm.setPatientId(123); - consentSubForm.setStartDate(Date.from(Instant.parse("2023-04-03T12:00:00Z"))); - consentSubForm.setValue("datum", new Item("datum", Date.from(Instant.parse("2023-04-03T12:00:00Z")))); - consentSubForm.setValue("status", new Item("status", "accepted")); + @Test + void testShouldUpdateRelatedDnpmKlinikAnamneseFormOnFormSave() throws Exception { - var excelForm = new Procedure(this.onkostarApi); - excelForm.setId(111); - excelForm.setPatientId(123); - excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); - excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); + var consentSubForm = new Procedure(this.onkostarApi); + consentSubForm.setId(1); + consentSubForm.setPatientId(123); + consentSubForm.setStartDate(Date.from(Instant.parse("2023-04-03T12:00:00Z"))); + consentSubForm.setValue( + "datum", new Item("datum", Date.from(Instant.parse("2023-04-03T12:00:00Z")))); + consentSubForm.setValue("status", new Item("status", "accepted")); - var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); - dnpmKlinikAnamneseForm.setId(2); - dnpmKlinikAnamneseForm.setPatientId(123); + var excelForm = new Procedure(this.onkostarApi); + excelForm.setId(111); + excelForm.setPatientId(123); + excelForm.setValue("refdnpmklinikanamnese", new Item("refdnpmklinikanamnese", 2)); + excelForm.addSubProcedure("ufdnpmconsent", consentSubForm); - when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); + var dnpmKlinikAnamneseForm = new Procedure(this.onkostarApi); + dnpmKlinikAnamneseForm.setId(2); + dnpmKlinikAnamneseForm.setPatientId(123); - this.service.applyConsent(excelForm); + when(onkostarApi.getProcedure(anyInt())).thenReturn(dnpmKlinikAnamneseForm); - var argumentCaptor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(argumentCaptor.capture(), anyBoolean()); + this.service.applyConsent(excelForm); - var savedForm = argumentCaptor.getValue(); - assertThat(savedForm).isExactlyInstanceOf(Procedure.class); - assertThat(savedForm.getValue("ConsentStatusEinwilligungDNPM").getString()).isEqualTo("accepted"); - assertThat(savedForm.getValue("ConsentDatumEinwilligungDNPM").getDate()).isEqualTo("2023-04-03T12:00:00Z"); - } + var argumentCaptor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(argumentCaptor.capture(), anyBoolean()); + var savedForm = argumentCaptor.getValue(); + assertThat(savedForm).isExactlyInstanceOf(Procedure.class); + assertThat(savedForm.getValue("ConsentStatusEinwilligungDNPM").getString()) + .isEqualTo("accepted"); + assertThat(savedForm.getValue("ConsentDatumEinwilligungDNPM").getDate()) + .isEqualTo("2023-04-03T12:00:00Z"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekluargenetikFormServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekluargenetikFormServiceTest.java index 61f82fa..5182160 100644 --- a/src/test/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekluargenetikFormServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/molekulargenetik/OsMolekluargenetikFormServiceTest.java @@ -19,50 +19,49 @@ package dev.dnpm.oshelper.services.molekulargenetik; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - class OsMolekluargenetikFormServiceTest { - private OsMolekulargenetikFormService service; - - @BeforeEach - void setup() { - this.service = new OsMolekulargenetikFormService(); - } + private OsMolekulargenetikFormService service; - @Test - void testShouldReturnVariants() { + @BeforeEach + void setup() { + this.service = new OsMolekulargenetikFormService(); + } - var procedure = new Procedure(null); - procedure.setId(123); - procedure.setFormName("OS.Molekulargenetik"); + @Test + void testShouldReturnVariants() { - var subProcedure1 = new Procedure(null); - subProcedure1.setId(1123); - subProcedure1.setFormName("OS.Molekulargenetische Untersuchung"); - subProcedure1.setValue("Ergebnis", new Item("Ergebnis", "P")); - subProcedure1.setValue("Untersucht", new Item("Untersucht", "BRAF")); - subProcedure1.setValue("ExonInt", new Item("ExonInt", 123)); - subProcedure1.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - procedure.addSubProcedure("MolekulargenetischeUntersuchung", subProcedure1); + var procedure = new Procedure(null); + procedure.setId(123); + procedure.setFormName("OS.Molekulargenetik"); - var subProcedure2 = new Procedure(null); - subProcedure2.setId(2123); - subProcedure2.setFormName("OS.Molekulargenetische Untersuchung"); - subProcedure2.setValue("Ergebnis", new Item("Ergebnis", "CNV")); - subProcedure2.setValue("Untersucht", new Item("Untersucht", "BRAF")); - subProcedure2.setValue("ExonInt", new Item("ExonInt", 123)); - subProcedure2.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); - procedure.addSubProcedure("MolekulargenetischeUntersuchung", subProcedure2); + var subProcedure1 = new Procedure(null); + subProcedure1.setId(1123); + subProcedure1.setFormName("OS.Molekulargenetische Untersuchung"); + subProcedure1.setValue("Ergebnis", new Item("Ergebnis", "P")); + subProcedure1.setValue("Untersucht", new Item("Untersucht", "BRAF")); + subProcedure1.setValue("ExonInt", new Item("ExonInt", 123)); + subProcedure1.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + procedure.addSubProcedure("MolekulargenetischeUntersuchung", subProcedure1); - var actual = service.getVariants(procedure); + var subProcedure2 = new Procedure(null); + subProcedure2.setId(2123); + subProcedure2.setFormName("OS.Molekulargenetische Untersuchung"); + subProcedure2.setValue("Ergebnis", new Item("Ergebnis", "CNV")); + subProcedure2.setValue("Untersucht", new Item("Untersucht", "BRAF")); + subProcedure2.setValue("ExonInt", new Item("ExonInt", 123)); + subProcedure2.setValue("Pathogenitaetsklasse", new Item("Pathogenitaetsklasse", "2")); + procedure.addSubProcedure("MolekulargenetischeUntersuchung", subProcedure2); - assertThat(actual).hasSize(2); - } + var actual = service.getVariants(procedure); + assertThat(actual).hasSize(2); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapperTest.java b/src/test/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapperTest.java index 405853c..b8e43b3 100644 --- a/src/test/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapperTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/mtb/MrMtbAnmeldungToProtocolMapperTest.java @@ -19,140 +19,141 @@ package dev.dnpm.oshelper.services.mtb; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.util.Set; 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 java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doAnswer; - @ExtendWith(MockitoExtension.class) class MrMtbAnmeldungToProtocolMapperTest { - private IOnkostarApi onkostarApi; - - private MrMtbAnmeldungToProtocolMapper mapper; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.mapper = new MrMtbAnmeldungToProtocolMapper(onkostarApi); - } - - @Test - void testShouldMapCompletedForm() { - var anmeldung = new Procedure(onkostarApi); - anmeldung.setId(1); - anmeldung.setFormName("MR.MTB_Anmeldung"); - anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); - anmeldung.setValue("Empfehlung", new Item("Empfehlung", 2)); - - var empfehlung = new Procedure(onkostarApi); - empfehlung.setId(2); - empfehlung.setFormName("MR.MTB_Empfehlung"); - - var einzelempfehlung1 = new Procedure(onkostarApi); - einzelempfehlung1.setId(10); - einzelempfehlung1.setFormName("MR.MTB_Einzelempfehlung"); - einzelempfehlung1.setValue("Prioritaet", new Item("Empfehlungsprio", 1)); - einzelempfehlung1.setValue("Empfehlung", new Item("Empfehlung", "Empfehlung1")); - - var einzelempfehlung2 = new Procedure(onkostarApi); - einzelempfehlung2.setId(20); - einzelempfehlung2.setFormName("MR.MTB_Einzelempfehlung"); - einzelempfehlung2.setValue("Prioritaet", new Item("Empfehlungsprio", 2)); - einzelempfehlung2.setValue("Empfehlung", new Item("Empfehlung", "Empfehlung2")); - - doAnswer(invocationOnMock -> { - var procedureId = invocationOnMock.getArgument(0, Integer.class); - if (2 == procedureId) { + private IOnkostarApi onkostarApi; + + private MrMtbAnmeldungToProtocolMapper mapper; + + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.mapper = new MrMtbAnmeldungToProtocolMapper(onkostarApi); + } + + @Test + void testShouldMapCompletedForm() { + var anmeldung = new Procedure(onkostarApi); + anmeldung.setId(1); + anmeldung.setFormName("MR.MTB_Anmeldung"); + anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); + anmeldung.setValue("Empfehlung", new Item("Empfehlung", 2)); + + var empfehlung = new Procedure(onkostarApi); + empfehlung.setId(2); + empfehlung.setFormName("MR.MTB_Empfehlung"); + + var einzelempfehlung1 = new Procedure(onkostarApi); + einzelempfehlung1.setId(10); + einzelempfehlung1.setFormName("MR.MTB_Einzelempfehlung"); + einzelempfehlung1.setValue("Prioritaet", new Item("Empfehlungsprio", 1)); + einzelempfehlung1.setValue("Empfehlung", new Item("Empfehlung", "Empfehlung1")); + + var einzelempfehlung2 = new Procedure(onkostarApi); + einzelempfehlung2.setId(20); + einzelempfehlung2.setFormName("MR.MTB_Einzelempfehlung"); + einzelempfehlung2.setValue("Prioritaet", new Item("Empfehlungsprio", 2)); + einzelempfehlung2.setValue("Empfehlung", new Item("Empfehlung", "Empfehlung2")); + + doAnswer( + invocationOnMock -> { + var procedureId = invocationOnMock.getArgument(0, Integer.class); + if (2 == procedureId) { return empfehlung; - } else if (10 == procedureId) { + } else if (10 == procedureId) { return einzelempfehlung1; - } else if (20 == procedureId) { + } else if (20 == procedureId) { return einzelempfehlung2; - } - return null; - }).when(onkostarApi).getProcedure(anyInt()); - - doAnswer(invocationOnMock -> { - var procedureId = invocationOnMock.getArgument(0, Integer.class); - if (2 == procedureId) { + } + return null; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + doAnswer( + invocationOnMock -> { + var procedureId = invocationOnMock.getArgument(0, Integer.class); + if (2 == procedureId) { return Set.of(einzelempfehlung1, einzelempfehlung2); - } - return null; - }).when(onkostarApi).getSubprocedures(anyInt()); - - var actual = this.mapper.apply(anmeldung); - - assertThat(actual) - .isPresent() - .contains( - "Fragestellung:\nFrage?\n\n" - + "Empfehlung:\nEmpfehlung1\n\n" - + "Empfehlung:\nEmpfehlung2" - ); - } - - @Test - void testShouldMapFormWithMissingEinzelempfehlungen() { - var anmeldung = new Procedure(onkostarApi); - anmeldung.setId(1); - anmeldung.setFormName("MR.MTB_Anmeldung"); - anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); - anmeldung.setValue("Empfehlung", new Item("Empfehlung", 2)); - - var empfehlung = new Procedure(onkostarApi); - empfehlung.setId(2); - empfehlung.setFormName("MR.MTB_Empfehlung"); - - doAnswer(invocationOnMock -> { - var procedureId = invocationOnMock.getArgument(0, Integer.class); - if (2 == procedureId) { + } + return null; + }) + .when(onkostarApi) + .getSubprocedures(anyInt()); + + var actual = this.mapper.apply(anmeldung); + + assertThat(actual) + .isPresent() + .contains( + "Fragestellung:\nFrage?\n\n" + + "Empfehlung:\nEmpfehlung1\n\n" + + "Empfehlung:\nEmpfehlung2"); + } + + @Test + void testShouldMapFormWithMissingEinzelempfehlungen() { + var anmeldung = new Procedure(onkostarApi); + anmeldung.setId(1); + anmeldung.setFormName("MR.MTB_Anmeldung"); + anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); + anmeldung.setValue("Empfehlung", new Item("Empfehlung", 2)); + + var empfehlung = new Procedure(onkostarApi); + empfehlung.setId(2); + empfehlung.setFormName("MR.MTB_Empfehlung"); + + doAnswer( + invocationOnMock -> { + var procedureId = invocationOnMock.getArgument(0, Integer.class); + if (2 == procedureId) { return empfehlung; - } - return null; - }).when(onkostarApi).getProcedure(anyInt()); + } + return null; + }) + .when(onkostarApi) + .getProcedure(anyInt()); - var actual = this.mapper.apply(anmeldung); + var actual = this.mapper.apply(anmeldung); - assertThat(actual) - .isPresent() - .contains("Fragestellung:\nFrage?"); - } + assertThat(actual).isPresent().contains("Fragestellung:\nFrage?"); + } - @Test - void testShouldMapFormWithMissingEmpfehlung() { - var anmeldung = new Procedure(onkostarApi); - anmeldung.setId(1); - anmeldung.setFormName("MR.MTB_Anmeldung"); - anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); + @Test + void testShouldMapFormWithMissingEmpfehlung() { + var anmeldung = new Procedure(onkostarApi); + anmeldung.setId(1); + anmeldung.setFormName("MR.MTB_Anmeldung"); + anmeldung.setValue("Fragestellung", new Item("Fragestellung", "Frage?")); - var actual = this.mapper.apply(anmeldung); + var actual = this.mapper.apply(anmeldung); - assertThat(actual) - .isPresent() - .contains("Fragestellung:\nFrage?"); - } + assertThat(actual).isPresent().contains("Fragestellung:\nFrage?"); + } - @Test - void testShouldMapFormWithMissingFragestellungAndEmpfehlung() { - var anmeldung = new Procedure(onkostarApi); - anmeldung.setId(1); - anmeldung.setFormName("MR.MTB_Anmeldung"); + @Test + void testShouldMapFormWithMissingFragestellungAndEmpfehlung() { + var anmeldung = new Procedure(onkostarApi); + anmeldung.setId(1); + anmeldung.setFormName("MR.MTB_Anmeldung"); - var actual = this.mapper.apply(anmeldung); + var actual = this.mapper.apply(anmeldung); - assertThat(actual).isEmpty(); - } + assertThat(actual).isEmpty(); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapperTest.java b/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapperTest.java index ac86bb6..7ab8ecf 100644 --- a/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapperTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzToProtocolMapperTest.java @@ -19,48 +19,44 @@ package dev.dnpm.oshelper.services.mtb; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.time.Instant; +import java.util.Date; 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 java.time.Instant; -import java.util.Date; - -import static org.assertj.core.api.Assertions.assertThat; - @ExtendWith(MockitoExtension.class) class OsTumorkonferenzToProtocolMapperTest { - private IOnkostarApi onkostarApi; - - private OsTumorkonferenzToProtocolMapper mapper; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.mapper = new OsTumorkonferenzToProtocolMapper(); - } + private OsTumorkonferenzToProtocolMapper mapper; - @Test - void testShouldReturnMtbProtocolForDefaultImplementation() { - var procedure = new Procedure(onkostarApi); - procedure.setFormName("OS.Tumorkonferenz"); - procedure.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); - procedure.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); - procedure.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.mapper = new OsTumorkonferenzToProtocolMapper(); + } - var actual = mapper.apply(procedure); + @Test + void testShouldReturnMtbProtocolForDefaultImplementation() { + var procedure = new Procedure(onkostarApi); + procedure.setFormName("OS.Tumorkonferenz"); + procedure.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); + procedure.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); + procedure.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); - assertThat(actual) - .isPresent() - .contains("Fragestellung:\nTest ok?\n\nEmpfehlung:\nRerun Test if not ok!"); - } + var actual = mapper.apply(procedure); + assertThat(actual) + .isPresent() + .contains("Fragestellung:\nTest ok?\n\nEmpfehlung:\nRerun Test if not ok!"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapperTest.java b/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapperTest.java index ba606ae..0c10371 100644 --- a/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapperTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapperTest.java @@ -19,48 +19,44 @@ package dev.dnpm.oshelper.services.mtb; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.time.Instant; +import java.util.Date; 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 java.time.Instant; -import java.util.Date; - -import static org.assertj.core.api.Assertions.assertThat; - @ExtendWith(MockitoExtension.class) class OsTumorkonferenzVarianteUkwToProtocolMapperTest { - private IOnkostarApi onkostarApi; - - private OsTumorkonferenzVarianteUkwToProtocolMapper mapper; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.mapper = new OsTumorkonferenzVarianteUkwToProtocolMapper(); - } + private OsTumorkonferenzVarianteUkwToProtocolMapper mapper; - @Test - void testShouldReturnMtbProtocolForDefaultImplementation() { - var procedure = new Procedure(onkostarApi); - procedure.setFormName("OS.Tumorkonferenz.VarianteUKW"); - procedure.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); - procedure.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); - procedure.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.mapper = new OsTumorkonferenzVarianteUkwToProtocolMapper(); + } - var actual = mapper.apply(procedure); + @Test + void testShouldReturnMtbProtocolForDefaultImplementation() { + var procedure = new Procedure(onkostarApi); + procedure.setFormName("OS.Tumorkonferenz.VarianteUKW"); + procedure.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); + procedure.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); + procedure.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); - assertThat(actual) - .isPresent() - .contains("Fragestellung:\nTest ok?\n\nEmpfehlung:\nRerun Test if not ok!"); - } + var actual = mapper.apply(procedure); + assertThat(actual) + .isPresent() + .contains("Fragestellung:\nTest ok?\n\nEmpfehlung:\nRerun Test if not ok!"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieServiceTest.java index 8457dea..16436bd 100644 --- a/src/test/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/strahlentherapie/DefaultStrahlentherapieServiceTest.java @@ -19,8 +19,16 @@ package dev.dnpm.oshelper.services.strahlentherapie; -import dev.dnpm.oshelper.services.SettingsService; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.*; +import dev.dnpm.oshelper.services.SettingsService; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Optional; import org.assertj.core.util.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,95 +37,95 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class DefaultStrahlentherapieServiceTest { - private IOnkostarApi onkostarApi; - - private SettingsService settingsService; - - private DefaultStrahlentherapieService service; - - @BeforeEach - void setup(@Mock IOnkostarApi onkostarApi, @Mock SettingsService settingsService) { - this.onkostarApi = onkostarApi; - this.settingsService = settingsService; - this.service = new DefaultStrahlentherapieService(onkostarApi, settingsService); - } - - @Test - void testShouldRequestProceduresWithDefaultFormName() { - when(this.settingsService.getSetting(anyString())).thenReturn(Optional.empty()); - - doAnswer(invocationOnMock -> { - var procedure = new Procedure(onkostarApi); - procedure.setId(1); - procedure.setFormName("OS.Strahlentherapie"); - procedure.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); - procedure.setEditState(ProcedureEditStateType.COMPLETED); - procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - return Lists.list(procedure); - }).when(this.onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - doAnswer(invocationOnMock -> { - var disease = new Disease(onkostarApi); - disease.setId(1); - disease.setPatientId(123); - return Lists.list(disease); - }).when(this.onkostarApi).getDiseasesByPatientId(anyInt()); - - var patient = new Patient(onkostarApi); - patient.setId(123); - - service.ecogStatus(patient); - - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).isEqualTo("OS.Strahlentherapie"); - } - - @Test - void testShouldReturnListOfEcogStatusWithDate() { - doAnswer(invocationOnMock -> { - var disease = new Disease(onkostarApi); - disease.setId(1); - return List.of(disease); - }).when(this.onkostarApi).getDiseasesByPatientId(anyInt()); - - doAnswer(invocationOnMock -> { - var procedure1 = new Procedure(onkostarApi); - procedure1.setId(1); - procedure1.setFormName("OS.Strahlentherapie"); - procedure1.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); - procedure1.setEditState(ProcedureEditStateType.COMPLETED); - procedure1.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - var procedure2 = new Procedure(onkostarApi); - procedure2.setId(2); - procedure2.setFormName("OS.Strahlentherapie"); - procedure2.setStartDate(Date.from(Instant.parse("2023-07-12T06:00:00Z"))); - procedure2.setEditState(ProcedureEditStateType.COMPLETED); - procedure2.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 2)); - return List.of(procedure1, procedure2); - }).when(this.onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var actual = service.ecogStatus(patient); - - assertThat(actual) - .isNotNull() - .isExactlyInstanceOf(ArrayList.class) - .hasSize(2); - } + private IOnkostarApi onkostarApi; + + private SettingsService settingsService; + + private DefaultStrahlentherapieService service; + + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi, @Mock SettingsService settingsService) { + this.onkostarApi = onkostarApi; + this.settingsService = settingsService; + this.service = new DefaultStrahlentherapieService(onkostarApi, settingsService); + } + + @Test + void testShouldRequestProceduresWithDefaultFormName() { + when(this.settingsService.getSetting(anyString())).thenReturn(Optional.empty()); + + doAnswer( + invocationOnMock -> { + var procedure = new Procedure(onkostarApi); + procedure.setId(1); + procedure.setFormName("OS.Strahlentherapie"); + procedure.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); + procedure.setEditState(ProcedureEditStateType.COMPLETED); + procedure.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + return Lists.list(procedure); + }) + .when(this.onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + doAnswer( + invocationOnMock -> { + var disease = new Disease(onkostarApi); + disease.setId(1); + disease.setPatientId(123); + return Lists.list(disease); + }) + .when(this.onkostarApi) + .getDiseasesByPatientId(anyInt()); + + var patient = new Patient(onkostarApi); + patient.setId(123); + + service.ecogStatus(patient); + + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).isEqualTo("OS.Strahlentherapie"); + } + + @Test + void testShouldReturnListOfEcogStatusWithDate() { + doAnswer( + invocationOnMock -> { + var disease = new Disease(onkostarApi); + disease.setId(1); + return List.of(disease); + }) + .when(this.onkostarApi) + .getDiseasesByPatientId(anyInt()); + + doAnswer( + invocationOnMock -> { + var procedure1 = new Procedure(onkostarApi); + procedure1.setId(1); + procedure1.setFormName("OS.Strahlentherapie"); + procedure1.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); + procedure1.setEditState(ProcedureEditStateType.COMPLETED); + procedure1.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + var procedure2 = new Procedure(onkostarApi); + procedure2.setId(2); + procedure2.setFormName("OS.Strahlentherapie"); + procedure2.setStartDate(Date.from(Instant.parse("2023-07-12T06:00:00Z"))); + procedure2.setEditState(ProcedureEditStateType.COMPLETED); + procedure2.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 2)); + return List.of(procedure1, procedure2); + }) + .when(this.onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var actual = service.ecogStatus(patient); + + assertThat(actual).isNotNull().isExactlyInstanceOf(ArrayList.class).hasSize(2); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieServiceTest.java index e8d474b..05cd535 100644 --- a/src/test/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/systemtherapie/DefaultSystemtherapieServiceTest.java @@ -19,8 +19,13 @@ package dev.dnpm.oshelper.services.systemtherapie; -import dev.dnpm.oshelper.services.SettingsService; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.*; +import dev.dnpm.oshelper.services.SettingsService; +import java.time.Instant; +import java.util.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -30,121 +35,126 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.Instant; -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class DefaultSystemtherapieServiceTest { - private IOnkostarApi onkostarApi; - - private SettingsService settingsService; - - private DefaultSystemtherapieService service; - - @BeforeEach - void setup(@Mock IOnkostarApi onkostarApi, @Mock SettingsService settingsService) { - this.onkostarApi = onkostarApi; - this.settingsService = settingsService; - this.service = new DefaultSystemtherapieService(onkostarApi, settingsService); - } - - private static Set<Map.Entry<String, Class<OsSystemischeTherapieToProzedurwerteMapper>>> expectedMapperMappings() { - return Map.ofEntries(Map.entry("OS.Systemische Therapie", OsSystemischeTherapieToProzedurwerteMapper.class), Map.entry("OS.Systemische Therapie.VarianteUKW", OsSystemischeTherapieToProzedurwerteMapper.class)).entrySet(); - } - - @ParameterizedTest - @MethodSource("expectedMapperMappings") - void testShouldMapFormNameToMapper(Map.Entry<String, Class<?>> expectedMapping) { - var procedure = new Procedure(onkostarApi); - procedure.setFormName(expectedMapping.getKey()); - - var actual = service.prozedurToProzedurwerteMapper(procedure); - - assertThat(actual).isExactlyInstanceOf(expectedMapping.getValue()); - } - - private static List<String> formnameSetting() { - return List.of("OS.Systemische Therapie", "OS.Systemische Therapie.VarianteUKW"); - } - - @ParameterizedTest - @MethodSource("formnameSetting") - void testShouldRequestProceduresWithExpectedFormName(String expectedFormName) { - when(this.settingsService.getSetting(anyString())).thenReturn(Optional.of(expectedFormName)); - when(this.onkostarApi.getProceduresForDiseaseByForm(anyInt(), anyString())).thenReturn(List.of()); - - service.getSystemischeTherapienFromDiagnose(123); - - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).isEqualTo(expectedFormName); - } - - @Test - void testShouldRequestProceduresWithDefaultFormName() { - when(this.settingsService.getSetting(anyString())).thenReturn(Optional.empty()); - when(this.onkostarApi.getProceduresForDiseaseByForm(anyInt(), anyString())).thenReturn(List.of()); - - service.getSystemischeTherapienFromDiagnose(123); - - var argumentCaptor = ArgumentCaptor.forClass(String.class); - verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()).isEqualTo("OS.Systemische Therapie"); - } - - @Test - void testShouldReturnSystemischeTherapienFromDiagnose() { - doAnswer(invocationOnMock -> { - var procedure = new Procedure(onkostarApi); - procedure.setFormName("OS.Systemische Therapie"); - return List.of(procedure); - }).when(this.onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - var actual = service.getSystemischeTherapienFromDiagnose(1); - - assertThat(actual) - .isNotNull() - .isExactlyInstanceOf(ArrayList.class) - .hasSize(1); - } - - @Test - void testShouldReturnListOfEcogStatusWithDate() { - doAnswer(invocationOnMock -> { - var disease = new Disease(onkostarApi); - disease.setId(1); - return List.of(disease); - }).when(this.onkostarApi).getDiseasesByPatientId(anyInt()); - - doAnswer(invocationOnMock -> { - var procedure1 = new Procedure(onkostarApi); - procedure1.setId(1); - procedure1.setFormName("OS.Systemische Therapie"); - procedure1.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); - procedure1.setEditState(ProcedureEditStateType.COMPLETED); - procedure1.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); - - var procedure2 = new Procedure(onkostarApi); - procedure2.setId(2); - procedure2.setFormName("OS.Systemische Therapie"); - procedure2.setStartDate(Date.from(Instant.parse("2023-07-12T06:00:00Z"))); - procedure2.setEditState(ProcedureEditStateType.COMPLETED); - procedure2.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 2)); - return List.of(procedure1, procedure2); - }).when(this.onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - var patient = new Patient(onkostarApi); - patient.setId(1); - - var actual = service.ecogStatus(patient); - - assertThat(actual) - .isNotNull() - .isExactlyInstanceOf(ArrayList.class) - .hasSize(2); - } + private IOnkostarApi onkostarApi; + + private SettingsService settingsService; + + private DefaultSystemtherapieService service; + + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi, @Mock SettingsService settingsService) { + this.onkostarApi = onkostarApi; + this.settingsService = settingsService; + this.service = new DefaultSystemtherapieService(onkostarApi, settingsService); + } + + private static Set<Map.Entry<String, Class<OsSystemischeTherapieToProzedurwerteMapper>>> + expectedMapperMappings() { + return Map.ofEntries( + Map.entry("OS.Systemische Therapie", OsSystemischeTherapieToProzedurwerteMapper.class), + Map.entry( + "OS.Systemische Therapie.VarianteUKW", + OsSystemischeTherapieToProzedurwerteMapper.class)) + .entrySet(); + } + + @ParameterizedTest + @MethodSource("expectedMapperMappings") + void testShouldMapFormNameToMapper(Map.Entry<String, Class<?>> expectedMapping) { + var procedure = new Procedure(onkostarApi); + procedure.setFormName(expectedMapping.getKey()); + + var actual = service.prozedurToProzedurwerteMapper(procedure); + + assertThat(actual).isExactlyInstanceOf(expectedMapping.getValue()); + } + + private static List<String> formnameSetting() { + return List.of("OS.Systemische Therapie", "OS.Systemische Therapie.VarianteUKW"); + } + + @ParameterizedTest + @MethodSource("formnameSetting") + void testShouldRequestProceduresWithExpectedFormName(String expectedFormName) { + when(this.settingsService.getSetting(anyString())).thenReturn(Optional.of(expectedFormName)); + when(this.onkostarApi.getProceduresForDiseaseByForm(anyInt(), anyString())) + .thenReturn(List.of()); + + service.getSystemischeTherapienFromDiagnose(123); + + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).isEqualTo(expectedFormName); + } + + @Test + void testShouldRequestProceduresWithDefaultFormName() { + when(this.settingsService.getSetting(anyString())).thenReturn(Optional.empty()); + when(this.onkostarApi.getProceduresForDiseaseByForm(anyInt(), anyString())) + .thenReturn(List.of()); + + service.getSystemischeTherapienFromDiagnose(123); + + var argumentCaptor = ArgumentCaptor.forClass(String.class); + verify(onkostarApi, times(1)).getProceduresForDiseaseByForm(anyInt(), argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).isEqualTo("OS.Systemische Therapie"); + } + + @Test + void testShouldReturnSystemischeTherapienFromDiagnose() { + doAnswer( + invocationOnMock -> { + var procedure = new Procedure(onkostarApi); + procedure.setFormName("OS.Systemische Therapie"); + return List.of(procedure); + }) + .when(this.onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + var actual = service.getSystemischeTherapienFromDiagnose(1); + + assertThat(actual).isNotNull().isExactlyInstanceOf(ArrayList.class).hasSize(1); + } + + @Test + void testShouldReturnListOfEcogStatusWithDate() { + doAnswer( + invocationOnMock -> { + var disease = new Disease(onkostarApi); + disease.setId(1); + return List.of(disease); + }) + .when(this.onkostarApi) + .getDiseasesByPatientId(anyInt()); + + doAnswer( + invocationOnMock -> { + var procedure1 = new Procedure(onkostarApi); + procedure1.setId(1); + procedure1.setFormName("OS.Systemische Therapie"); + procedure1.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z"))); + procedure1.setEditState(ProcedureEditStateType.COMPLETED); + procedure1.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1)); + + var procedure2 = new Procedure(onkostarApi); + procedure2.setId(2); + procedure2.setFormName("OS.Systemische Therapie"); + procedure2.setStartDate(Date.from(Instant.parse("2023-07-12T06:00:00Z"))); + procedure2.setEditState(ProcedureEditStateType.COMPLETED); + procedure2.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 2)); + return List.of(procedure1, procedure2); + }) + .when(this.onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + var patient = new Patient(onkostarApi); + patient.setId(1); + + var actual = service.ecogStatus(patient); + + assertThat(actual).isNotNull().isExactlyInstanceOf(ArrayList.class).hasSize(2); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapperTest.java b/src/test/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapperTest.java index 6c7c532..085834f 100644 --- a/src/test/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapperTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/systemtherapie/ProzedurToProzedurwerteMapperTest.java @@ -19,72 +19,72 @@ package dev.dnpm.oshelper.services.systemtherapie; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; +import java.sql.Date; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Map; 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 java.sql.Date; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - @ExtendWith(MockitoExtension.class) class ProzedurToProzedurwerteMapperTest { - private IOnkostarApi onkostarApi; - - private OsSystemischeTherapieToProzedurwerteMapper mapper; + private IOnkostarApi onkostarApi; - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi - ) { - this.onkostarApi = onkostarApi; - this.mapper = new OsSystemischeTherapieToProzedurwerteMapper(); - } + private OsSystemischeTherapieToProzedurwerteMapper mapper; - @Test - void testShouldReturnSystemischeTherapienFromDiagnose() { - var procedure = new Procedure(onkostarApi); - procedure.setFormName("OS.Systemische Therapie"); - procedure.setValue("Beginn", new Item("Beginn", Date.from(Instant.parse("2023-01-01T00:00:00Z")))); - procedure.setValue("Ende", new Item("Ende", Date.from(Instant.parse("2023-01-31T00:00:00Z")))); - procedure.setValue("Beendigung", new Item("Beendigungsstatus", "E")); - procedure.setValue("Ergebnis", new Item("Ergebnis", "T")); + @BeforeEach + void setup(@Mock IOnkostarApi onkostarApi) { + this.onkostarApi = onkostarApi; + this.mapper = new OsSystemischeTherapieToProzedurwerteMapper(); + } - var substanzen = new ArrayList<>(); - substanzen.add(Map.of( - "Substanz", "Testsubstanz", - "Substanz_shortDescription", "Testsubstanz" - )); - substanzen.add(Map.of( - "Substanz", "L01AA01", - "Substanz_shortDescription", "cyclophosphamide" - )); - procedure.setValue("SubstanzenList", new Item("SubstanzenList", substanzen)); + @Test + void testShouldReturnSystemischeTherapienFromDiagnose() { + var procedure = new Procedure(onkostarApi); + procedure.setFormName("OS.Systemische Therapie"); + procedure.setValue( + "Beginn", new Item("Beginn", Date.from(Instant.parse("2023-01-01T00:00:00Z")))); + procedure.setValue("Ende", new Item("Ende", Date.from(Instant.parse("2023-01-31T00:00:00Z")))); + procedure.setValue("Beendigung", new Item("Beendigungsstatus", "E")); + procedure.setValue("Ergebnis", new Item("Ergebnis", "T")); - var actual = mapper.apply(procedure); + var substanzen = new ArrayList<>(); + substanzen.add( + Map.of( + "Substanz", "Testsubstanz", + "Substanz_shortDescription", "Testsubstanz")); + substanzen.add( + Map.of( + "Substanz", "L01AA01", + "Substanz_shortDescription", "cyclophosphamide")); + procedure.setValue("SubstanzenList", new Item("SubstanzenList", substanzen)); - assertThat(actual).isPresent(); + var actual = mapper.apply(procedure); - assertThat(actual.get()).containsEntry("Beginn", Date.from(Instant.parse("2023-01-01T00:00:00Z")).toString()); - assertThat(actual.get()).containsEntry("Ende", Date.from(Instant.parse("2023-01-31T00:00:00Z")).toString()); - assertThat(actual.get()).containsEntry("Beendigung", "E"); - assertThat(actual.get()).containsEntry("Ergebnis", "T"); - assertThat(actual.get()).containsEntry("Wirkstoffe", "Testsubstanz, cyclophosphamide"); - assertThat(actual.get()).containsEntry("WirkstoffCodes", - "[" + - "{\"system\":\"other\",\"code\":\"Testsubstanz\",\"substance\":\"Testsubstanz\"}," + - "{\"system\":\"ATC\",\"code\":\"L01AA01\",\"substance\":\"cyclophosphamide\"}" + - "]" - ); - } + assertThat(actual).isPresent(); + assertThat(actual.get()) + .containsEntry("Beginn", Date.from(Instant.parse("2023-01-01T00:00:00Z")).toString()); + assertThat(actual.get()) + .containsEntry("Ende", Date.from(Instant.parse("2023-01-31T00:00:00Z")).toString()); + assertThat(actual.get()).containsEntry("Beendigung", "E"); + assertThat(actual.get()).containsEntry("Ergebnis", "T"); + assertThat(actual.get()).containsEntry("Wirkstoffe", "Testsubstanz, cyclophosphamide"); + assertThat(actual.get()) + .containsEntry( + "WirkstoffCodes", + "[" + + "{\"system\":\"other\",\"code\":\"Testsubstanz\",\"substance\":\"Testsubstanz\"}," + + "{\"system\":\"ATC\",\"code\":\"L01AA01\",\"substance\":\"cyclophosphamide\"}" + + "]"); + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanServiceTest.java b/src/test/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanServiceTest.java index 18865a8..1d68e08 100644 --- a/src/test/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanServiceTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/therapieplan/DefaultTherapieplanServiceTest.java @@ -19,11 +19,17 @@ package dev.dnpm.oshelper.services.therapieplan; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + import de.itc.onkostar.api.IOnkostarApi; import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.constants.JaNeinUnbekannt; import dev.dnpm.oshelper.services.FormService; +import java.time.Instant; +import java.util.Date; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -31,158 +37,166 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.Instant; -import java.util.Date; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class DefaultTherapieplanServiceTest { - private IOnkostarApi onkostarApi; - - private TherapieplanService service; - - @BeforeEach - void setUp( - @Mock IOnkostarApi onkostarApi, - @Mock FormService formService - ) { - this.onkostarApi = onkostarApi; - this.service = new DefaultTherapieplanService(onkostarApi, formService); - } - - @Test - void shouldNotUpdateSubformsOrSectionsIfMultipleMtbConfiguration() throws Exception { - this.service.updateRequiredMtbEntries(new Procedure(onkostarApi)); - verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldNotUpdateSectionsIfSectionsNotEnabled() throws Exception { - var testProcedure = baseProcedure(onkostarApi); - - // Keine humangenetische Beratung und keine Reevaluation empfohlen - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); - - this.service.updateRequiredMtbEntries(testProcedure); - - verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldUpdateSectionsIfNoReevaluation() throws Exception { - var testProcedure = baseProcedure(onkostarApi); - - // Humangenetische Beratung aber keine Reevaluation - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.JA.getCode())); - testProcedure.setValue("humangenberbegruendung", new Item("humangen_ber_begruendung", "Das ist die Begründung")); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); - - this.service.updateRequiredMtbEntries(testProcedure); - - var captor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); - - var capturedProcedure = captor.getValue(); - - assertThat(capturedProcedure.getValue("reftkreevaluation")).isNull(); - assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNull(); - - assertThat(capturedProcedure.getValue("reftkhumangenber")).isNotNull(); - assertThat(capturedProcedure.getValue("reftkhumangenber").getInt()).isEqualTo(procedureId); - assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNotNull(); - assertThat(capturedProcedure.getValue("datumtkhumangenber").getDate()).isEqualTo(testDate); - } - - @Test - void shouldUpdateSectionsIfNoHumanGenConsultation() throws Exception { - var testProcedure = baseProcedure(onkostarApi); - - // Humangenetische Beratung aber keine Reevaluation - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.JA.getCode())); - - this.service.updateRequiredMtbEntries(testProcedure); - - var captor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); - - var capturedProcedure = captor.getValue(); - - assertThat(capturedProcedure.getValue("reftkhumangenber")).isNull(); - assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNull(); - - assertThat(capturedProcedure.getValue("reftkreevaluation")).isNotNull(); - assertThat(capturedProcedure.getValue("reftkreevaluation").getInt()).isEqualTo(procedureId); - assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNotNull(); - assertThat(capturedProcedure.getValue("datumtkreevaluation").getDate()).isEqualTo(testDate); - } - - @Test - void shouldFindFollowUps() { - doAnswer(invocationOnMock -> { - var testProcedure = baseProcedure(onkostarApi); - testProcedure.setId(procedureId); - testProcedure.setFormName("DNPM UF Einzelempfehlung"); - testProcedure.addDiseaseId(123); - return testProcedure; - }).when(onkostarApi).getProcedure(anyInt()); - - doAnswer(invocationOnMock -> { - var diseaseId = invocationOnMock.getArgument(0, Integer.class); - var formName = invocationOnMock.getArgument(1, String.class); - var procedure = baseProcedure(onkostarApi); - procedure.addDiseaseId(diseaseId); - procedure.setFormName(formName); - procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", procedureId)); - return List.of(procedure); - }).when(onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - var followUps = this.service.findReferencedFollowUpsForSubform(1); - - assertThat(followUps).hasSize(1) - .allSatisfy(procedure -> assertThat(procedure.getFormName()).isEqualTo("DNPM FollowUp")); - } - - @Test - void shouldFindFollowUpsById() { - var testProcedure = baseProcedure(onkostarApi); - testProcedure.setId(procedureId); - testProcedure.setFormName("DNPM UF Einzelempfehlung"); - testProcedure.addDiseaseId(123); - - doAnswer(invocationOnMock -> { - var diseaseId = invocationOnMock.getArgument(0, Integer.class); - var formName = invocationOnMock.getArgument(1, String.class); - var procedure = baseProcedure(onkostarApi); - procedure.addDiseaseId(diseaseId); - procedure.setFormName(formName); - procedure.setValue("LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", procedureId)); - return List.of(procedure); - }).when(onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString()); - - var followUps = this.service.findReferencedFollowUpsForSubform(testProcedure); - - assertThat(followUps).hasSize(1) - .allSatisfy(procedure -> assertThat(procedure.getFormName()).isEqualTo("DNPM FollowUp")); - } - - private static final int procedureId = 1234; - private static final Date testDate = Date.from(Instant.parse("2023-03-15T09:43:00Z")); - - private Procedure baseProcedure(final IOnkostarApi onkostarApi) { - var testProcedure = new Procedure(onkostarApi); - testProcedure.setId(1000); - - // Setzen MTB Referenz und Datum MTB - testProcedure.setValue("referstemtb", new Item("ref_tumorkonferenz", procedureId)); - testProcedure.setValue("datum", new Item("datum", testDate)); - - return testProcedure; - } - + private IOnkostarApi onkostarApi; + + private TherapieplanService service; + + @BeforeEach + void setUp(@Mock IOnkostarApi onkostarApi, @Mock FormService formService) { + this.onkostarApi = onkostarApi; + this.service = new DefaultTherapieplanService(onkostarApi, formService); + } + + @Test + void shouldNotUpdateSubformsOrSectionsIfMultipleMtbConfiguration() throws Exception { + this.service.updateRequiredMtbEntries(new Procedure(onkostarApi)); + verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldNotUpdateSectionsIfSectionsNotEnabled() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Keine humangenetische Beratung und keine Reevaluation empfohlen + testProcedure.setValue( + "humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); + testProcedure.setValue( + "reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldUpdateSectionsIfNoReevaluation() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Humangenetische Beratung aber keine Reevaluation + testProcedure.setValue( + "humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.JA.getCode())); + testProcedure.setValue( + "humangenberbegruendung", new Item("humangen_ber_begruendung", "Das ist die Begründung")); + testProcedure.setValue( + "reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + var captor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); + + var capturedProcedure = captor.getValue(); + + assertThat(capturedProcedure.getValue("reftkreevaluation")).isNull(); + assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNull(); + + assertThat(capturedProcedure.getValue("reftkhumangenber")).isNotNull(); + assertThat(capturedProcedure.getValue("reftkhumangenber").getInt()).isEqualTo(procedureId); + assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNotNull(); + assertThat(capturedProcedure.getValue("datumtkhumangenber").getDate()).isEqualTo(testDate); + } + + @Test + void shouldUpdateSectionsIfNoHumanGenConsultation() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Humangenetische Beratung aber keine Reevaluation + testProcedure.setValue( + "humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); + testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.JA.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + var captor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); + + var capturedProcedure = captor.getValue(); + + assertThat(capturedProcedure.getValue("reftkhumangenber")).isNull(); + assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNull(); + + assertThat(capturedProcedure.getValue("reftkreevaluation")).isNotNull(); + assertThat(capturedProcedure.getValue("reftkreevaluation").getInt()).isEqualTo(procedureId); + assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNotNull(); + assertThat(capturedProcedure.getValue("datumtkreevaluation").getDate()).isEqualTo(testDate); + } + + @Test + void shouldFindFollowUps() { + doAnswer( + invocationOnMock -> { + var testProcedure = baseProcedure(onkostarApi); + testProcedure.setId(procedureId); + testProcedure.setFormName("DNPM UF Einzelempfehlung"); + testProcedure.addDiseaseId(123); + return testProcedure; + }) + .when(onkostarApi) + .getProcedure(anyInt()); + + doAnswer( + invocationOnMock -> { + var diseaseId = invocationOnMock.getArgument(0, Integer.class); + var formName = invocationOnMock.getArgument(1, String.class); + var procedure = baseProcedure(onkostarApi); + procedure.addDiseaseId(diseaseId); + procedure.setFormName(formName); + procedure.setValue( + "LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", procedureId)); + return List.of(procedure); + }) + .when(onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + var followUps = this.service.findReferencedFollowUpsForSubform(1); + + assertThat(followUps) + .hasSize(1) + .allSatisfy(procedure -> assertThat(procedure.getFormName()).isEqualTo("DNPM FollowUp")); + } + + @Test + void shouldFindFollowUpsById() { + var testProcedure = baseProcedure(onkostarApi); + testProcedure.setId(procedureId); + testProcedure.setFormName("DNPM UF Einzelempfehlung"); + testProcedure.addDiseaseId(123); + + doAnswer( + invocationOnMock -> { + var diseaseId = invocationOnMock.getArgument(0, Integer.class); + var formName = invocationOnMock.getArgument(1, String.class); + var procedure = baseProcedure(onkostarApi); + procedure.addDiseaseId(diseaseId); + procedure.setFormName(formName); + procedure.setValue( + "LinkTherapieempfehlung", new Item("LinkTherapieempfehlung", procedureId)); + return List.of(procedure); + }) + .when(onkostarApi) + .getProceduresForDiseaseByForm(anyInt(), anyString()); + + var followUps = this.service.findReferencedFollowUpsForSubform(testProcedure); + + assertThat(followUps) + .hasSize(1) + .allSatisfy(procedure -> assertThat(procedure.getFormName()).isEqualTo("DNPM FollowUp")); + } + + private static final int procedureId = 1234; + private static final Date testDate = Date.from(Instant.parse("2023-03-15T09:43:00Z")); + + private Procedure baseProcedure(final IOnkostarApi onkostarApi) { + var testProcedure = new Procedure(onkostarApi); + testProcedure.setId(1000); + + // Setzen MTB Referenz und Datum MTB + testProcedure.setValue("referstemtb", new Item("ref_tumorkonferenz", procedureId)); + testProcedure.setValue("datum", new Item("datum", testDate)); + + return testProcedure; + } } diff --git a/src/test/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactoryTest.java b/src/test/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactoryTest.java index 7c176bb..c6db22a 100644 --- a/src/test/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactoryTest.java +++ b/src/test/java/dev/dnpm/oshelper/services/therapieplan/TherapieplanServiceFactoryTest.java @@ -19,6 +19,8 @@ package dev.dnpm.oshelper.services.therapieplan; +import static org.assertj.core.api.Assertions.assertThat; + import de.itc.onkostar.api.IOnkostarApi; import dev.dnpm.oshelper.services.FormService; import dev.dnpm.oshelper.services.SettingsService; @@ -28,28 +30,26 @@ 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; - @ExtendWith(MockitoExtension.class) class TherapieplanServiceFactoryTest { - private SettingsService settingsService; - - private TherapieplanServiceFactory therapieplanServiceFactory; - - @BeforeEach - void setup( - @Mock IOnkostarApi onkostarApi, - @Mock SettingsService settingsService, - @Mock FormService formService - ) { - this.settingsService = settingsService; - this.therapieplanServiceFactory = new TherapieplanServiceFactory(onkostarApi, settingsService, formService); - } - - @Test - void testShouldAlwaysReturnDefaultTherapieplanService() { - var actual = this.therapieplanServiceFactory.currentUsableInstance(); - assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); - } + private SettingsService settingsService; + + private TherapieplanServiceFactory therapieplanServiceFactory; + + @BeforeEach + void setup( + @Mock IOnkostarApi onkostarApi, + @Mock SettingsService settingsService, + @Mock FormService formService) { + this.settingsService = settingsService; + this.therapieplanServiceFactory = + new TherapieplanServiceFactory(onkostarApi, settingsService, formService); + } + + @Test + void testShouldAlwaysReturnDefaultTherapieplanService() { + var actual = this.therapieplanServiceFactory.currentUsableInstance(); + assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); + } } |
