diff options
Diffstat (limited to 'src/main/java/dev/dnpm')
68 files changed, 2838 insertions, 2725 deletions
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); + } } |
