From 4ff362ad3002bd624ae2b811cb015b15ad13201e Mon Sep 17 00:00:00 2001 From: "K.Filippopolitis" <56073635+KFilippopolitis@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:08:35 +0300 Subject: [PATCH] Redirect logs outside of console (#79) * Redirect logs outside of console * Log user log in and authorities. * Re-implemented periodically executing a algorithm aggregator that was removed by accident. For the time being we only allow exareme2 algorithms to the portalbackend. * Minor refactoring to conversion of ExperimentExecutionDTO.AlgorithmExecutionDTO to Exareme2AlgorithmRequestDTO. --- .../hbp/mip/algorithm/AlgorithmService.java | 24 ++++++++++++ .../Exareme2AlgorithmRequestDTO.java | 39 ++++++++++++++----- .../Exareme2AlgorithmSpecificationDTO.java | 3 +- .../hbp/mip/experiment/ExperimentService.java | 2 +- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/main/java/hbp/mip/algorithm/AlgorithmService.java b/src/main/java/hbp/mip/algorithm/AlgorithmService.java index 0e5a570b..5aa71362 100644 --- a/src/main/java/hbp/mip/algorithm/AlgorithmService.java +++ b/src/main/java/hbp/mip/algorithm/AlgorithmService.java @@ -7,16 +7,22 @@ import hbp.mip.utils.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import static hbp.mip.utils.InputStreamConverter.convertInputStreamToString; @Service +@EnableScheduling public class AlgorithmService { private static final Gson gson = new Gson(); @@ -76,11 +82,29 @@ private List getExareme2Algorithms(Logger log return Collections.emptyList(); } + // Filter out algorithms with type "flower" + algorithms = algorithms.stream() + .filter(algorithm -> "exareme2".equals(algorithm.type())) + .collect(Collectors.toList()); logger.debug("Fetched " + algorithms.size() + " exareme2 algorithms."); exareme2AlgorithmsSpecs.setAlgorithms(algorithms); return algorithms; } + @EnableAsync + public static class AlgorithmAggregator { + + private final AlgorithmService algorithmService; + + public AlgorithmAggregator(AlgorithmService algorithmService){ + this.algorithmService = algorithmService; + } + @Async + @Scheduled(fixedDelayString = "${services.algorithmsUpdateInterval}000") + public void scheduleFixedRateTaskAsync() { + algorithmService.getExareme2Algorithms(new Logger("AlgorithmAggregator","(GET) /algorithms")); + } + } /** * Fetches the disabled algorithms from a .json file * diff --git a/src/main/java/hbp/mip/algorithm/Exareme2AlgorithmRequestDTO.java b/src/main/java/hbp/mip/algorithm/Exareme2AlgorithmRequestDTO.java index 72d4c537..9da4a1f4 100644 --- a/src/main/java/hbp/mip/algorithm/Exareme2AlgorithmRequestDTO.java +++ b/src/main/java/hbp/mip/algorithm/Exareme2AlgorithmRequestDTO.java @@ -15,15 +15,33 @@ public record Exareme2AlgorithmRequestDTO( String type ) { - public Exareme2AlgorithmRequestDTO( + public static Exareme2AlgorithmRequestDTO create( UUID experimentUUID, List exaremeAlgorithmRequestParamDTOs, List exaremeTransformers, Exareme2AlgorithmSpecificationDTO exareme2AlgorithmSpecificationDTO) { - this( + + // List of inputDataFields + List inputDataFields = Arrays.asList("pathology", "dataset", "x", "y", "filter"); + + // Create lists to hold the separated DTOs + List inputDataDTOs = new ArrayList<>(); + List parametersDTOs = new ArrayList<>(); + + // Split the DTOs into the respective lists + for (ExperimentExecutionDTO.AlgorithmExecutionDTO.AlgorithmParameterExecutionDTO dto : exaremeAlgorithmRequestParamDTOs) { + if (inputDataFields.contains(dto.name())) { + inputDataDTOs.add(dto); + } else { + parametersDTOs.add(dto); + } + } + + // Call the constructor with the separated lists + return new Exareme2AlgorithmRequestDTO( experimentUUID.toString(), - getInputData(exaremeAlgorithmRequestParamDTOs), - getParameters(exaremeAlgorithmRequestParamDTOs, exareme2AlgorithmSpecificationDTO), + getInputData(inputDataDTOs), + getParameters(parametersDTOs, exareme2AlgorithmSpecificationDTO), getPreprocessing(exaremeTransformers, exareme2AlgorithmSpecificationDTO), "exareme2" ); @@ -73,15 +91,13 @@ private static Map getParameters(List inputDataFields = Arrays.asList("pathology", "dataset", "x", "y", "filter"); - HashMap exareme2Parameters = new HashMap<>(); exaremeAlgorithmRequestParamDTOs.forEach(parameter -> { - if (!inputDataFields.contains(parameter.name())){ - Exareme2AlgorithmSpecificationDTO.Exareme2AlgorithmParameterSpecificationDTO paramSpecDto = exareme2AlgorithmSpecificationDTO.parameters().get(parameter.name()); - exareme2Parameters.put(parameter.name(), convertStringToProperExareme2ParameterTypeAccordingToSpecs(parameter.value(), paramSpecDto)); + Exareme2AlgorithmSpecificationDTO.Exareme2AlgorithmParameterSpecificationDTO paramSpecDto = exareme2AlgorithmSpecificationDTO.parameters().get(parameter.name()); + if (paramSpecDto == null){ + throw new InternalServerError("Parameter " + parameter.name() + " not found in algorithm:" + exareme2AlgorithmSpecificationDTO.name()); } + exareme2Parameters.put(parameter.name(), convertStringToProperExareme2ParameterTypeAccordingToSpecs(parameter.value(), paramSpecDto)); }); return exareme2Parameters; } @@ -103,6 +119,9 @@ private static Map getPreprocessing(List parameters, - List preprocessing + List preprocessing, + String type ) { @Override public Map parameters() { diff --git a/src/main/java/hbp/mip/experiment/ExperimentService.java b/src/main/java/hbp/mip/experiment/ExperimentService.java index 17cb7f3b..ee530ad4 100644 --- a/src/main/java/hbp/mip/experiment/ExperimentService.java +++ b/src/main/java/hbp/mip/experiment/ExperimentService.java @@ -341,7 +341,7 @@ private ExperimentAlgorithmResultDTO runExaremeAlgorithm(UUID uuid, ExperimentEx String algorithmName = experimentExecutionDTO.algorithm().name(); String algorithmEndpoint = exareme2AlgorithmsUrl + "/" + algorithmName; Exareme2AlgorithmSpecificationDTO exareme2AlgorithmSpecificationDTO = getAlgorithmSpec(algorithmName); - var exareme2AlgorithmRequestDTO = new Exareme2AlgorithmRequestDTO(uuid, experimentExecutionDTO.algorithm().parameters(), experimentExecutionDTO.algorithm().preprocessing(), exareme2AlgorithmSpecificationDTO); + var exareme2AlgorithmRequestDTO = Exareme2AlgorithmRequestDTO.create(uuid, experimentExecutionDTO.algorithm().parameters(), experimentExecutionDTO.algorithm().preprocessing(), exareme2AlgorithmSpecificationDTO); String algorithmBody = convertObjectToJsonString(exareme2AlgorithmRequestDTO); logger.debug("Exareme2 algorithm request, endpoint: " + algorithmEndpoint); logger.debug("Exareme2 algorithm request, body: " + algorithmBody);