From 30c06d2e0d526257f70ee9e8bcde3c1da2e3db6f Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Fri, 4 Jun 2021 03:28:08 -0700 Subject: [PATCH 01/12] Mip engine integration first touce --- docker/README.md | 2 + docker/config/application.tmpl | 3 + .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 50 ++++++- .../models/DTOs/MIPEngineAlgorithmDTO.java | 119 +++++++++++++++++ .../hbp/mip/services/ExperimentService.java | 123 ++++++++++++------ src/main/resources/application.yml | 2 + 6 files changed, 254 insertions(+), 45 deletions(-) create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java diff --git a/docker/README.md b/docker/README.md index 9636ff324..8693aad09 100644 --- a/docker/README.md +++ b/docker/README.md @@ -24,6 +24,8 @@ To use this image, you need a running instance of PostgreSQL and to configure th ### EXTERNAL SERVICES ### +* MIPENGINE_URL: URL to MIPENGINE server. Default is "http://localhost:5000" . + * EXAREME_URL: URL to Exareme server. Default is "http://localhost:9090" . * GALAXY_URL: URL to Workflow server. Default is "http://localhost:8090/" . diff --git a/docker/config/application.tmpl b/docker/config/application.tmpl index ae10744aa..0913c99e7 100644 --- a/docker/config/application.tmpl +++ b/docker/config/application.tmpl @@ -34,6 +34,9 @@ spring: ### EXTERNAL SERVICES ### services: + mipengine: + algorithmsUrl: {{ default .Env.MIPENGINE_URL "http://localhost:5000" }}/algorithms + exareme: queryExaremeUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/query algorithmsUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/algorithms.json diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 48500bb10..1ca68f13b 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -9,6 +9,7 @@ import com.google.gson.reflect.TypeToken; import eu.hbp.mip.controllers.galaxy.retrofit.RetroFitGalaxyClients; import eu.hbp.mip.controllers.galaxy.retrofit.RetrofitClientInstance; import eu.hbp.mip.models.DTOs.AlgorithmDTO; +import eu.hbp.mip.models.DTOs.MIPEngineAlgorithmDTO; import eu.hbp.mip.models.galaxy.WorkflowDTO; import eu.hbp.mip.services.ActiveUserService; import eu.hbp.mip.utils.CustomResourceLoader; @@ -42,6 +43,9 @@ public class AlgorithmsAPI { private final ActiveUserService activeUserService; + @Value("#{'${services.mipengine.algorithmsUrl}'}") + private String mipengineAlgorithmsUrl; + @Value("#{'${services.exareme.algorithmsUrl}'}") private String exaremeAlgorithmsUrl; @@ -64,8 +68,9 @@ public class AlgorithmsAPI { public ResponseEntity<List<AlgorithmDTO>> getAlgorithms() { Logger logger = new Logger(activeUserService.getActiveUser().getUsername(), "(GET) /algorithms"); - logger.LogUserAction("Executing..."); - +// logger.LogUserAction("Executing..."); + LinkedList<AlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); + logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); LinkedList<AlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); logger.LogUserAction("Loaded " + exaremeAlgorithms.size() + " exareme algorithms"); LinkedList<AlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); @@ -73,12 +78,17 @@ public class AlgorithmsAPI { LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); if (exaremeAlgorithms != null) { - algorithms.addAll(exaremeAlgorithms); +// algorithms.addAll(exaremeAlgorithms); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } + if (mipengineAlgorithms != null) { + algorithms.addAll(mipengineAlgorithms); + } else { + logger.LogUserAction("Getting mipengine algorithms failed and returned null"); + } if (galaxyAlgorithms != null) { - algorithms.addAll(galaxyAlgorithms); +// algorithms.addAll(galaxyAlgorithms); } else { logger.LogUserAction("Getting galaxy workflows failed and returned null"); } @@ -112,7 +122,6 @@ public class AlgorithmsAPI { try { StringBuilder response = new StringBuilder(); HTTPUtil.sendGet(exaremeAlgorithmsUrl, response); - algorithms = gson.fromJson( response.toString(), new TypeToken<LinkedList<AlgorithmDTO>>() { @@ -127,6 +136,37 @@ public class AlgorithmsAPI { return algorithms; } + /** + * This method gets all the available mipengine algorithms and + * + * @return a list of AlgorithmDTOs or null if something fails + */ + public LinkedList<AlgorithmDTO> getMIPEngineAlgorithms(Logger logger) { + LinkedList<MIPEngineAlgorithmDTO> mipEngineAlgorithms; + // Get MIPEngine algorithms + try { + StringBuilder response = new StringBuilder(); + HTTPUtil.sendGet(mipengineAlgorithmsUrl, response); + logger.LogUserAction(response.toString()); + + mipEngineAlgorithms = gson.fromJson( + response.toString(), + new TypeToken<LinkedList<MIPEngineAlgorithmDTO>>() { + }.getType() + ); + } catch (IOException e) { + logger.LogUserAction("An exception occurred: " + e.getMessage()); + return null; + } + + + LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); + mipEngineAlgorithms.forEach(mipEngineAlgorithm -> algorithms.add(mipEngineAlgorithm.convertToAlgorithmDTO())); + + logger.LogUserAction("Completed, returned " + algorithms.size() + " algorithms."); + return algorithms; + } + /** * This method gets all the available galaxy workflows, converts them into algorithms and * diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java new file mode 100644 index 000000000..a250e4249 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -0,0 +1,119 @@ +package eu.hbp.mip.models.DTOs; + +import com.google.gson.annotations.SerializedName; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; + +@Getter +@Setter +public class MIPEngineAlgorithmDTO { + + @SerializedName("name") + private String name; + + @SerializedName("desc") + private String desc; + + @SerializedName("label") + private String label; + + @SerializedName("type") + private String type; + + @SerializedName("parameters") + private Object parameters; + + @SerializedName("crossvalidation") + private String crossvalidation; + + @SerializedName("inputdata") + private Hashtable<String, InputDataParamDTO> inputdata; + + @Getter + @Setter + public static class InputDataParamDTO { + + @SerializedName("stattypes") + private List<String> stattypes; + + @SerializedName("label") + private String label; + + @SerializedName("notblank") + private String notblank; + + @SerializedName("enumslen") + private Integer enumslen; + + @SerializedName("multiple") + private String multiple; + + @SerializedName("types") + private List<String> types; + + @SerializedName("desc") + private String desc; + public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { + AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); + algorithmParamDTO.setName(name); + algorithmParamDTO.setDesc(this.desc); + algorithmParamDTO.setLabel(this.label); + if(name.equals("datasets") || name.equals("filter") || name.equals("pathology")){ + algorithmParamDTO.setType(name.equals("datasets")? "dataset":name); + algorithmParamDTO.setValueType(this.types.get(0)); + } + else{ + if(stattypes == null){ + System.out.println("Dsafasfads------------------------->>>>>>>>>>>>>>>"); + System.out.println(name); + } + algorithmParamDTO.setType("column"); + algorithmParamDTO.setColumnValuesSQLType(String.join(", ", this.types)); + algorithmParamDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); + } + algorithmParamDTO.setValue(""); + algorithmParamDTO.setValueNotBlank(this.notblank); + algorithmParamDTO.setValueMultiple(this.multiple); + return algorithmParamDTO; + } + private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { + + if (stattypes.contains("nominal") && stattypes.contains("numerical")){ + return ""; + } + else if (stattypes.contains("nominal")){ + return "true"; + } + else if (stattypes.contains("numerical")){ + return "false"; + } + else{ + throw new Exception("Invalid stattypes"); + } + } + } + + public AlgorithmDTO convertToAlgorithmDTO() + { + AlgorithmDTO algorithmDTO = new AlgorithmDTO(); + algorithmDTO.setName(this.name); + algorithmDTO.setLabel(this.label); + algorithmDTO.setDesc(this.desc); + algorithmDTO.setType("mipengine"); + List<AlgorithmDTO.AlgorithmParamDTO> parameters = new ArrayList<>(); + this.inputdata.forEach((name, inputDataParamDTO) -> { + try { + AlgorithmDTO.AlgorithmParamDTO parameter = inputDataParamDTO.convertToAlgorithmParamDTO(name); + parameters.add(parameter); + } catch (Exception e) { + e.printStackTrace(); + } + }); + algorithmDTO.setParameters(parameters); + return algorithmDTO; + } +} diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index 45345c8a5..a8b176d76 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -50,6 +50,9 @@ public class ExperimentService { @Value("#{'${services.exareme.queryExaremeUrl}'}") private String queryExaremeUrl; + @Value("#{'${services.mipengine.algorithmsUrl}'}") + private String mipengineAlgorithmsUrl; + @Value("#{'${services.galaxy.galaxyUrl}'}") private String galaxyUrl; @@ -194,7 +197,7 @@ public class ExperimentService { return runGalaxyWorkflow(experimentDTO, logger); } else { logger.LogUserAction("Algorithm runs on Exareme."); - return createExaremeExperiment(experimentDTO, logger); + return createExperiment(experimentDTO, logger); } } @@ -219,13 +222,6 @@ public class ExperimentService { throw new BadRequestException("You can not run workflow algorithms transiently."); } - // Get the parameters - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters - = experimentDTO.getAlgorithm().getParameters(); - - // Get the type and name of algorithm - String algorithmName = experimentDTO.getAlgorithm().getName(); - algorithmParametersLogging(experimentDTO, logger); if (authenticationIsEnabled) { @@ -233,19 +229,15 @@ public class ExperimentService { ClaimUtils.validateAccessRightsOnDatasets(authentication, experimentDatasets, logger); } - String body = gson.toJson(algorithmParameters); - String url = queryExaremeUrl + "/" + algorithmName; - logger.LogUserAction("url: " + url + ", body: " + body); - - logger.LogUserAction("Completed, returning: " + experimentDTO.toString()); + logger.LogUserAction("Completed, returning: " + experimentDTO); // Results are stored in the experiment object - ExaremeResult exaremeResult = runExaremeExperiment(url, body, experimentDTO); + ExperimentResult experimentResult = runExperiment(experimentDTO, logger); - logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + exaremeResult.getCode() + " and result: " + exaremeResult.getResults()); + logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + experimentResult.getCode() + " and result: " + experimentResult.getResults()); - experimentDTO.setResult((exaremeResult.getCode() >= 400) ? null : exaremeResult.getResults()); - experimentDTO.setStatus((exaremeResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); + experimentDTO.setResult((experimentResult.getCode() >= 400) ? null : experimentResult.getResults()); + experimentDTO.setStatus((experimentResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); return experimentDTO; } @@ -514,15 +506,52 @@ public class ExperimentService { return JsonConverters.convertObjectToJsonString(finalJsonObject); } + /** + * The runExperiment will run the experiment to exareme or MIPEngine. + * + * @param experimentDTO is the request with the experiment information + * @return the result of experiment as well as the http status that was retrieved + */ + public ExperimentResult runExperiment(ExperimentDTO experimentDTO, Logger logger) { + + // Algorithm type + String algorithmType = experimentDTO.getAlgorithm().getType(); + + // Run the 1st algorithm from the list + String algorithmName = experimentDTO.getAlgorithm().getName(); + + // Get the parameters + List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters + = experimentDTO.getAlgorithm().getParameters(); + + String body = gson.toJson(algorithmParameters); + + logger.LogUserAction("Completed, returning: " + experimentDTO); + + + // Run with the appropriate engine + if (algorithmType.equals("mipengine")) { + String url = mipengineAlgorithmsUrl + "/" + algorithmName; + logger.LogUserAction("url: " + url + ", body: " + body); + logger.LogUserAction("Algorithm runs on MIPEngine."); + return runMIPEngineExperiment(url, body); + } else { + String url = queryExaremeUrl + "/" + algorithmName; + logger.LogUserAction("url: " + url + ", body: " + body); + logger.LogUserAction("Algorithm runs on Exareme."); + return runExaremeExperiment(url, body); + } + } + + /** * The runExaremeExperiment will run to exareme the experiment * * @param url is the url that contain the results of the experiment * @param body is the parameters of the algorithm - * @param experimentDTO is the experiment information to be executed in the exareme * @return the result of exareme as well as the http status that was retrieved */ - public ExaremeResult runExaremeExperiment(String url, String body, ExperimentDTO experimentDTO) { + public ExperimentResult runExaremeExperiment(String url, String body) { StringBuilder results = new StringBuilder(); int code; @@ -536,7 +565,32 @@ public class ExperimentService { ExperimentDTO experimentDTOWithOnlyResult = JsonConverters.convertJsonStringToObject(String.valueOf(results), ExperimentDTO.class); List<Object> resultDTOS = experimentDTOWithOnlyResult.getResult(); - return new ExaremeResult(code, resultDTOS); + return new ExperimentResult(code, resultDTOS); + } + + /** + * The runExaremeExperiment will run to exareme the experiment + * + * @param url is the url that contain the results of the experiment + * @param body is the parameters of the algorithm + * @return the result of exareme as well as the http status that was retrieved + */ + public ExperimentResult runMIPEngineExperiment(String url, String body) { + + StringBuilder results = new StringBuilder(); + int code; + try { + code = HTTPUtil.sendPost(url, body, results); + } catch (Exception e) { + throw new InternalServerError("Error occurred : " + e.getMessage()); + } + System.out.println("----------------------------------->>>>>>>>>>>>>>>>>>>>>>"); + System.out.println(results); + // Results are stored in the experiment object + ExperimentDTO experimentDTOWithOnlyResult = JsonConverters.convertJsonStringToObject(String.valueOf(results), ExperimentDTO.class); + List<Object> resultDTOS = experimentDTOWithOnlyResult.getResult(); + + return new ExperimentResult(code, resultDTOS); } /* -------------------------------------- EXAREME CALLS ---------------------------------------------------------*/ @@ -548,27 +602,15 @@ public class ExperimentService { * @param logger contains username and the endpoint. * @return the experiment information that was retrieved from exareme */ - public ExperimentDTO createExaremeExperiment(ExperimentDTO experimentDTO, Logger logger) { + public ExperimentDTO createExperiment(ExperimentDTO experimentDTO, Logger logger) { logger.LogUserAction("Running the algorithm..."); ExperimentDAO experimentDAO = createExperimentInTheDatabase(experimentDTO, logger); logger.LogUserAction("Created experiment with uuid :" + experimentDAO.getUuid()); - // Run the 1st algorithm from the list - String algorithmName = experimentDTO.getAlgorithm().getName(); - - // Get the parameters - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters - = experimentDTO.getAlgorithm().getParameters(); - - String body = gson.toJson(algorithmParameters); - String url = queryExaremeUrl + "/" + algorithmName; - logger.LogUserAction("url: " + url + ", body: " + body); - - logger.LogUserAction("Completed, returning: " + experimentDTO.toString()); - logger.LogUserAction("Starting exareme execution thread"); + logger.LogUserAction("Starting execution in thread"); ExperimentDTO finalExperimentDTO = experimentDTO; new Thread(() -> { @@ -576,13 +618,14 @@ public class ExperimentService { Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Thread named :" + Thread.currentThread().getName() + " with id :" + Thread.currentThread().getId() + " started!"); try { + // Results are stored in the experiment object - ExaremeResult exaremeResult = runExaremeExperiment(url, body, finalExperimentDTO); + ExperimentResult experimentResult = runExperiment(finalExperimentDTO, logger); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + exaremeResult.getCode() + " and result: " + exaremeResult.getResults()); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + experimentResult.getCode() + " and result: " + experimentResult.getResults()); - experimentDAO.setResult((exaremeResult.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(exaremeResult.getResults())); - experimentDAO.setStatus((exaremeResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); + experimentDAO.setResult((experimentResult.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(experimentResult.getResults())); + experimentDAO.setStatus((experimentResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); } catch (Exception e) { Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "There was an exception: " + e.getMessage()); @@ -988,11 +1031,11 @@ public class ExperimentService { return returnError; } - static class ExaremeResult { + static class ExperimentResult { private final int code; private final List<Object> results; - public ExaremeResult(int code, List<Object> results) { + public ExperimentResult(int code, List<Object> results) { this.code = code; this.results = results; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 345fc4bfa..d8d542b6b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -34,6 +34,8 @@ spring: ### EXTERNAL SERVICES ### services: + mipengine: + algorithmsUrl: "http://127.0.0.1:5000/algorithms" exareme: queryExaremeUrl: "http://127.0.0.1:9090/mining/query" algorithmsUrl: "http://127.0.0.1:9090/mining/algorithms.json" -- GitLab From af5828b2e6fd108996c4c966aef9d0a25a2990f8 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Wed, 16 Jun 2021 03:25:12 -0700 Subject: [PATCH 02/12] Implemented adaptor for get /algorithms from MIPEngine and post /algorithms/{alogrithm_name} --- .../eu/hbp/mip/models/DTOs/AlgorithmDTO.java | 24 ++++++++++++++ .../models/DTOs/MIPEngineAlgorithmDTO.java | 7 ++--- .../eu/hbp/mip/models/DTOs/MIPEngineBody.java | 31 +++++++++++++++++++ .../hbp/mip/services/ExperimentService.java | 31 +++++++++++-------- 4 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java index 52db979d5..47e6f3ddf 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java @@ -1,9 +1,12 @@ package eu.hbp.mip.models.DTOs; +import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; +import java.util.Arrays; +import java.util.Hashtable; import java.util.List; @Getter @@ -70,4 +73,25 @@ public class AlgorithmDTO { @SerializedName("valueEnumerations") private List<String> valueEnumerations; } + + public MIPEngineBody convertToMIPEngineBody() + { + MIPEngineBody mipEngineBody = new MIPEngineBody(); + MIPEngineBody.InputData inputData = new MIPEngineBody.InputData(); + + this.parameters.forEach(parameter -> { + if(parameter.getName().equals("x")) + inputData.setX(Arrays.asList(parameter.getValue().split(","))); + if(parameter.getName().equals("y")) + inputData.setY(Arrays.asList(parameter.getValue().split(","))); + if(parameter.getName().equals("dataset")) + inputData.setDatasets(Arrays.asList(parameter.getValue().split(","))); + if(parameter.getName().equals("pathology")) + inputData.setPathology(parameter.getValue()); + if(parameter.getName().equals("filter")) + inputData.setFilters(null); + }); + mipEngineBody.setInputdata(inputData); + return mipEngineBody; + } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index a250e4249..386195dab 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -25,7 +25,7 @@ public class MIPEngineAlgorithmDTO { private String type; @SerializedName("parameters") - private Object parameters; + private InputDataParamDTO parameters; @SerializedName("crossvalidation") private String crossvalidation; @@ -57,6 +57,7 @@ public class MIPEngineAlgorithmDTO { @SerializedName("desc") private String desc; + public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); algorithmParamDTO.setName(name); @@ -67,10 +68,6 @@ public class MIPEngineAlgorithmDTO { algorithmParamDTO.setValueType(this.types.get(0)); } else{ - if(stattypes == null){ - System.out.println("Dsafasfads------------------------->>>>>>>>>>>>>>>"); - System.out.println(name); - } algorithmParamDTO.setType("column"); algorithmParamDTO.setColumnValuesSQLType(String.join(", ", this.types)); algorithmParamDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java new file mode 100644 index 000000000..bbae5f4a0 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java @@ -0,0 +1,31 @@ +package eu.hbp.mip.models.DTOs; + +import com.google.gson.annotations.SerializedName; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class MIPEngineBody { + @SerializedName("inputdata") + private InputData inputdata; + @SerializedName("parameters") + private Object parameters; + + @Getter + @Setter + public static class InputData { + @SerializedName("pathology") + private String pathology; + @SerializedName("datasets") + private List<String> datasets; + @SerializedName("filters") + private String filters; + @SerializedName("x") + private List<String> x; + @SerializedName("y") + private List<String> y; + } +} diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index a8b176d76..0179d824e 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -17,6 +17,7 @@ import eu.hbp.mip.models.DAOs.ExperimentDAO; import eu.hbp.mip.models.DAOs.UserDAO; import eu.hbp.mip.models.DTOs.AlgorithmDTO; import eu.hbp.mip.models.DTOs.ExperimentDTO; +import eu.hbp.mip.models.DTOs.MIPEngineBody; import eu.hbp.mip.models.galaxy.GalaxyWorkflowResult; import eu.hbp.mip.models.galaxy.PostWorkflowToGalaxyDtoResponse; import eu.hbp.mip.repositories.ExperimentRepository; @@ -506,6 +507,17 @@ public class ExperimentService { return JsonConverters.convertObjectToJsonString(finalJsonObject); } + private List<Object> formattingMIPEngienResult(String result) { + List<List<String>> resultJson = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<String>>().getClass()); + List<Object> finalObject = new ArrayList<>(); + LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); + data.put("data", resultJson); + data.put("type", "application/json"); + finalObject.add(data); + List<Object> result_kappa = finalObject; + return result_kappa; + } + /** * The runExperiment will run the experiment to exareme or MIPEngine. * @@ -520,22 +532,18 @@ public class ExperimentService { // Run the 1st algorithm from the list String algorithmName = experimentDTO.getAlgorithm().getName(); - // Get the parameters - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters - = experimentDTO.getAlgorithm().getParameters(); - - String body = gson.toJson(algorithmParameters); - - logger.LogUserAction("Completed, returning: " + experimentDTO); - - // Run with the appropriate engine if (algorithmType.equals("mipengine")) { + MIPEngineBody mipEngineBody = experimentDTO.getAlgorithm().convertToMIPEngineBody(); + String body = gson.toJson(mipEngineBody); String url = mipengineAlgorithmsUrl + "/" + algorithmName; logger.LogUserAction("url: " + url + ", body: " + body); logger.LogUserAction("Algorithm runs on MIPEngine."); return runMIPEngineExperiment(url, body); } else { + List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters + = experimentDTO.getAlgorithm().getParameters(); + String body = gson.toJson(algorithmParameters); String url = queryExaremeUrl + "/" + algorithmName; logger.LogUserAction("url: " + url + ", body: " + body); logger.LogUserAction("Algorithm runs on Exareme."); @@ -584,11 +592,8 @@ public class ExperimentService { } catch (Exception e) { throw new InternalServerError("Error occurred : " + e.getMessage()); } - System.out.println("----------------------------------->>>>>>>>>>>>>>>>>>>>>>"); - System.out.println(results); // Results are stored in the experiment object - ExperimentDTO experimentDTOWithOnlyResult = JsonConverters.convertJsonStringToObject(String.valueOf(results), ExperimentDTO.class); - List<Object> resultDTOS = experimentDTOWithOnlyResult.getResult(); + List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); return new ExperimentResult(code, resultDTOS); } -- GitLab From 89c85f06535616f9582b487ced1dcea129827865 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Wed, 16 Jun 2021 11:38:48 -0700 Subject: [PATCH 03/12] Added visualzation --- .../eu/hbp/mip/models/DTOs/AlgorithmDTO.java | 4 +--- .../hbp/mip/services/ExperimentService.java | 20 ++++++++++++++----- src/main/resources/application.yml | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java index 47e6f3ddf..2297ae9be 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java @@ -84,12 +84,10 @@ public class AlgorithmDTO { inputData.setX(Arrays.asList(parameter.getValue().split(","))); if(parameter.getName().equals("y")) inputData.setY(Arrays.asList(parameter.getValue().split(","))); - if(parameter.getName().equals("dataset")) + if(parameter.getName().equals("datasets")) inputData.setDatasets(Arrays.asList(parameter.getValue().split(","))); if(parameter.getName().equals("pathology")) inputData.setPathology(parameter.getValue()); - if(parameter.getName().equals("filter")) - inputData.setFilters(null); }); mipEngineBody.setInputdata(inputData); return mipEngineBody; diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index 0179d824e..bafa71d01 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -509,13 +509,22 @@ public class ExperimentService { private List<Object> formattingMIPEngienResult(String result) { List<List<String>> resultJson = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<String>>().getClass()); - List<Object> finalObject = new ArrayList<>(); + String schema_json = "{\"fields\":[{\"type\":\"string\",\"name\":\"node\"},{\"type\":\"number\",\"name\":\"row-id\"},{\"type\":\"number\",\"name\":\"alzheimerbroadcategory_bin\"}]}"; + LinkedTreeMap<String,List<Object>> schema = JsonConverters.convertJsonStringToObject(schema_json, new LinkedTreeMap<String,ArrayList<Object>>().getClass()); + + + LinkedTreeMap<String,Object> data_data = new LinkedTreeMap<>(); + data_data.put("data", resultJson); + data_data.put("profile", "tabular-data-resource"); + data_data.put("schema", schema); + data_data.put("name","Logistic Regression Stuff"); + LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); - data.put("data", resultJson); - data.put("type", "application/json"); + data.put("data", data_data); + data.put("type", "application/vnd.dataresource+json"); + List<Object> finalObject = new ArrayList<>(); finalObject.add(data); - List<Object> result_kappa = finalObject; - return result_kappa; + return finalObject; } /** @@ -592,6 +601,7 @@ public class ExperimentService { } catch (Exception e) { throw new InternalServerError("Error occurred : " + e.getMessage()); } + System.out.println(results); // Results are stored in the experiment object List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d8d542b6b..660671108 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ logging: ### AUTHENTICATION ### authentication: - enabled: false + enabled: true ### DATABASE CONFIGURATION ### -- GitLab From e4ee5adea5b51c7d9ad54198f55d85df592cddf8 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Tue, 29 Jun 2021 03:41:24 -0700 Subject: [PATCH 04/12] Added the filtering on rows which have null values --- .../eu/hbp/mip/models/DTOs/AlgorithmDTO.java | 81 ++++++++++++++++--- .../models/DTOs/MIPEngineAlgorithmDTO.java | 2 +- .../eu/hbp/mip/models/DTOs/MIPEngineBody.java | 2 +- .../hbp/mip/services/ExperimentService.java | 5 +- 4 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java index 2297ae9be..216140ba2 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java @@ -1,13 +1,11 @@ package eu.hbp.mip.models.DTOs; -import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; +import eu.hbp.mip.utils.JsonConverters; import lombok.Getter; import lombok.Setter; -import java.util.Arrays; -import java.util.Hashtable; -import java.util.List; +import java.util.*; @Getter @Setter @@ -74,21 +72,84 @@ public class AlgorithmDTO { private List<String> valueEnumerations; } + @Getter + @Setter + public static class Rule + { + @SerializedName("id") + private String id; + + @SerializedName("type") + private String type; + + @SerializedName("operator") + private String operator; + + @SerializedName("value") + private Object value; + + public Rule(String id, String type, String operator, Object value) { + this.id = id; + this.type = type; + this.operator = operator; + this.value = value; + } + } + + @Getter + @Setter + public static class Filters + { + @SerializedName("condition") + private String condition; + + @SerializedName("rules") + private List<Object> rules; + + @SerializedName("valid") + private boolean valid; + + public Filters(String condition, List<Object> rules, boolean valid) { + this.condition = condition; + this.rules = rules; + this.valid = valid; + } + } + + public MIPEngineBody convertToMIPEngineBody() { MIPEngineBody mipEngineBody = new MIPEngineBody(); MIPEngineBody.InputData inputData = new MIPEngineBody.InputData(); + List<Object> rules = new ArrayList<>(); this.parameters.forEach(parameter -> { - if(parameter.getName().equals("x")) - inputData.setX(Arrays.asList(parameter.getValue().split(","))); - if(parameter.getName().equals("y")) - inputData.setY(Arrays.asList(parameter.getValue().split(","))); - if(parameter.getName().equals("datasets")) - inputData.setDatasets(Arrays.asList(parameter.getValue().split(","))); + if(parameter.getName().equals("x")) { + List<String> x = Arrays.asList(parameter.getValue().split(",")); + x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setX(x); + } + if(parameter.getName().equals("y")) { + List<String> y = Arrays.asList(parameter.getValue().split(",")); + y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setY(y); + } + if(parameter.getName().equals("dataset")){ + List<String> datasets = Arrays.asList(parameter.getValue().split(",")); + rules.add(new Rule("dataset","string", "in", datasets)); + inputData.setDatasets(datasets); + } + String pathology; if(parameter.getName().equals("pathology")) inputData.setPathology(parameter.getValue()); + + if(parameter.getName().equals("filter")){ + if (parameter.getValue() != "") + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filters.class)); + } }); + Filters filters = new Filters("AND", rules, true); + inputData.setFilters(filters); mipEngineBody.setInputdata(inputData); return mipEngineBody; } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index 386195dab..4400ff9e7 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -97,7 +97,7 @@ public class MIPEngineAlgorithmDTO { public AlgorithmDTO convertToAlgorithmDTO() { AlgorithmDTO algorithmDTO = new AlgorithmDTO(); - algorithmDTO.setName(this.name); + algorithmDTO.setName(this.name.toUpperCase()); algorithmDTO.setLabel(this.label); algorithmDTO.setDesc(this.desc); algorithmDTO.setType("mipengine"); diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java index bbae5f4a0..b8b2f957a 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java @@ -22,7 +22,7 @@ public class MIPEngineBody { @SerializedName("datasets") private List<String> datasets; @SerializedName("filters") - private String filters; + private AlgorithmDTO.Filters filters; @SerializedName("x") private List<String> x; @SerializedName("y") diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index bafa71d01..bc7f4dd11 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -544,8 +544,8 @@ public class ExperimentService { // Run with the appropriate engine if (algorithmType.equals("mipengine")) { MIPEngineBody mipEngineBody = experimentDTO.getAlgorithm().convertToMIPEngineBody(); - String body = gson.toJson(mipEngineBody); - String url = mipengineAlgorithmsUrl + "/" + algorithmName; + String body = JsonConverters.convertObjectToJsonString(mipEngineBody); + String url = mipengineAlgorithmsUrl + "/" + algorithmName.toLowerCase(); logger.LogUserAction("url: " + url + ", body: " + body); logger.LogUserAction("Algorithm runs on MIPEngine."); return runMIPEngineExperiment(url, body); @@ -601,7 +601,6 @@ public class ExperimentService { } catch (Exception e) { throw new InternalServerError("Error occurred : " + e.getMessage()); } - System.out.println(results); // Results are stored in the experiment object List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); -- GitLab From 9606ee4d91404b5cfa33b9e15bf11737ebcdcbd9 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Thu, 1 Jul 2021 04:00:05 -0700 Subject: [PATCH 05/12] Proper url for mip engine --- docker/README.md | 2 +- docker/config/application.tmpl | 2 +- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 6 +++--- .../mip/models/DTOs/MIPEngineAlgorithmDTO.java | 16 +++++++++++++--- src/main/resources/application.yml | 4 ++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docker/README.md b/docker/README.md index 8693aad09..36a3e1245 100644 --- a/docker/README.md +++ b/docker/README.md @@ -24,7 +24,7 @@ To use this image, you need a running instance of PostgreSQL and to configure th ### EXTERNAL SERVICES ### -* MIPENGINE_URL: URL to MIPENGINE server. Default is "http://localhost:5000" . +* MIPENGINE_URL: URL to MIPENGINE server. Default is "http://192.168.124.129:5000" . * EXAREME_URL: URL to Exareme server. Default is "http://localhost:9090" . diff --git a/docker/config/application.tmpl b/docker/config/application.tmpl index 0913c99e7..6059a902b 100644 --- a/docker/config/application.tmpl +++ b/docker/config/application.tmpl @@ -35,7 +35,7 @@ spring: ### EXTERNAL SERVICES ### services: mipengine: - algorithmsUrl: {{ default .Env.MIPENGINE_URL "http://localhost:5000" }}/algorithms + algorithmsUrl: {{ default .Env.MIPENGINE_URL "http://192.168.124.129:5000" }}/algorithms exareme: queryExaremeUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/query diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 1ca68f13b..68eb31340 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -68,7 +68,7 @@ public class AlgorithmsAPI { public ResponseEntity<List<AlgorithmDTO>> getAlgorithms() { Logger logger = new Logger(activeUserService.getActiveUser().getUsername(), "(GET) /algorithms"); -// logger.LogUserAction("Executing..."); + logger.LogUserAction("Executing..."); LinkedList<AlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); LinkedList<AlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); @@ -78,7 +78,7 @@ public class AlgorithmsAPI { LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); if (exaremeAlgorithms != null) { -// algorithms.addAll(exaremeAlgorithms); + algorithms.addAll(exaremeAlgorithms); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } @@ -242,4 +242,4 @@ public class AlgorithmsAPI { }.getType() ); } -} +} \ No newline at end of file diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index 4400ff9e7..f253bab6d 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.Setter; import java.util.ArrayList; +import java.util.Arrays; import java.util.Hashtable; import java.util.List; @@ -62,10 +63,16 @@ public class MIPEngineAlgorithmDTO { AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); algorithmParamDTO.setName(name); algorithmParamDTO.setDesc(this.desc); - algorithmParamDTO.setLabel(this.label); - if(name.equals("datasets") || name.equals("filter") || name.equals("pathology")){ - algorithmParamDTO.setType(name.equals("datasets")? "dataset":name); + if(name.equals("datasets") || name.equals("filters") || name.equals("pathology")){ algorithmParamDTO.setValueType(this.types.get(0)); + if(name.equals("filters")){ + algorithmParamDTO.setName("filter"); + algorithmParamDTO.setType("filter"); + } + if(name.equals("datasets")){ + algorithmParamDTO.setName("dataset"); + algorithmParamDTO.setType("dataset"); + } } else{ algorithmParamDTO.setType("column"); @@ -75,6 +82,9 @@ public class MIPEngineAlgorithmDTO { algorithmParamDTO.setValue(""); algorithmParamDTO.setValueNotBlank(this.notblank); algorithmParamDTO.setValueMultiple(this.multiple); + String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; + algorithmParamDTO.setLabel(Arrays.asList(hidden).contains(algorithmParamDTO.getName()) ? algorithmParamDTO.getName():this.label); + return algorithmParamDTO; } private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 660671108..8aadac388 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ logging: ### AUTHENTICATION ### authentication: - enabled: true + enabled: false ### DATABASE CONFIGURATION ### @@ -35,7 +35,7 @@ spring: ### EXTERNAL SERVICES ### services: mipengine: - algorithmsUrl: "http://127.0.0.1:5000/algorithms" + algorithmsUrl: "http://192.168.124.129:5000/algorithms" exareme: queryExaremeUrl: "http://127.0.0.1:9090/mining/query" algorithmsUrl: "http://127.0.0.1:9090/mining/algorithms.json" -- GitLab From 1e1b70d32546e46c58485fb2d66028b8ee9e9c01 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Mon, 5 Jul 2021 02:12:41 -0700 Subject: [PATCH 06/12] Visualization is no longer hardcoded --- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 6 +- .../eu/hbp/mip/models/DTOs/AlgorithmDTO.java | 26 ++++--- .../models/DTOs/MIPEngineAlgorithmDTO.java | 73 ++++++++++++++++--- .../eu/hbp/mip/models/DTOs/MIPEngineBody.java | 5 +- .../hbp/mip/services/ExperimentService.java | 60 ++++++++++----- 5 files changed, 131 insertions(+), 39 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 68eb31340..6385d89d5 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -78,7 +78,11 @@ public class AlgorithmsAPI { LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); if (exaremeAlgorithms != null) { - algorithms.addAll(exaremeAlgorithms); + //algorithms.addAll(exaremeAlgorithms); + exaremeAlgorithms.forEach(algorithmDTO -> { + if(algorithmDTO.getName().equals("LOGISTIC_REGRESSION")) + algorithms.add(algorithmDTO); + }); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java index 216140ba2..6d70c0215 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java @@ -98,7 +98,7 @@ public class AlgorithmDTO { @Getter @Setter - public static class Filters + public static class Filter { @SerializedName("condition") private String condition; @@ -109,7 +109,7 @@ public class AlgorithmDTO { @SerializedName("valid") private boolean valid; - public Filters(String condition, List<Object> rules, boolean valid) { + public Filter(String condition, List<Object> rules, boolean valid) { this.condition = condition; this.rules = rules; this.valid = valid; @@ -121,36 +121,42 @@ public class AlgorithmDTO { { MIPEngineBody mipEngineBody = new MIPEngineBody(); MIPEngineBody.InputData inputData = new MIPEngineBody.InputData(); + Hashtable<String, Object> mipEngineParameters = new Hashtable<>(); List<Object> rules = new ArrayList<>(); this.parameters.forEach(parameter -> { + if(parameter.getName().equals("x")) { + System.out.println("x"); List<String> x = Arrays.asList(parameter.getValue().split(",")); x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); inputData.setX(x); } - if(parameter.getName().equals("y")) { + else if(parameter.getName().equals("y")) { List<String> y = Arrays.asList(parameter.getValue().split(",")); y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); inputData.setY(y); } - if(parameter.getName().equals("dataset")){ + else if(parameter.getName().equals("dataset")){ List<String> datasets = Arrays.asList(parameter.getValue().split(",")); rules.add(new Rule("dataset","string", "in", datasets)); inputData.setDatasets(datasets); } - String pathology; - if(parameter.getName().equals("pathology")) + else if(parameter.getName().equals("pathology")) inputData.setPathology(parameter.getValue()); - if(parameter.getName().equals("filter")){ + else if(parameter.getName().equals("filter")){ if (parameter.getValue() != "") - rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filters.class)); + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filter.class)); + } + else{ + mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); } }); - Filters filters = new Filters("AND", rules, true); - inputData.setFilters(filters); + Filter filter = new Filter("AND", rules, true); + inputData.setFilters(filter); mipEngineBody.setInputdata(inputData); + mipEngineBody.setParameters(mipEngineParameters); return mipEngineBody; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index f253bab6d..d391492d7 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -1,6 +1,7 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; +import eu.hbp.mip.utils.JsonConverters; import lombok.Getter; import lombok.Setter; @@ -26,7 +27,7 @@ public class MIPEngineAlgorithmDTO { private String type; @SerializedName("parameters") - private InputDataParamDTO parameters; + private Hashtable<String, ParameterDTO> parameters; @SerializedName("crossvalidation") private String crossvalidation; @@ -34,6 +35,54 @@ public class MIPEngineAlgorithmDTO { @SerializedName("inputdata") private Hashtable<String, InputDataParamDTO> inputdata; + @Getter + @Setter + public static class ParameterDTO { + + @SerializedName("label") + private String label; + + @SerializedName("notblank") + private String notblank; + + @SerializedName("multiple") + private String multiple; + + @SerializedName("types") + private String type; + + @SerializedName("desc") + private String desc; + + @SerializedName("min") + private String min; + + @SerializedName("max") + private String max; + + @SerializedName("default_value") + private String default_value; + + @SerializedName("enums") + private List<String> enums; + + public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { + AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); + algorithmParamDTO.setName(name); + algorithmParamDTO.setDesc(this.desc); + algorithmParamDTO.setValueType(this.type); + algorithmParamDTO.setType("other"); + algorithmParamDTO.setDefaultValue(this.default_value); + algorithmParamDTO.setValueNotBlank(this.notblank); + algorithmParamDTO.setLabel(this.label); + algorithmParamDTO.setValueEnumerations(this.enums); + algorithmParamDTO.setValueMultiple(this.multiple); + algorithmParamDTO.setValueMin(this.min); + algorithmParamDTO.setValueMax(this.max); + return algorithmParamDTO; + } + } + @Getter @Setter public static class InputDataParamDTO { @@ -63,16 +112,13 @@ public class MIPEngineAlgorithmDTO { AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); algorithmParamDTO.setName(name); algorithmParamDTO.setDesc(this.desc); - if(name.equals("datasets") || name.equals("filters") || name.equals("pathology")){ - algorithmParamDTO.setValueType(this.types.get(0)); - if(name.equals("filters")){ - algorithmParamDTO.setName("filter"); - algorithmParamDTO.setType("filter"); - } + + if(name.equals("datasets") || name.equals("filter") || name.equals("pathology")){ if(name.equals("datasets")){ algorithmParamDTO.setName("dataset"); - algorithmParamDTO.setType("dataset"); } + algorithmParamDTO.setValueType(this.types.get(0)); + algorithmParamDTO.setType(algorithmParamDTO.getName()); } else{ algorithmParamDTO.setType("column"); @@ -84,7 +130,8 @@ public class MIPEngineAlgorithmDTO { algorithmParamDTO.setValueMultiple(this.multiple); String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; algorithmParamDTO.setLabel(Arrays.asList(hidden).contains(algorithmParamDTO.getName()) ? algorithmParamDTO.getName():this.label); - + System.out.println("-------------------------------------------------------->"); + System.out.println(JsonConverters.convertObjectToJsonString(algorithmParamDTO)); return algorithmParamDTO; } private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { @@ -120,6 +167,14 @@ public class MIPEngineAlgorithmDTO { e.printStackTrace(); } }); + this.parameters.forEach((name, parameterDTO) -> { + try { + AlgorithmDTO.AlgorithmParamDTO parameter = parameterDTO.convertToAlgorithmParamDTO(name); + parameters.add(parameter); + } catch (Exception e) { + e.printStackTrace(); + } + }); algorithmDTO.setParameters(parameters); return algorithmDTO; } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java index b8b2f957a..1572eb7da 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; +import java.util.Hashtable; import java.util.List; @Getter @@ -12,7 +13,7 @@ public class MIPEngineBody { @SerializedName("inputdata") private InputData inputdata; @SerializedName("parameters") - private Object parameters; + private Hashtable<String, Object> parameters; @Getter @Setter @@ -22,7 +23,7 @@ public class MIPEngineBody { @SerializedName("datasets") private List<String> datasets; @SerializedName("filters") - private AlgorithmDTO.Filters filters; + private AlgorithmDTO.Filter filters; @SerializedName("x") private List<String> x; @SerializedName("y") diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index bc7f4dd11..a48beb3aa 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -27,6 +27,9 @@ import eu.hbp.mip.utils.Exceptions.*; import eu.hbp.mip.utils.HTTPUtil; import eu.hbp.mip.utils.JsonConverters; import eu.hbp.mip.utils.Logger; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.springframework.beans.factory.annotation.Value; @@ -386,7 +389,7 @@ public class ExperimentService { .append("\n")); logger.LogUserAction("Executing " + algorithmName + parametersLogMessage); } - + /** * The getDatasetFromExperimentParameters will retrieve the dataset from the experiment parameters * @@ -508,19 +511,9 @@ public class ExperimentService { } private List<Object> formattingMIPEngienResult(String result) { - List<List<String>> resultJson = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<String>>().getClass()); - String schema_json = "{\"fields\":[{\"type\":\"string\",\"name\":\"node\"},{\"type\":\"number\",\"name\":\"row-id\"},{\"type\":\"number\",\"name\":\"alzheimerbroadcategory_bin\"}]}"; - LinkedTreeMap<String,List<Object>> schema = JsonConverters.convertJsonStringToObject(schema_json, new LinkedTreeMap<String,ArrayList<Object>>().getClass()); - - - LinkedTreeMap<String,Object> data_data = new LinkedTreeMap<>(); - data_data.put("data", resultJson); - data_data.put("profile", "tabular-data-resource"); - data_data.put("schema", schema); - data_data.put("name","Logistic Regression Stuff"); - + MIPVisualization mipVisualization = JsonConverters.convertJsonStringToObject(result, MIPVisualization.class); LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); - data.put("data", data_data); + data.put("data", mipVisualization.convertToVisualization()); data.put("type", "application/vnd.dataresource+json"); List<Object> finalObject = new ArrayList<>(); finalObject.add(data); @@ -601,6 +594,7 @@ public class ExperimentService { } catch (Exception e) { throw new InternalServerError("Error occurred : " + e.getMessage()); } + System.out.println(results); // Results are stored in the experiment object List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); @@ -1045,6 +1039,8 @@ public class ExperimentService { return returnError; } + @Getter + @Setter static class ExperimentResult { private final int code; private final List<Object> results; @@ -1053,13 +1049,43 @@ public class ExperimentService { this.code = code; this.results = results; } + } - public int getCode() { - return code; + @Getter + @Setter + @AllArgsConstructor + static class Visualization { + private final String title; + private final String profile; + private final List<Field> columns; + private final List<List<Object>> data; + } + + @Getter + @Setter + @AllArgsConstructor + static class MIPVisualization { + private final String title; + private final List<String> columns; + private final List<List<Object>> data; + + public Visualization convertToVisualization() { + ArrayList<Field> fields = new ArrayList<>(); + this.columns.forEach(header_name -> fields.add(new Field(header_name, "number"))); + return new Visualization(this.title, "tabular-data-resource", fields, this.data); } - public List<Object> getResults() { - return results; + } + + @Getter + @Setter + static class Field { + private final String name; + private final String type; + + Field(String name, String type) { + this.name = name; + this.type = type; } } } -- GitLab From ea916dbc8c3b0cd03de4e721eb69d5b7da4ff1a8 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Mon, 5 Jul 2021 07:44:59 -0700 Subject: [PATCH 07/12] Visualization is now dynamic in a tabular data form --- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 39 ++--- .../eu/hbp/mip/models/DAOs/ExperimentDAO.java | 4 +- .../eu/hbp/mip/models/DTOs/AlgorithmDTO.java | 162 ------------------ .../mip/models/DTOs/ExaremeAlgorithmDTO.java | 89 ++++++++++ .../DTOs/ExaremeAlgorithmRequestDTO.java | 53 ++++++ .../DTOs/ExaremeAlgorithmResultDTO.java | 17 ++ .../eu/hbp/mip/models/DTOs/ExperimentDTO.java | 8 +- .../models/DTOs/MIPEngineAlgorithmDTO.java | 133 ++++++++------ .../DTOs/MIPEngineAlgorithmResultDTO.java | 23 +++ ...eBody.java => MIPEngineExperimentDTO.java} | 20 ++- .../MIPEngineTabularVisualizationDTO.java | 27 +++ .../eu/hbp/mip/models/galaxy/WorkflowDTO.java | 27 +-- .../hbp/mip/services/ExperimentService.java | 109 +++--------- 13 files changed, 369 insertions(+), 342 deletions(-) delete mode 100644 src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java rename src/main/java/eu/hbp/mip/models/DTOs/{MIPEngineBody.java => MIPEngineExperimentDTO.java} (64%) create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 6385d89d5..08132000d 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -8,7 +8,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import eu.hbp.mip.controllers.galaxy.retrofit.RetroFitGalaxyClients; import eu.hbp.mip.controllers.galaxy.retrofit.RetrofitClientInstance; -import eu.hbp.mip.models.DTOs.AlgorithmDTO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmDTO; import eu.hbp.mip.models.DTOs.MIPEngineAlgorithmDTO; import eu.hbp.mip.models.galaxy.WorkflowDTO; import eu.hbp.mip.services.ActiveUserService; @@ -65,24 +65,20 @@ public class AlgorithmsAPI { @ApiOperation(value = "List all algorithms", response = String.class) @RequestMapping(method = RequestMethod.GET) - public ResponseEntity<List<AlgorithmDTO>> getAlgorithms() { + public ResponseEntity<List<ExaremeAlgorithmDTO>> getAlgorithms() { Logger logger = new Logger(activeUserService.getActiveUser().getUsername(), "(GET) /algorithms"); logger.LogUserAction("Executing..."); - LinkedList<AlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); + LinkedList<ExaremeAlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); - LinkedList<AlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); + LinkedList<ExaremeAlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); logger.LogUserAction("Loaded " + exaremeAlgorithms.size() + " exareme algorithms"); - LinkedList<AlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); + LinkedList<ExaremeAlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); logger.LogUserAction("Loaded " + galaxyAlgorithms.size() + " galaxy algorithms"); - LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); + LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); if (exaremeAlgorithms != null) { - //algorithms.addAll(exaremeAlgorithms); - exaremeAlgorithms.forEach(algorithmDTO -> { - if(algorithmDTO.getName().equals("LOGISTIC_REGRESSION")) - algorithms.add(algorithmDTO); - }); + algorithms.addAll(exaremeAlgorithms); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } @@ -92,7 +88,7 @@ public class AlgorithmsAPI { logger.LogUserAction("Getting mipengine algorithms failed and returned null"); } if (galaxyAlgorithms != null) { -// algorithms.addAll(galaxyAlgorithms); + algorithms.addAll(galaxyAlgorithms); } else { logger.LogUserAction("Getting galaxy workflows failed and returned null"); } @@ -105,8 +101,8 @@ public class AlgorithmsAPI { } // Remove any disabled algorithm - LinkedList<AlgorithmDTO> allowedAlgorithms = new LinkedList<>(); - for (AlgorithmDTO algorithm : algorithms) { + LinkedList<ExaremeAlgorithmDTO> allowedAlgorithms = new LinkedList<>(); + for (ExaremeAlgorithmDTO algorithm : algorithms) { if (!disabledAlgorithms.contains(algorithm.getName())) { allowedAlgorithms.add(algorithm); } @@ -120,15 +116,15 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<AlgorithmDTO> getExaremeAlgorithms(Logger logger) { - LinkedList<AlgorithmDTO> algorithms; + public LinkedList<ExaremeAlgorithmDTO> getExaremeAlgorithms(Logger logger) { + LinkedList<ExaremeAlgorithmDTO> algorithms; // Get exareme algorithms try { StringBuilder response = new StringBuilder(); HTTPUtil.sendGet(exaremeAlgorithmsUrl, response); algorithms = gson.fromJson( response.toString(), - new TypeToken<LinkedList<AlgorithmDTO>>() { + new TypeToken<LinkedList<ExaremeAlgorithmDTO>>() { }.getType() ); } catch (IOException e) { @@ -145,7 +141,7 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<AlgorithmDTO> getMIPEngineAlgorithms(Logger logger) { + public LinkedList<ExaremeAlgorithmDTO> getMIPEngineAlgorithms(Logger logger) { LinkedList<MIPEngineAlgorithmDTO> mipEngineAlgorithms; // Get MIPEngine algorithms try { @@ -163,8 +159,7 @@ public class AlgorithmsAPI { return null; } - - LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); + LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); mipEngineAlgorithms.forEach(mipEngineAlgorithm -> algorithms.add(mipEngineAlgorithm.convertToAlgorithmDTO())); logger.LogUserAction("Completed, returned " + algorithms.size() + " algorithms."); @@ -176,7 +171,7 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<AlgorithmDTO> getGalaxyWorkflows(Logger logger) { + public LinkedList<ExaremeAlgorithmDTO> getGalaxyWorkflows(Logger logger) { List<Workflow> workflowList; try { // Get all the workflows with the galaxy client @@ -215,7 +210,7 @@ public class AlgorithmsAPI { logger.LogUserAction("Workflows fetched: " + workflows.size()); // Convert the workflows to algorithms - LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); + LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); for (WorkflowDTO workflow : workflows) { logger.LogUserAction("Converting workflow: " + workflow); diff --git a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java index 585bd8bd6..4e206fae0 100644 --- a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java +++ b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java @@ -3,7 +3,7 @@ package eu.hbp.mip.models.DAOs; import com.fasterxml.jackson.annotation.JsonInclude; import com.google.gson.Gson; import com.google.gson.annotations.Expose; -import eu.hbp.mip.models.DTOs.AlgorithmDTO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmDTO; import eu.hbp.mip.models.DTOs.ExperimentDTO; import eu.hbp.mip.utils.JsonConverters; import io.swagger.annotations.ApiModel; @@ -98,7 +98,7 @@ public class ExperimentDAO { public ExperimentDTO convertToDTO(boolean includeResult) { ExperimentDTO experimentDTO = new ExperimentDTO(); - experimentDTO.setAlgorithm(JsonConverters.convertJsonStringToObject(this.algorithm, AlgorithmDTO.class)); + experimentDTO.setAlgorithm(JsonConverters.convertJsonStringToObject(this.algorithm, ExaremeAlgorithmDTO.class)); experimentDTO.setCreated(this.created); experimentDTO.setUpdated(this.updated); experimentDTO.setFinished(this.finished); diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java deleted file mode 100644 index 6d70c0215..000000000 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ /dev/null @@ -1,162 +0,0 @@ -package eu.hbp.mip.models.DTOs; - -import com.google.gson.annotations.SerializedName; -import eu.hbp.mip.utils.JsonConverters; -import lombok.Getter; -import lombok.Setter; - -import java.util.*; - -@Getter -@Setter -public class AlgorithmDTO { - - @SerializedName("name") - private String name; - - @SerializedName("desc") - private String desc; - - @SerializedName("label") - private String label; - - @SerializedName("type") - private String type; - - @SerializedName("parameters") - private List<AlgorithmParamDTO> parameters; - - @Getter - @Setter - public static class AlgorithmParamDTO { - @SerializedName("name") - private String name; - - @SerializedName("desc") - private String desc; - - @SerializedName("label") - private String label; - - @SerializedName("type") - private String type; - - @SerializedName("columnValuesSQLType") - private String columnValuesSQLType; - - @SerializedName("columnValuesIsCategorical") - private String columnValuesIsCategorical; - - @SerializedName("value") - private String value; - - @SerializedName("defaultValue") - private String defaultValue; - - @SerializedName("valueType") - private String valueType; - - @SerializedName("valueNotBlank") - private String valueNotBlank; - - @SerializedName("valueMultiple") - private String valueMultiple; - - @SerializedName("valueMin") - private String valueMin; - - @SerializedName("valueMax") - private String valueMax; - - @SerializedName("valueEnumerations") - private List<String> valueEnumerations; - } - - @Getter - @Setter - public static class Rule - { - @SerializedName("id") - private String id; - - @SerializedName("type") - private String type; - - @SerializedName("operator") - private String operator; - - @SerializedName("value") - private Object value; - - public Rule(String id, String type, String operator, Object value) { - this.id = id; - this.type = type; - this.operator = operator; - this.value = value; - } - } - - @Getter - @Setter - public static class Filter - { - @SerializedName("condition") - private String condition; - - @SerializedName("rules") - private List<Object> rules; - - @SerializedName("valid") - private boolean valid; - - public Filter(String condition, List<Object> rules, boolean valid) { - this.condition = condition; - this.rules = rules; - this.valid = valid; - } - } - - - public MIPEngineBody convertToMIPEngineBody() - { - MIPEngineBody mipEngineBody = new MIPEngineBody(); - MIPEngineBody.InputData inputData = new MIPEngineBody.InputData(); - Hashtable<String, Object> mipEngineParameters = new Hashtable<>(); - - List<Object> rules = new ArrayList<>(); - this.parameters.forEach(parameter -> { - - if(parameter.getName().equals("x")) { - System.out.println("x"); - List<String> x = Arrays.asList(parameter.getValue().split(",")); - x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setX(x); - } - else if(parameter.getName().equals("y")) { - List<String> y = Arrays.asList(parameter.getValue().split(",")); - y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setY(y); - } - else if(parameter.getName().equals("dataset")){ - List<String> datasets = Arrays.asList(parameter.getValue().split(",")); - rules.add(new Rule("dataset","string", "in", datasets)); - inputData.setDatasets(datasets); - } - else if(parameter.getName().equals("pathology")) - inputData.setPathology(parameter.getValue()); - - else if(parameter.getName().equals("filter")){ - if (parameter.getValue() != "") - rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filter.class)); - } - else{ - mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); - } - }); - Filter filter = new Filter("AND", rules, true); - inputData.setFilters(filter); - mipEngineBody.setInputdata(inputData); - mipEngineBody.setParameters(mipEngineParameters); - return mipEngineBody; - } -} diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java new file mode 100644 index 000000000..b56e16bc7 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java @@ -0,0 +1,89 @@ +package eu.hbp.mip.models.DTOs; + +import com.google.gson.annotations.SerializedName; +import eu.hbp.mip.utils.JsonConverters; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.*; + +@Getter +@Setter +public class ExaremeAlgorithmDTO { + + @SerializedName("name") + private String name; + + @SerializedName("desc") + private String desc; + + @SerializedName("label") + private String label; + + @SerializedName("type") + private String type; + + @SerializedName("parameters") + private List<ExaremeAlgorithmRequestDTO> parameters; + + + @Getter + @Setter + @AllArgsConstructor + class Rule + { + @SerializedName("id") + private String id; + + @SerializedName("type") + private String type; + + @SerializedName("operator") + private String operator; + + @SerializedName("value") + private Object value; + } + public MIPEngineExperimentDTO convertToMIPEngineBody() + { + MIPEngineExperimentDTO mipEngineExperimentDTO = new MIPEngineExperimentDTO(); + MIPEngineExperimentDTO.InputData inputData = new MIPEngineExperimentDTO.InputData(); + Hashtable<String, Object> mipEngineParameters = new Hashtable<>(); + + List<Object> rules = new ArrayList<>(); + this.parameters.forEach(parameter -> { + + if(parameter.getName().equals("x")) { + List<String> x = Arrays.asList(parameter.getValue().split(",")); + x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setX(x); + } + else if(parameter.getName().equals("y")) { + List<String> y = Arrays.asList(parameter.getValue().split(",")); + y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setY(y); + } + else if(parameter.getName().equals("dataset")){ + List<String> datasets = Arrays.asList(parameter.getValue().split(",")); + rules.add(new Rule("dataset","string", "in", datasets)); + inputData.setDatasets(datasets); + } + else if(parameter.getName().equals("pathology")) + inputData.setPathology(parameter.getValue()); + + else if(parameter.getName().equals("filter")){ + if (parameter.getValue() != "") + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), MIPEngineExperimentDTO.Filter.class)); + } + else{ + mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); + } + }); + MIPEngineExperimentDTO.Filter filter = new MIPEngineExperimentDTO.Filter("AND", rules, true); + inputData.setFilters(filter); + mipEngineExperimentDTO.setInputdata(inputData); + mipEngineExperimentDTO.setParameters(mipEngineParameters); + return mipEngineExperimentDTO; + } +} diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java new file mode 100644 index 000000000..84e275ec8 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java @@ -0,0 +1,53 @@ +package eu.hbp.mip.models.DTOs; + +import com.google.gson.annotations.SerializedName; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ExaremeAlgorithmRequestDTO { + @SerializedName("name") + private String name; + + @SerializedName("desc") + private String desc; + + @SerializedName("label") + private String label; + + @SerializedName("type") + private String type; + + @SerializedName("columnValuesSQLType") + private String columnValuesSQLType; + + @SerializedName("columnValuesIsCategorical") + private String columnValuesIsCategorical; + + @SerializedName("value") + private String value; + + @SerializedName("defaultValue") + private String defaultValue; + + @SerializedName("valueType") + private String valueType; + + @SerializedName("valueNotBlank") + private String valueNotBlank; + + @SerializedName("valueMultiple") + private String valueMultiple; + + @SerializedName("valueMin") + private String valueMin; + + @SerializedName("valueMax") + private String valueMax; + + @SerializedName("valueEnumerations") + private List<String> valueEnumerations; +} diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java new file mode 100644 index 000000000..ca556bb73 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java @@ -0,0 +1,17 @@ +package eu.hbp.mip.models.DTOs; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class ExaremeAlgorithmResultDTO { + private int code; + private List<Object> results; +} + + diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java index e64c6f75e..765c20144 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java @@ -22,10 +22,12 @@ public class ExperimentDTO { private Date finished; private Boolean shared; private Boolean viewed; + // Result is a list of objects because there is a limitation that java has in types. + // Exareme has result in the type of a List<HashMap<String, Object>> + // Galaxy has result in the type of a List<HashMap<String, List<Object>>> + //And there is no generic type that describes either an object or a list of objects private List<Object> result; private ExperimentDAO.Status status; - private AlgorithmDTO algorithm; + private ExaremeAlgorithmDTO algorithm; - public ExperimentDTO() { - } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index d391492d7..ada09db3b 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -33,7 +33,7 @@ public class MIPEngineAlgorithmDTO { private String crossvalidation; @SerializedName("inputdata") - private Hashtable<String, InputDataParamDTO> inputdata; + private InputdataDTO inputdata; @Getter @Setter @@ -66,26 +66,55 @@ public class MIPEngineAlgorithmDTO { @SerializedName("enums") private List<String> enums; - public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { - AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); - algorithmParamDTO.setName(name); - algorithmParamDTO.setDesc(this.desc); - algorithmParamDTO.setValueType(this.type); - algorithmParamDTO.setType("other"); - algorithmParamDTO.setDefaultValue(this.default_value); - algorithmParamDTO.setValueNotBlank(this.notblank); - algorithmParamDTO.setLabel(this.label); - algorithmParamDTO.setValueEnumerations(this.enums); - algorithmParamDTO.setValueMultiple(this.multiple); - algorithmParamDTO.setValueMin(this.min); - algorithmParamDTO.setValueMax(this.max); - return algorithmParamDTO; + public ExaremeAlgorithmRequestDTO convertToexaremeAlgorithmRequestDTO(String name) throws Exception { + ExaremeAlgorithmRequestDTO exaremeAlgorithmRequestDTO = new ExaremeAlgorithmRequestDTO(); + exaremeAlgorithmRequestDTO.setName(name); + exaremeAlgorithmRequestDTO.setDesc(this.desc); + exaremeAlgorithmRequestDTO.setValueType(this.type); + exaremeAlgorithmRequestDTO.setType("other"); + exaremeAlgorithmRequestDTO.setDefaultValue(this.default_value); + exaremeAlgorithmRequestDTO.setValueNotBlank(this.notblank); + exaremeAlgorithmRequestDTO.setLabel(this.label); + exaremeAlgorithmRequestDTO.setValueEnumerations(this.enums); + exaremeAlgorithmRequestDTO.setValueMultiple(this.multiple); + exaremeAlgorithmRequestDTO.setValueMin(this.min); + exaremeAlgorithmRequestDTO.setValueMax(this.max); + return exaremeAlgorithmRequestDTO; } } @Getter @Setter - public static class InputDataParamDTO { + public static class InputdataDTO { + @SerializedName("x") + private InputDataDetailDTO x; + + @SerializedName("y") + private InputDataDetailDTO y; + + @SerializedName("pathology") + private InputDataDetailDTO pathology; + + @SerializedName("datasets") + private InputDataDetailDTO datasets; + + @SerializedName("filter") + private InputDataDetailDTO filter; + + public List<ExaremeAlgorithmRequestDTO> convertToAlgorithmRequestDTOs() throws Exception { + List<ExaremeAlgorithmRequestDTO> exaremeAlgorithmRequestDTOS = new ArrayList<>(); + exaremeAlgorithmRequestDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("x")); + exaremeAlgorithmRequestDTOS.add(this.y.convertToExaremeAlgorithmRequestDTO("y")); + exaremeAlgorithmRequestDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("pathology")); + exaremeAlgorithmRequestDTOS.add(this.datasets.convertToExaremeAlgorithmRequestDTO("dataset")); + exaremeAlgorithmRequestDTOS.add(this.filter.convertToExaremeAlgorithmRequestDTO("filter")); + return exaremeAlgorithmRequestDTOS; + } + } + + @Getter + @Setter + public static class InputDataDetailDTO { @SerializedName("stattypes") private List<String> stattypes; @@ -108,32 +137,27 @@ public class MIPEngineAlgorithmDTO { @SerializedName("desc") private String desc; - public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { - AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); - algorithmParamDTO.setName(name); - algorithmParamDTO.setDesc(this.desc); - - if(name.equals("datasets") || name.equals("filter") || name.equals("pathology")){ - if(name.equals("datasets")){ - algorithmParamDTO.setName("dataset"); - } - algorithmParamDTO.setValueType(this.types.get(0)); - algorithmParamDTO.setType(algorithmParamDTO.getName()); + public ExaremeAlgorithmRequestDTO convertToExaremeAlgorithmRequestDTO(String name) throws Exception { + ExaremeAlgorithmRequestDTO exaremeAlgorithmRequestDTO = new ExaremeAlgorithmRequestDTO(); + exaremeAlgorithmRequestDTO.setName(name); + exaremeAlgorithmRequestDTO.setDesc(this.desc); + exaremeAlgorithmRequestDTO.setValue(""); + exaremeAlgorithmRequestDTO.setValueNotBlank(this.notblank); + exaremeAlgorithmRequestDTO.setValueMultiple(this.multiple); + String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; + exaremeAlgorithmRequestDTO.setLabel(Arrays.asList(hidden).contains(exaremeAlgorithmRequestDTO.getName()) ? exaremeAlgorithmRequestDTO.getName():this.label); + if(name.equals("dataset") || name.equals("filter") || name.equals("pathology")){ + exaremeAlgorithmRequestDTO.setValueType(this.types.get(0)); + exaremeAlgorithmRequestDTO.setType(exaremeAlgorithmRequestDTO.getName()); } else{ - algorithmParamDTO.setType("column"); - algorithmParamDTO.setColumnValuesSQLType(String.join(", ", this.types)); - algorithmParamDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); + exaremeAlgorithmRequestDTO.setType("column"); + exaremeAlgorithmRequestDTO.setColumnValuesSQLType(String.join(", ", this.types)); + exaremeAlgorithmRequestDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); } - algorithmParamDTO.setValue(""); - algorithmParamDTO.setValueNotBlank(this.notblank); - algorithmParamDTO.setValueMultiple(this.multiple); - String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; - algorithmParamDTO.setLabel(Arrays.asList(hidden).contains(algorithmParamDTO.getName()) ? algorithmParamDTO.getName():this.label); - System.out.println("-------------------------------------------------------->"); - System.out.println(JsonConverters.convertObjectToJsonString(algorithmParamDTO)); - return algorithmParamDTO; + return exaremeAlgorithmRequestDTO; } + private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { if (stattypes.contains("nominal") && stattypes.contains("numerical")){ @@ -151,31 +175,28 @@ public class MIPEngineAlgorithmDTO { } } - public AlgorithmDTO convertToAlgorithmDTO() + public ExaremeAlgorithmDTO convertToAlgorithmDTO() { - AlgorithmDTO algorithmDTO = new AlgorithmDTO(); - algorithmDTO.setName(this.name.toUpperCase()); - algorithmDTO.setLabel(this.label); - algorithmDTO.setDesc(this.desc); - algorithmDTO.setType("mipengine"); - List<AlgorithmDTO.AlgorithmParamDTO> parameters = new ArrayList<>(); - this.inputdata.forEach((name, inputDataParamDTO) -> { - try { - AlgorithmDTO.AlgorithmParamDTO parameter = inputDataParamDTO.convertToAlgorithmParamDTO(name); - parameters.add(parameter); - } catch (Exception e) { - e.printStackTrace(); - } - }); + ExaremeAlgorithmDTO exaremeAlgorithmDTO = new ExaremeAlgorithmDTO(); + exaremeAlgorithmDTO.setName(this.name.toUpperCase()); + exaremeAlgorithmDTO.setLabel(this.label); + exaremeAlgorithmDTO.setDesc(this.desc); + exaremeAlgorithmDTO.setType("mipengine"); + List<ExaremeAlgorithmRequestDTO> parameters = new ArrayList<>(); + try { + parameters.addAll(this.inputdata.convertToAlgorithmRequestDTOs()); + } catch (Exception e) { + e.printStackTrace(); + } this.parameters.forEach((name, parameterDTO) -> { try { - AlgorithmDTO.AlgorithmParamDTO parameter = parameterDTO.convertToAlgorithmParamDTO(name); + ExaremeAlgorithmRequestDTO parameter = parameterDTO.convertToexaremeAlgorithmRequestDTO(name); parameters.add(parameter); } catch (Exception e) { e.printStackTrace(); } }); - algorithmDTO.setParameters(parameters); - return algorithmDTO; + exaremeAlgorithmDTO.setParameters(parameters); + return exaremeAlgorithmDTO; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java new file mode 100644 index 000000000..087adb1f8 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java @@ -0,0 +1,23 @@ +package eu.hbp.mip.models.DTOs; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.HashMap; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class MIPEngineAlgorithmResultDTO { + private final String title; + private final List<MIPEngineTabularVisualizationDTO.Field> columns; + private final List<List<Object>> data; + + public MIPEngineTabularVisualizationDTO convertToVisualization() { + HashMap<String, List<MIPEngineTabularVisualizationDTO.Field>> schema = new HashMap<>(); + schema.put("fields", columns); + return new MIPEngineTabularVisualizationDTO(this.title, "tabular-data-resource", schema, this.data); + } +} \ No newline at end of file diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java similarity index 64% rename from src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java rename to src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java index 1572eb7da..46b7df898 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java @@ -1,6 +1,7 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -9,7 +10,7 @@ import java.util.List; @Getter @Setter -public class MIPEngineBody { +public class MIPEngineExperimentDTO { @SerializedName("inputdata") private InputData inputdata; @SerializedName("parameters") @@ -23,10 +24,25 @@ public class MIPEngineBody { @SerializedName("datasets") private List<String> datasets; @SerializedName("filters") - private AlgorithmDTO.Filter filters; + private Filter filters; @SerializedName("x") private List<String> x; @SerializedName("y") private List<String> y; } + + @Getter + @Setter + @AllArgsConstructor + public static class Filter + { + @SerializedName("condition") + private String condition; + + @SerializedName("rules") + private List<Object> rules; + + @SerializedName("valid") + private boolean valid; + } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java new file mode 100644 index 000000000..7be3fad33 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java @@ -0,0 +1,27 @@ +package eu.hbp.mip.models.DTOs; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.HashMap; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class MIPEngineTabularVisualizationDTO { + private final String name; + private final String profile; + private final HashMap<String, List<Field>> schema; + private final List<List<Object>> data; + + @Getter + @Setter + @AllArgsConstructor + public static class Field { + private final String name; + private final String type; + } +} + diff --git a/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java b/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java index 496ee2dfe..edc18117d 100644 --- a/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java +++ b/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java @@ -2,7 +2,8 @@ package eu.hbp.mip.models.galaxy; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; -import eu.hbp.mip.models.DTOs.AlgorithmDTO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmDTO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmRequestDTO; import java.util.*; @@ -103,29 +104,29 @@ public class WorkflowDTO { } } - public AlgorithmDTO convertToAlgorithmDTO() { + public ExaremeAlgorithmDTO convertToAlgorithmDTO() { - AlgorithmDTO algorithmDTO = new AlgorithmDTO(); + ExaremeAlgorithmDTO exaremeAlgorithmDTO = new ExaremeAlgorithmDTO(); // Transfer workflow information - algorithmDTO.setName(id); - algorithmDTO.setDesc(""); - algorithmDTO.setLabel(name); - algorithmDTO.setType("workflow"); + exaremeAlgorithmDTO.setName(id); + exaremeAlgorithmDTO.setDesc(""); + exaremeAlgorithmDTO.setLabel(name); + exaremeAlgorithmDTO.setType("workflow"); // Transfer workflow parameters information - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParams = new LinkedList<>(); + List<ExaremeAlgorithmRequestDTO> algorithmParams = new LinkedList<>(); Gson gson = new Gson(); for (Map.Entry<String, WorkflowInputDTO> workflowInput : getInputs().entrySet()) { // Convert the annotation to algorithm Parameter - AlgorithmDTO.AlgorithmParamDTO algorithmParam; + ExaremeAlgorithmRequestDTO algorithmParam; if (steps.get(workflowInput.getKey()).getAnnotation() != null) { algorithmParam = gson.fromJson(steps.get(workflowInput.getKey()).getAnnotation(), - AlgorithmDTO.AlgorithmParamDTO.class); + ExaremeAlgorithmRequestDTO.class); } else { // If annotation is not provided, auto-fill some information - algorithmParam = new AlgorithmDTO.AlgorithmParamDTO(); + algorithmParam = new ExaremeAlgorithmRequestDTO(); // When the constraints are not known, set the most relaxed constraints algorithmParam.setDesc(""); algorithmParam.setValue(""); @@ -154,9 +155,9 @@ public class WorkflowDTO { algorithmParams.add(algorithmParam); } - algorithmDTO.setParameters(algorithmParams); + exaremeAlgorithmDTO.setParameters(algorithmParams); - return algorithmDTO; + return exaremeAlgorithmDTO; } } diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index a48beb3aa..587fc7e63 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -15,9 +15,7 @@ import eu.hbp.mip.controllers.galaxy.retrofit.RetroFitGalaxyClients; import eu.hbp.mip.controllers.galaxy.retrofit.RetrofitClientInstance; import eu.hbp.mip.models.DAOs.ExperimentDAO; import eu.hbp.mip.models.DAOs.UserDAO; -import eu.hbp.mip.models.DTOs.AlgorithmDTO; -import eu.hbp.mip.models.DTOs.ExperimentDTO; -import eu.hbp.mip.models.DTOs.MIPEngineBody; +import eu.hbp.mip.models.DTOs.*; import eu.hbp.mip.models.galaxy.GalaxyWorkflowResult; import eu.hbp.mip.models.galaxy.PostWorkflowToGalaxyDtoResponse; import eu.hbp.mip.repositories.ExperimentRepository; @@ -27,9 +25,6 @@ import eu.hbp.mip.utils.Exceptions.*; import eu.hbp.mip.utils.HTTPUtil; import eu.hbp.mip.utils.JsonConverters; import eu.hbp.mip.utils.Logger; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.springframework.beans.factory.annotation.Value; @@ -236,12 +231,12 @@ public class ExperimentService { logger.LogUserAction("Completed, returning: " + experimentDTO); // Results are stored in the experiment object - ExperimentResult experimentResult = runExperiment(experimentDTO, logger); + ExaremeAlgorithmResultDTO exaremeAlgorithmResultDTO = runExperiment(experimentDTO, logger); - logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + experimentResult.getCode() + " and result: " + experimentResult.getResults()); + logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResults()); - experimentDTO.setResult((experimentResult.getCode() >= 400) ? null : experimentResult.getResults()); - experimentDTO.setStatus((experimentResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); + experimentDTO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : exaremeAlgorithmResultDTO.getResults()); + experimentDTO.setStatus((exaremeAlgorithmResultDTO.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); return experimentDTO; } @@ -400,7 +395,7 @@ public class ExperimentService { private String getDatasetFromExperimentParameters(ExperimentDTO experimentDTO, Logger logger) { String experimentDatasets = null; - for (AlgorithmDTO.AlgorithmParamDTO parameter : experimentDTO.getAlgorithm().getParameters()) { + for (ExaremeAlgorithmRequestDTO parameter : experimentDTO.getAlgorithm().getParameters()) { if (parameter.getLabel().equals("dataset")) { experimentDatasets = parameter.getValue(); break; @@ -510,14 +505,14 @@ public class ExperimentService { return JsonConverters.convertObjectToJsonString(finalJsonObject); } - private List<Object> formattingMIPEngienResult(String result) { - MIPVisualization mipVisualization = JsonConverters.convertJsonStringToObject(result, MIPVisualization.class); + private ExaremeAlgorithmResultDTO convertMIPEngineResultToExaremeAlgorithmResult(int code, String result) { + MIPEngineAlgorithmResultDTO mipVisualization = JsonConverters.convertJsonStringToObject(result, MIPEngineAlgorithmResultDTO.class); LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); data.put("data", mipVisualization.convertToVisualization()); data.put("type", "application/vnd.dataresource+json"); List<Object> finalObject = new ArrayList<>(); finalObject.add(data); - return finalObject; + return new ExaremeAlgorithmResultDTO(code, finalObject); } /** @@ -526,7 +521,7 @@ public class ExperimentService { * @param experimentDTO is the request with the experiment information * @return the result of experiment as well as the http status that was retrieved */ - public ExperimentResult runExperiment(ExperimentDTO experimentDTO, Logger logger) { + public ExaremeAlgorithmResultDTO runExperiment(ExperimentDTO experimentDTO, Logger logger) { // Algorithm type String algorithmType = experimentDTO.getAlgorithm().getType(); @@ -536,14 +531,14 @@ public class ExperimentService { // Run with the appropriate engine if (algorithmType.equals("mipengine")) { - MIPEngineBody mipEngineBody = experimentDTO.getAlgorithm().convertToMIPEngineBody(); - String body = JsonConverters.convertObjectToJsonString(mipEngineBody); + MIPEngineExperimentDTO mipEngineExperimentDTO = experimentDTO.getAlgorithm().convertToMIPEngineBody(); + String body = JsonConverters.convertObjectToJsonString(mipEngineExperimentDTO); String url = mipengineAlgorithmsUrl + "/" + algorithmName.toLowerCase(); logger.LogUserAction("url: " + url + ", body: " + body); logger.LogUserAction("Algorithm runs on MIPEngine."); return runMIPEngineExperiment(url, body); } else { - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters + List<ExaremeAlgorithmRequestDTO> algorithmParameters = experimentDTO.getAlgorithm().getParameters(); String body = gson.toJson(algorithmParameters); String url = queryExaremeUrl + "/" + algorithmName; @@ -561,7 +556,7 @@ public class ExperimentService { * @param body is the parameters of the algorithm * @return the result of exareme as well as the http status that was retrieved */ - public ExperimentResult runExaremeExperiment(String url, String body) { + public ExaremeAlgorithmResultDTO runExaremeExperiment(String url, String body) { StringBuilder results = new StringBuilder(); int code; @@ -572,10 +567,12 @@ public class ExperimentService { } // Results are stored in the experiment object - ExperimentDTO experimentDTOWithOnlyResult = JsonConverters.convertJsonStringToObject(String.valueOf(results), ExperimentDTO.class); - List<Object> resultDTOS = experimentDTOWithOnlyResult.getResult(); + ExaremeAlgorithmResultDTO exaremeResult = JsonConverters.convertJsonStringToObject( + String.valueOf(results), ExaremeAlgorithmResultDTO.class + ); + exaremeResult.setCode(code); - return new ExperimentResult(code, resultDTOS); + return exaremeResult; } /** @@ -585,7 +582,7 @@ public class ExperimentService { * @param body is the parameters of the algorithm * @return the result of exareme as well as the http status that was retrieved */ - public ExperimentResult runMIPEngineExperiment(String url, String body) { + public ExaremeAlgorithmResultDTO runMIPEngineExperiment(String url, String body) { StringBuilder results = new StringBuilder(); int code; @@ -596,9 +593,7 @@ public class ExperimentService { } System.out.println(results); // Results are stored in the experiment object - List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); - - return new ExperimentResult(code, resultDTOS); + return convertMIPEngineResultToExaremeAlgorithmResult(code, String.valueOf(results)); } /* -------------------------------------- EXAREME CALLS ---------------------------------------------------------*/ @@ -628,12 +623,12 @@ public class ExperimentService { try { // Results are stored in the experiment object - ExperimentResult experimentResult = runExperiment(finalExperimentDTO, logger); + ExaremeAlgorithmResultDTO exaremeAlgorithmResultDTO = runExperiment(finalExperimentDTO, logger); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + experimentResult.getCode() + " and result: " + experimentResult.getResults()); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResults()); - experimentDAO.setResult((experimentResult.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(experimentResult.getResults())); - experimentDAO.setStatus((experimentResult.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); + experimentDAO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(exaremeAlgorithmResultDTO.getResults())); + experimentDAO.setStatus((exaremeAlgorithmResultDTO.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); } catch (Exception e) { Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "There was an exception: " + e.getMessage()); @@ -667,13 +662,13 @@ public class ExperimentService { String workflowId = experimentDTO.getAlgorithm().getName(); // Get the parameters - List<AlgorithmDTO.AlgorithmParamDTO> algorithmParameters + List<ExaremeAlgorithmRequestDTO> algorithmParameters = experimentDTO.getAlgorithm().getParameters(); // Convert the parameters to workflow parameters HashMap<String, String> algorithmParamsIncludingEmpty = new HashMap<>(); if (algorithmParameters != null) { - for (AlgorithmDTO.AlgorithmParamDTO param : algorithmParameters) { + for (ExaremeAlgorithmRequestDTO param : algorithmParameters) { algorithmParamsIncludingEmpty.put(param.getName(), param.getValue()); } } @@ -1038,54 +1033,4 @@ public class ExperimentService { return returnError; } - - @Getter - @Setter - static class ExperimentResult { - private final int code; - private final List<Object> results; - - public ExperimentResult(int code, List<Object> results) { - this.code = code; - this.results = results; - } - } - - @Getter - @Setter - @AllArgsConstructor - static class Visualization { - private final String title; - private final String profile; - private final List<Field> columns; - private final List<List<Object>> data; - } - - @Getter - @Setter - @AllArgsConstructor - static class MIPVisualization { - private final String title; - private final List<String> columns; - private final List<List<Object>> data; - - public Visualization convertToVisualization() { - ArrayList<Field> fields = new ArrayList<>(); - this.columns.forEach(header_name -> fields.add(new Field(header_name, "number"))); - return new Visualization(this.title, "tabular-data-resource", fields, this.data); - } - - } - - @Getter - @Setter - static class Field { - private final String name; - private final String type; - - Field(String name, String type) { - this.name = name; - this.type = type; - } - } } -- GitLab From b5fba832cb44954763e05a52aca28870027301ec Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Tue, 6 Jul 2021 07:10:06 -0700 Subject: [PATCH 08/12] Fixed warnings from DeepCode --- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 37 ++++---- .../mip/models/DTOs/ExaremeAlgorithmDTO.java | 70 +++++++------- ...a => ExaremeAlgorithmRequestParamDTO.java} | 3 +- .../models/DTOs/MIPEngineAlgorithmDTO.java | 93 +++++++++---------- ...java => MIPEngineAlgorithmRequestDTO.java} | 2 +- .../eu/hbp/mip/models/galaxy/WorkflowDTO.java | 10 +- .../hbp/mip/services/ExperimentService.java | 14 +-- 7 files changed, 111 insertions(+), 118 deletions(-) rename src/main/java/eu/hbp/mip/models/DTOs/{ExaremeAlgorithmRequestDTO.java => ExaremeAlgorithmRequestParamDTO.java} (89%) rename src/main/java/eu/hbp/mip/models/DTOs/{MIPEngineExperimentDTO.java => MIPEngineAlgorithmRequestDTO.java} (96%) diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 08132000d..aea67b056 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -28,7 +28,6 @@ import retrofit2.Response; import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import static eu.hbp.mip.utils.InputStreamConverter.convertInputStreamToString; @@ -69,25 +68,25 @@ public class AlgorithmsAPI { Logger logger = new Logger(activeUserService.getActiveUser().getUsername(), "(GET) /algorithms"); logger.LogUserAction("Executing..."); - LinkedList<ExaremeAlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); + ArrayList<ExaremeAlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); - LinkedList<ExaremeAlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); + ArrayList<ExaremeAlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); logger.LogUserAction("Loaded " + exaremeAlgorithms.size() + " exareme algorithms"); - LinkedList<ExaremeAlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); + ArrayList<ExaremeAlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); logger.LogUserAction("Loaded " + galaxyAlgorithms.size() + " galaxy algorithms"); - LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); - if (exaremeAlgorithms != null) { + ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); + if (!exaremeAlgorithms.isEmpty()) { algorithms.addAll(exaremeAlgorithms); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } - if (mipengineAlgorithms != null) { + if (!mipengineAlgorithms.isEmpty()) { algorithms.addAll(mipengineAlgorithms); } else { logger.LogUserAction("Getting mipengine algorithms failed and returned null"); } - if (galaxyAlgorithms != null) { + if (!galaxyAlgorithms.isEmpty()) { algorithms.addAll(galaxyAlgorithms); } else { logger.LogUserAction("Getting galaxy workflows failed and returned null"); @@ -101,7 +100,7 @@ public class AlgorithmsAPI { } // Remove any disabled algorithm - LinkedList<ExaremeAlgorithmDTO> allowedAlgorithms = new LinkedList<>(); + ArrayList<ExaremeAlgorithmDTO> allowedAlgorithms = new ArrayList<>(); for (ExaremeAlgorithmDTO algorithm : algorithms) { if (!disabledAlgorithms.contains(algorithm.getName())) { allowedAlgorithms.add(algorithm); @@ -116,15 +115,15 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<ExaremeAlgorithmDTO> getExaremeAlgorithms(Logger logger) { - LinkedList<ExaremeAlgorithmDTO> algorithms; + public ArrayList<ExaremeAlgorithmDTO> getExaremeAlgorithms(Logger logger) { + ArrayList<ExaremeAlgorithmDTO> algorithms; // Get exareme algorithms try { StringBuilder response = new StringBuilder(); HTTPUtil.sendGet(exaremeAlgorithmsUrl, response); algorithms = gson.fromJson( response.toString(), - new TypeToken<LinkedList<ExaremeAlgorithmDTO>>() { + new TypeToken<ArrayList<ExaremeAlgorithmDTO>>() { }.getType() ); } catch (IOException e) { @@ -141,8 +140,8 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<ExaremeAlgorithmDTO> getMIPEngineAlgorithms(Logger logger) { - LinkedList<MIPEngineAlgorithmDTO> mipEngineAlgorithms; + public ArrayList<ExaremeAlgorithmDTO> getMIPEngineAlgorithms(Logger logger) { + ArrayList<MIPEngineAlgorithmDTO> mipEngineAlgorithms; // Get MIPEngine algorithms try { StringBuilder response = new StringBuilder(); @@ -151,7 +150,7 @@ public class AlgorithmsAPI { mipEngineAlgorithms = gson.fromJson( response.toString(), - new TypeToken<LinkedList<MIPEngineAlgorithmDTO>>() { + new TypeToken<ArrayList<MIPEngineAlgorithmDTO>>() { }.getType() ); } catch (IOException e) { @@ -159,7 +158,7 @@ public class AlgorithmsAPI { return null; } - LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); + ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); mipEngineAlgorithms.forEach(mipEngineAlgorithm -> algorithms.add(mipEngineAlgorithm.convertToAlgorithmDTO())); logger.LogUserAction("Completed, returned " + algorithms.size() + " algorithms."); @@ -171,7 +170,7 @@ public class AlgorithmsAPI { * * @return a list of AlgorithmDTOs or null if something fails */ - public LinkedList<ExaremeAlgorithmDTO> getGalaxyWorkflows(Logger logger) { + public ArrayList<ExaremeAlgorithmDTO> getGalaxyWorkflows(Logger logger) { List<Workflow> workflowList; try { // Get all the workflows with the galaxy client @@ -185,7 +184,7 @@ public class AlgorithmsAPI { } // Get the workflow details with the custom client to receive them as a WorkflowDTO - List<WorkflowDTO> workflows = new LinkedList<>(); + List<WorkflowDTO> workflows = new ArrayList<>(); // Create the request client RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); for (Workflow workflow : workflowList) { @@ -210,7 +209,7 @@ public class AlgorithmsAPI { logger.LogUserAction("Workflows fetched: " + workflows.size()); // Convert the workflows to algorithms - LinkedList<ExaremeAlgorithmDTO> algorithms = new LinkedList<>(); + ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); for (WorkflowDTO workflow : workflows) { logger.LogUserAction("Converting workflow: " + workflow); diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java index b56e16bc7..887733de8 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java @@ -25,13 +25,13 @@ public class ExaremeAlgorithmDTO { private String type; @SerializedName("parameters") - private List<ExaremeAlgorithmRequestDTO> parameters; + private List<ExaremeAlgorithmRequestParamDTO> parameters; @Getter @Setter @AllArgsConstructor - class Rule + static class Rule { @SerializedName("id") private String id; @@ -45,45 +45,47 @@ public class ExaremeAlgorithmDTO { @SerializedName("value") private Object value; } - public MIPEngineExperimentDTO convertToMIPEngineBody() + public MIPEngineAlgorithmRequestDTO convertToMIPEngineBody() { - MIPEngineExperimentDTO mipEngineExperimentDTO = new MIPEngineExperimentDTO(); - MIPEngineExperimentDTO.InputData inputData = new MIPEngineExperimentDTO.InputData(); - Hashtable<String, Object> mipEngineParameters = new Hashtable<>(); + MIPEngineAlgorithmRequestDTO mipEngineAlgorithmRequestDTO = new MIPEngineAlgorithmRequestDTO(); + MIPEngineAlgorithmRequestDTO.InputData inputData = new MIPEngineAlgorithmRequestDTO.InputData(); + HashMap<String, Object> mipEngineParameters = new HashMap<>(); List<Object> rules = new ArrayList<>(); this.parameters.forEach(parameter -> { - if(parameter.getName().equals("x")) { - List<String> x = Arrays.asList(parameter.getValue().split(",")); - x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setX(x); - } - else if(parameter.getName().equals("y")) { - List<String> y = Arrays.asList(parameter.getValue().split(",")); - y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setY(y); - } - else if(parameter.getName().equals("dataset")){ - List<String> datasets = Arrays.asList(parameter.getValue().split(",")); - rules.add(new Rule("dataset","string", "in", datasets)); - inputData.setDatasets(datasets); - } - else if(parameter.getName().equals("pathology")) - inputData.setPathology(parameter.getValue()); - - else if(parameter.getName().equals("filter")){ - if (parameter.getValue() != "") - rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), MIPEngineExperimentDTO.Filter.class)); - } - else{ - mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); + switch (parameter.getName()) { + case "x": + List<String> x = Arrays.asList(parameter.getValue().split(",")); + x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setX(x); + break; + case "y": + List<String> y = Arrays.asList(parameter.getValue().split(",")); + y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setY(y); + break; + case "dataset": + List<String> datasets = Arrays.asList(parameter.getValue().split(",")); + rules.add(new Rule("dataset", "string", "in", datasets)); + inputData.setDatasets(datasets); + break; + case "pathology": + inputData.setPathology(parameter.getValue()); + break; + case "filter": + if (!parameter.getValue().equals("")) + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), MIPEngineAlgorithmRequestDTO.Filter.class)); + break; + default: + mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); + break; } }); - MIPEngineExperimentDTO.Filter filter = new MIPEngineExperimentDTO.Filter("AND", rules, true); + MIPEngineAlgorithmRequestDTO.Filter filter = new MIPEngineAlgorithmRequestDTO.Filter("AND", rules, true); inputData.setFilters(filter); - mipEngineExperimentDTO.setInputdata(inputData); - mipEngineExperimentDTO.setParameters(mipEngineParameters); - return mipEngineExperimentDTO; + mipEngineAlgorithmRequestDTO.setInputdata(inputData); + mipEngineAlgorithmRequestDTO.setParameters(mipEngineParameters); + return mipEngineAlgorithmRequestDTO; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java similarity index 89% rename from src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java rename to src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java index 84e275ec8..6f7d21655 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java @@ -6,9 +6,10 @@ import lombok.Setter; import java.util.List; +//The request of an exareme algorithm is a list of ExaremeAlgorithmRequestParamDTOs. @Getter @Setter -public class ExaremeAlgorithmRequestDTO { +public class ExaremeAlgorithmRequestParamDTO { @SerializedName("name") private String name; diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index ada09db3b..98677991e 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -1,7 +1,7 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; -import eu.hbp.mip.utils.JsonConverters; +import eu.hbp.mip.utils.Exceptions.InternalServerError; import lombok.Getter; import lombok.Setter; @@ -66,20 +66,20 @@ public class MIPEngineAlgorithmDTO { @SerializedName("enums") private List<String> enums; - public ExaremeAlgorithmRequestDTO convertToexaremeAlgorithmRequestDTO(String name) throws Exception { - ExaremeAlgorithmRequestDTO exaremeAlgorithmRequestDTO = new ExaremeAlgorithmRequestDTO(); - exaremeAlgorithmRequestDTO.setName(name); - exaremeAlgorithmRequestDTO.setDesc(this.desc); - exaremeAlgorithmRequestDTO.setValueType(this.type); - exaremeAlgorithmRequestDTO.setType("other"); - exaremeAlgorithmRequestDTO.setDefaultValue(this.default_value); - exaremeAlgorithmRequestDTO.setValueNotBlank(this.notblank); - exaremeAlgorithmRequestDTO.setLabel(this.label); - exaremeAlgorithmRequestDTO.setValueEnumerations(this.enums); - exaremeAlgorithmRequestDTO.setValueMultiple(this.multiple); - exaremeAlgorithmRequestDTO.setValueMin(this.min); - exaremeAlgorithmRequestDTO.setValueMax(this.max); - return exaremeAlgorithmRequestDTO; + public ExaremeAlgorithmRequestParamDTO convertToexaremeAlgorithmRequestDTO(String name){ + ExaremeAlgorithmRequestParamDTO exaremeAlgorithmRequestParamDTO = new ExaremeAlgorithmRequestParamDTO(); + exaremeAlgorithmRequestParamDTO.setName(name); + exaremeAlgorithmRequestParamDTO.setDesc(this.desc); + exaremeAlgorithmRequestParamDTO.setValueType(this.type); + exaremeAlgorithmRequestParamDTO.setType("other"); + exaremeAlgorithmRequestParamDTO.setDefaultValue(this.default_value); + exaremeAlgorithmRequestParamDTO.setValueNotBlank(this.notblank); + exaremeAlgorithmRequestParamDTO.setLabel(this.label); + exaremeAlgorithmRequestParamDTO.setValueEnumerations(this.enums); + exaremeAlgorithmRequestParamDTO.setValueMultiple(this.multiple); + exaremeAlgorithmRequestParamDTO.setValueMin(this.min); + exaremeAlgorithmRequestParamDTO.setValueMax(this.max); + return exaremeAlgorithmRequestParamDTO; } } @@ -101,14 +101,14 @@ public class MIPEngineAlgorithmDTO { @SerializedName("filter") private InputDataDetailDTO filter; - public List<ExaremeAlgorithmRequestDTO> convertToAlgorithmRequestDTOs() throws Exception { - List<ExaremeAlgorithmRequestDTO> exaremeAlgorithmRequestDTOS = new ArrayList<>(); - exaremeAlgorithmRequestDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("x")); - exaremeAlgorithmRequestDTOS.add(this.y.convertToExaremeAlgorithmRequestDTO("y")); - exaremeAlgorithmRequestDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("pathology")); - exaremeAlgorithmRequestDTOS.add(this.datasets.convertToExaremeAlgorithmRequestDTO("dataset")); - exaremeAlgorithmRequestDTOS.add(this.filter.convertToExaremeAlgorithmRequestDTO("filter")); - return exaremeAlgorithmRequestDTOS; + public List<ExaremeAlgorithmRequestParamDTO> convertToAlgorithmRequestParamDTOs(){ + List<ExaremeAlgorithmRequestParamDTO> exaremeAlgorithmRequestParamDTOS = new ArrayList<>(); + exaremeAlgorithmRequestParamDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("x")); + exaremeAlgorithmRequestParamDTOS.add(this.y.convertToExaremeAlgorithmRequestDTO("y")); + exaremeAlgorithmRequestParamDTOS.add(this.pathology.convertToExaremeAlgorithmRequestDTO("pathology")); + exaremeAlgorithmRequestParamDTOS.add(this.datasets.convertToExaremeAlgorithmRequestDTO("dataset")); + exaremeAlgorithmRequestParamDTOS.add(this.filter.convertToExaremeAlgorithmRequestDTO("filter")); + return exaremeAlgorithmRequestParamDTOS; } } @@ -137,28 +137,28 @@ public class MIPEngineAlgorithmDTO { @SerializedName("desc") private String desc; - public ExaremeAlgorithmRequestDTO convertToExaremeAlgorithmRequestDTO(String name) throws Exception { - ExaremeAlgorithmRequestDTO exaremeAlgorithmRequestDTO = new ExaremeAlgorithmRequestDTO(); - exaremeAlgorithmRequestDTO.setName(name); - exaremeAlgorithmRequestDTO.setDesc(this.desc); - exaremeAlgorithmRequestDTO.setValue(""); - exaremeAlgorithmRequestDTO.setValueNotBlank(this.notblank); - exaremeAlgorithmRequestDTO.setValueMultiple(this.multiple); + public ExaremeAlgorithmRequestParamDTO convertToExaremeAlgorithmRequestDTO(String name){ + ExaremeAlgorithmRequestParamDTO exaremeAlgorithmRequestParamDTO = new ExaremeAlgorithmRequestParamDTO(); + exaremeAlgorithmRequestParamDTO.setName(name); + exaremeAlgorithmRequestParamDTO.setDesc(this.desc); + exaremeAlgorithmRequestParamDTO.setValue(""); + exaremeAlgorithmRequestParamDTO.setValueNotBlank(this.notblank); + exaremeAlgorithmRequestParamDTO.setValueMultiple(this.multiple); String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; - exaremeAlgorithmRequestDTO.setLabel(Arrays.asList(hidden).contains(exaremeAlgorithmRequestDTO.getName()) ? exaremeAlgorithmRequestDTO.getName():this.label); + exaremeAlgorithmRequestParamDTO.setLabel(Arrays.asList(hidden).contains(exaremeAlgorithmRequestParamDTO.getName()) ? exaremeAlgorithmRequestParamDTO.getName():this.label); if(name.equals("dataset") || name.equals("filter") || name.equals("pathology")){ - exaremeAlgorithmRequestDTO.setValueType(this.types.get(0)); - exaremeAlgorithmRequestDTO.setType(exaremeAlgorithmRequestDTO.getName()); + exaremeAlgorithmRequestParamDTO.setValueType(this.types.get(0)); + exaremeAlgorithmRequestParamDTO.setType(exaremeAlgorithmRequestParamDTO.getName()); } else{ - exaremeAlgorithmRequestDTO.setType("column"); - exaremeAlgorithmRequestDTO.setColumnValuesSQLType(String.join(", ", this.types)); - exaremeAlgorithmRequestDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); + exaremeAlgorithmRequestParamDTO.setType("column"); + exaremeAlgorithmRequestParamDTO.setColumnValuesSQLType(String.join(", ", this.types)); + exaremeAlgorithmRequestParamDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); } - return exaremeAlgorithmRequestDTO; + return exaremeAlgorithmRequestParamDTO; } - private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { + private String getColumnValuesIsCategorical(List<String> stattypes){ if (stattypes.contains("nominal") && stattypes.contains("numerical")){ return ""; @@ -170,7 +170,7 @@ public class MIPEngineAlgorithmDTO { return "false"; } else{ - throw new Exception("Invalid stattypes"); + throw new InternalServerError("Invalid stattypes"); } } } @@ -182,19 +182,10 @@ public class MIPEngineAlgorithmDTO { exaremeAlgorithmDTO.setLabel(this.label); exaremeAlgorithmDTO.setDesc(this.desc); exaremeAlgorithmDTO.setType("mipengine"); - List<ExaremeAlgorithmRequestDTO> parameters = new ArrayList<>(); - try { - parameters.addAll(this.inputdata.convertToAlgorithmRequestDTOs()); - } catch (Exception e) { - e.printStackTrace(); - } + List<ExaremeAlgorithmRequestParamDTO> parameters = new ArrayList<>(this.inputdata.convertToAlgorithmRequestParamDTOs()); this.parameters.forEach((name, parameterDTO) -> { - try { - ExaremeAlgorithmRequestDTO parameter = parameterDTO.convertToexaremeAlgorithmRequestDTO(name); - parameters.add(parameter); - } catch (Exception e) { - e.printStackTrace(); - } + ExaremeAlgorithmRequestParamDTO parameter = parameterDTO.convertToexaremeAlgorithmRequestDTO(name); + parameters.add(parameter); }); exaremeAlgorithmDTO.setParameters(parameters); return exaremeAlgorithmDTO; diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java similarity index 96% rename from src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java rename to src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java index 46b7df898..ff8229e37 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineExperimentDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java @@ -10,7 +10,7 @@ import java.util.List; @Getter @Setter -public class MIPEngineExperimentDTO { +public class MIPEngineAlgorithmRequestDTO { @SerializedName("inputdata") private InputData inputdata; @SerializedName("parameters") diff --git a/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java b/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java index edc18117d..eae07531e 100644 --- a/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java +++ b/src/main/java/eu/hbp/mip/models/galaxy/WorkflowDTO.java @@ -3,7 +3,7 @@ package eu.hbp.mip.models.galaxy; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; import eu.hbp.mip.models.DTOs.ExaremeAlgorithmDTO; -import eu.hbp.mip.models.DTOs.ExaremeAlgorithmRequestDTO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmRequestParamDTO; import java.util.*; @@ -115,18 +115,18 @@ public class WorkflowDTO { exaremeAlgorithmDTO.setType("workflow"); // Transfer workflow parameters information - List<ExaremeAlgorithmRequestDTO> algorithmParams = new LinkedList<>(); + List<ExaremeAlgorithmRequestParamDTO> algorithmParams = new LinkedList<>(); Gson gson = new Gson(); for (Map.Entry<String, WorkflowInputDTO> workflowInput : getInputs().entrySet()) { // Convert the annotation to algorithm Parameter - ExaremeAlgorithmRequestDTO algorithmParam; + ExaremeAlgorithmRequestParamDTO algorithmParam; if (steps.get(workflowInput.getKey()).getAnnotation() != null) { algorithmParam = gson.fromJson(steps.get(workflowInput.getKey()).getAnnotation(), - ExaremeAlgorithmRequestDTO.class); + ExaremeAlgorithmRequestParamDTO.class); } else { // If annotation is not provided, auto-fill some information - algorithmParam = new ExaremeAlgorithmRequestDTO(); + algorithmParam = new ExaremeAlgorithmRequestParamDTO(); // When the constraints are not known, set the most relaxed constraints algorithmParam.setDesc(""); algorithmParam.setValue(""); diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index 587fc7e63..3c52503c2 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -395,7 +395,7 @@ public class ExperimentService { private String getDatasetFromExperimentParameters(ExperimentDTO experimentDTO, Logger logger) { String experimentDatasets = null; - for (ExaremeAlgorithmRequestDTO parameter : experimentDTO.getAlgorithm().getParameters()) { + for (ExaremeAlgorithmRequestParamDTO parameter : experimentDTO.getAlgorithm().getParameters()) { if (parameter.getLabel().equals("dataset")) { experimentDatasets = parameter.getValue(); break; @@ -531,14 +531,14 @@ public class ExperimentService { // Run with the appropriate engine if (algorithmType.equals("mipengine")) { - MIPEngineExperimentDTO mipEngineExperimentDTO = experimentDTO.getAlgorithm().convertToMIPEngineBody(); - String body = JsonConverters.convertObjectToJsonString(mipEngineExperimentDTO); + MIPEngineAlgorithmRequestDTO mipEngineAlgorithmRequestDTO = experimentDTO.getAlgorithm().convertToMIPEngineBody(); + String body = JsonConverters.convertObjectToJsonString(mipEngineAlgorithmRequestDTO); String url = mipengineAlgorithmsUrl + "/" + algorithmName.toLowerCase(); logger.LogUserAction("url: " + url + ", body: " + body); logger.LogUserAction("Algorithm runs on MIPEngine."); return runMIPEngineExperiment(url, body); } else { - List<ExaremeAlgorithmRequestDTO> algorithmParameters + List<ExaremeAlgorithmRequestParamDTO> algorithmParameters = experimentDTO.getAlgorithm().getParameters(); String body = gson.toJson(algorithmParameters); String url = queryExaremeUrl + "/" + algorithmName; @@ -636,7 +636,7 @@ public class ExperimentService { } finishExperiment(experimentDAO, logger); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Finished the experiment: " + experimentDAO.toString()); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Finished the experiment: " + experimentDAO); }).start(); experimentDTO = experimentDAO.convertToDTO(true); return experimentDTO; @@ -662,13 +662,13 @@ public class ExperimentService { String workflowId = experimentDTO.getAlgorithm().getName(); // Get the parameters - List<ExaremeAlgorithmRequestDTO> algorithmParameters + List<ExaremeAlgorithmRequestParamDTO> algorithmParameters = experimentDTO.getAlgorithm().getParameters(); // Convert the parameters to workflow parameters HashMap<String, String> algorithmParamsIncludingEmpty = new HashMap<>(); if (algorithmParameters != null) { - for (ExaremeAlgorithmRequestDTO param : algorithmParameters) { + for (ExaremeAlgorithmRequestParamDTO param : algorithmParameters) { algorithmParamsIncludingEmpty.put(param.getName(), param.getValue()); } } -- GitLab From 192daf69f3d4bd55f787f9e7f31697ae70f08ef9 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Fri, 9 Jul 2021 06:57:33 -0700 Subject: [PATCH 09/12] Accordingly named classes with proper prefix, seperated GalaxyService from main service, replaced @Setter @Getter with @Data, instead of converters created constructors for each class so its better organized, functions that were accessing database were moved to the according repository --- docker/README.md | 2 +- docker/config/application.tmpl | 2 +- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 8 +- .../eu/hbp/mip/controllers/ExperimentAPI.java | 2 + .../eu/hbp/mip/models/DAOs/ExperimentDAO.java | 29 +- .../java/eu/hbp/mip/models/DAOs/UserDAO.java | 8 +- .../mip/models/DTOs/ExaremeAlgorithmDTO.java | 76 +-- .../DTOs/ExaremeAlgorithmRequestParamDTO.java | 60 +- .../DTOs/ExaremeAlgorithmResultDTO.java | 6 +- .../eu/hbp/mip/models/DTOs/ExperimentDTO.java | 29 +- .../models/DTOs/MIPEngineAlgorithmDTO.java | 122 +--- .../DTOs/MIPEngineAlgorithmRequestDTO.java | 70 ++- .../DTOs/MIPEngineAlgorithmResultDTO.java | 15 +- .../MIPEngineTabularVisualizationDTO.java | 27 - .../eu/hbp/mip/models/DTOs/PathologyDTO.java | 15 +- .../repositories/ExperimentRepository.java | 95 +++ .../hbp/mip/services/ExperimentService.java | 540 +----------------- .../eu/hbp/mip/services/GalaxyService.java | 454 +++++++++++++++ src/main/resources/application.yml | 2 +- 19 files changed, 779 insertions(+), 783 deletions(-) delete mode 100644 src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java create mode 100644 src/main/java/eu/hbp/mip/services/GalaxyService.java diff --git a/docker/README.md b/docker/README.md index 36a3e1245..8693aad09 100644 --- a/docker/README.md +++ b/docker/README.md @@ -24,7 +24,7 @@ To use this image, you need a running instance of PostgreSQL and to configure th ### EXTERNAL SERVICES ### -* MIPENGINE_URL: URL to MIPENGINE server. Default is "http://192.168.124.129:5000" . +* MIPENGINE_URL: URL to MIPENGINE server. Default is "http://localhost:5000" . * EXAREME_URL: URL to Exareme server. Default is "http://localhost:9090" . diff --git a/docker/config/application.tmpl b/docker/config/application.tmpl index 6059a902b..a8bfdf9ff 100644 --- a/docker/config/application.tmpl +++ b/docker/config/application.tmpl @@ -35,7 +35,7 @@ spring: ### EXTERNAL SERVICES ### services: mipengine: - algorithmsUrl: {{ default .Env.MIPENGINE_URL "http://192.168.124.129:5000" }}/algorithms + algorithmsUrl: {{ .Env.MIPENGINE_URL}}/algorithms exareme: queryExaremeUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/query diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index aea67b056..5ac49a402 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -76,17 +76,17 @@ public class AlgorithmsAPI { logger.LogUserAction("Loaded " + galaxyAlgorithms.size() + " galaxy algorithms"); ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); - if (!exaremeAlgorithms.isEmpty()) { + if (exaremeAlgorithms != null) { algorithms.addAll(exaremeAlgorithms); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } - if (!mipengineAlgorithms.isEmpty()) { + if (mipengineAlgorithms != null) { algorithms.addAll(mipengineAlgorithms); } else { logger.LogUserAction("Getting mipengine algorithms failed and returned null"); } - if (!galaxyAlgorithms.isEmpty()) { + if (galaxyAlgorithms != null) { algorithms.addAll(galaxyAlgorithms); } else { logger.LogUserAction("Getting galaxy workflows failed and returned null"); @@ -159,7 +159,7 @@ public class AlgorithmsAPI { } ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); - mipEngineAlgorithms.forEach(mipEngineAlgorithm -> algorithms.add(mipEngineAlgorithm.convertToAlgorithmDTO())); + mipEngineAlgorithms.forEach(mipEngineAlgorithm -> algorithms.add(new ExaremeAlgorithmDTO(mipEngineAlgorithm))); logger.LogUserAction("Completed, returned " + algorithms.size() + " algorithms."); return algorithms; diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java b/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java index e5d0b04c5..449765fc9 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java @@ -78,6 +78,7 @@ public class ExperimentAPI { @ApiOperation(value = "Create an experiment", response = ExperimentDTO.class) @RequestMapping(method = RequestMethod.POST) public ResponseEntity<String> createExperiment(Authentication authentication, @RequestBody ExperimentDTO experimentDTO) { + new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments").LogUserAction("TEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEST"); experimentDTO = experimentService.createExperiment(authentication, experimentDTO, new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments")); return new ResponseEntity<>(JsonConverters.convertObjectToJsonString(experimentDTO), HttpStatus.CREATED); } @@ -103,6 +104,7 @@ public class ExperimentAPI { @ApiOperation(value = "Create a transient experiment", response = ExperimentDTO.class) @RequestMapping(value = "/transient", method = RequestMethod.POST) public ResponseEntity<String> createTransientExperiment(Authentication authentication, @RequestBody ExperimentDTO experimentDTO) { + new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments").LogUserAction("TEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEST"); experimentDTO = experimentService.createTransientExperiment(authentication, experimentDTO, new Logger(activeUserService.getActiveUser().getUsername(), "(POST) /experiments/transient")); return new ResponseEntity<>(JsonConverters.convertObjectToJsonString(experimentDTO), HttpStatus.OK); } diff --git a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java index 4e206fae0..8eb343c9c 100644 --- a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java +++ b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java @@ -3,12 +3,9 @@ package eu.hbp.mip.models.DAOs; import com.fasterxml.jackson.annotation.JsonInclude; import com.google.gson.Gson; import com.google.gson.annotations.Expose; -import eu.hbp.mip.models.DTOs.ExaremeAlgorithmDTO; -import eu.hbp.mip.models.DTOs.ExperimentDTO; -import eu.hbp.mip.utils.JsonConverters; import io.swagger.annotations.ApiModel; -import lombok.Getter; -import lombok.Setter; +import lombok.AllArgsConstructor; +import lombok.Data; import javax.persistence.*; import java.util.*; @@ -17,8 +14,8 @@ import java.util.*; * Created by habfast on 21/04/16. */ @Entity -@Getter -@Setter +@Data +@AllArgsConstructor @Table(name = "`experiment`") @ApiModel @JsonInclude(JsonInclude.Include.NON_NULL) @@ -95,22 +92,4 @@ public class ExperimentDAO { */ } - public ExperimentDTO convertToDTO(boolean includeResult) - { - ExperimentDTO experimentDTO = new ExperimentDTO(); - experimentDTO.setAlgorithm(JsonConverters.convertJsonStringToObject(this.algorithm, ExaremeAlgorithmDTO.class)); - experimentDTO.setCreated(this.created); - experimentDTO.setUpdated(this.updated); - experimentDTO.setFinished(this.finished); - experimentDTO.setCreatedBy(this.createdBy.getUsername()); - experimentDTO.setName(this.name); - if(includeResult){ - experimentDTO.setResult(JsonConverters.convertJsonStringToObject(String.valueOf(this.result), new ArrayList<>().getClass())); - } - experimentDTO.setStatus(this.status); - experimentDTO.setShared(this.shared); - experimentDTO.setUuid(this.uuid); - experimentDTO.setViewed(this.viewed); - return experimentDTO; - } } diff --git a/src/main/java/eu/hbp/mip/models/DAOs/UserDAO.java b/src/main/java/eu/hbp/mip/models/DAOs/UserDAO.java index 9279b3793..3bb43f3ee 100644 --- a/src/main/java/eu/hbp/mip/models/DAOs/UserDAO.java +++ b/src/main/java/eu/hbp/mip/models/DAOs/UserDAO.java @@ -7,16 +7,16 @@ package eu.hbp.mip.models.DAOs; import com.fasterxml.jackson.annotation.JsonInclude; import com.google.gson.annotations.Expose; import io.swagger.annotations.ApiModel; -import lombok.Getter; -import lombok.Setter; +import lombok.AllArgsConstructor; +import lombok.Data; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity -@Getter -@Setter +@Data +@AllArgsConstructor @Table(name = "`user`") @ApiModel @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java index 887733de8..584ffd424 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmDTO.java @@ -1,15 +1,13 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; -import eu.hbp.mip.utils.JsonConverters; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import java.util.*; -@Getter -@Setter +@Data +@AllArgsConstructor public class ExaremeAlgorithmDTO { @SerializedName("name") @@ -27,9 +25,30 @@ public class ExaremeAlgorithmDTO { @SerializedName("parameters") private List<ExaremeAlgorithmRequestParamDTO> parameters; + public ExaremeAlgorithmDTO() + { + + } - @Getter - @Setter + public ExaremeAlgorithmDTO(MIPEngineAlgorithmDTO mipEngineAlgorithm ) + { + this.name = mipEngineAlgorithm.getName().toUpperCase(); + this.label = mipEngineAlgorithm.getLabel(); + this.desc = mipEngineAlgorithm.getDesc(); + this.type = "mipengine"; + List<ExaremeAlgorithmRequestParamDTO> parameters = new ArrayList<>(); + parameters.add(new ExaremeAlgorithmRequestParamDTO("x", mipEngineAlgorithm.getInputdata().getX())); + parameters.add(new ExaremeAlgorithmRequestParamDTO("y", mipEngineAlgorithm.getInputdata().getY())); + parameters.add(new ExaremeAlgorithmRequestParamDTO("pathology", mipEngineAlgorithm.getInputdata().getPathology())); + parameters.add(new ExaremeAlgorithmRequestParamDTO("dataset", mipEngineAlgorithm.getInputdata().getDatasets())); + parameters.add(new ExaremeAlgorithmRequestParamDTO("filter", mipEngineAlgorithm.getInputdata().getFilter())); + mipEngineAlgorithm.getParameters().forEach((name, parameterDTO) -> { + ExaremeAlgorithmRequestParamDTO parameter = new ExaremeAlgorithmRequestParamDTO(name, parameterDTO); + parameters.add(parameter); + }); + this.setParameters(parameters); + } + @Data @AllArgsConstructor static class Rule { @@ -45,47 +64,4 @@ public class ExaremeAlgorithmDTO { @SerializedName("value") private Object value; } - public MIPEngineAlgorithmRequestDTO convertToMIPEngineBody() - { - MIPEngineAlgorithmRequestDTO mipEngineAlgorithmRequestDTO = new MIPEngineAlgorithmRequestDTO(); - MIPEngineAlgorithmRequestDTO.InputData inputData = new MIPEngineAlgorithmRequestDTO.InputData(); - HashMap<String, Object> mipEngineParameters = new HashMap<>(); - - List<Object> rules = new ArrayList<>(); - this.parameters.forEach(parameter -> { - - switch (parameter.getName()) { - case "x": - List<String> x = Arrays.asList(parameter.getValue().split(",")); - x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setX(x); - break; - case "y": - List<String> y = Arrays.asList(parameter.getValue().split(",")); - y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); - inputData.setY(y); - break; - case "dataset": - List<String> datasets = Arrays.asList(parameter.getValue().split(",")); - rules.add(new Rule("dataset", "string", "in", datasets)); - inputData.setDatasets(datasets); - break; - case "pathology": - inputData.setPathology(parameter.getValue()); - break; - case "filter": - if (!parameter.getValue().equals("")) - rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), MIPEngineAlgorithmRequestDTO.Filter.class)); - break; - default: - mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); - break; - } - }); - MIPEngineAlgorithmRequestDTO.Filter filter = new MIPEngineAlgorithmRequestDTO.Filter("AND", rules, true); - inputData.setFilters(filter); - mipEngineAlgorithmRequestDTO.setInputdata(inputData); - mipEngineAlgorithmRequestDTO.setParameters(mipEngineParameters); - return mipEngineAlgorithmRequestDTO; - } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java index 6f7d21655..4109c5e59 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmRequestParamDTO.java @@ -1,14 +1,16 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; -import lombok.Getter; -import lombok.Setter; +import eu.hbp.mip.utils.Exceptions.InternalServerError; +import lombok.AllArgsConstructor; +import lombok.Data; +import java.util.Arrays; import java.util.List; //The request of an exareme algorithm is a list of ExaremeAlgorithmRequestParamDTOs. -@Getter -@Setter +@Data +@AllArgsConstructor public class ExaremeAlgorithmRequestParamDTO { @SerializedName("name") private String name; @@ -51,4 +53,54 @@ public class ExaremeAlgorithmRequestParamDTO { @SerializedName("valueEnumerations") private List<String> valueEnumerations; + public ExaremeAlgorithmRequestParamDTO (){} + + public ExaremeAlgorithmRequestParamDTO (String name, MIPEngineAlgorithmDTO.MIPEngineAlgorithmParameterDTO parameter){ + this.name = name; + this.desc = parameter.getDesc(); + this.valueType = parameter.getType(); + this.type = "other"; + this.defaultValue = parameter.getDefault_value(); + this.valueNotBlank = parameter.getNotblank(); + this.label = parameter.getLabel(); + this.valueEnumerations = parameter.getEnums(); + this.valueMultiple = parameter.getMultiple(); + this.valueMax = parameter.getMin(); + this.valueMin = parameter.getMax(); + } + + public ExaremeAlgorithmRequestParamDTO (String name, MIPEngineAlgorithmDTO.MIPEngineAlgorithmInputDataDetailDTO inputDataDetail){ + this.name = name; + this.desc = inputDataDetail.getDesc(); + this.value = ""; + this.valueNotBlank = inputDataDetail.getNotblank(); + this.valueMultiple = inputDataDetail.getMultiple(); + String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; + this.label = (Arrays.asList(hidden).contains(this.name) ? this.name : inputDataDetail.getLabel()); + if(name.equals("dataset") || name.equals("filter") || name.equals("pathology")){ + this.valueType = inputDataDetail.getTypes().get(0); + this.type = this.name; + } + else{ + this.type = "column"; + this.columnValuesSQLType = String.join(", ", inputDataDetail.getTypes()); + this.columnValuesIsCategorical = getColumnValuesIsCategorical(inputDataDetail.getStattypes()); + } + } + + private String getColumnValuesIsCategorical(List<String> stattypes){ + + if (stattypes.contains("nominal") && stattypes.contains("numerical")){ + return ""; + } + else if (stattypes.contains("nominal")){ + return "true"; + } + else if (stattypes.contains("numerical")){ + return "false"; + } + else{ + throw new InternalServerError("Invalid stattypes"); + } + } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java index ca556bb73..d1f5947c8 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java @@ -1,13 +1,11 @@ package eu.hbp.mip.models.DTOs; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import java.util.List; -@Getter -@Setter +@Data @AllArgsConstructor public class ExaremeAlgorithmResultDTO { private int code; diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java index 765c20144..0dd28c1d6 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java @@ -2,15 +2,17 @@ package eu.hbp.mip.models.DTOs; import com.fasterxml.jackson.annotation.JsonInclude; import eu.hbp.mip.models.DAOs.ExperimentDAO; -import lombok.Getter; -import lombok.Setter; +import eu.hbp.mip.utils.JsonConverters; +import lombok.AllArgsConstructor; +import lombok.Data; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; -@Getter -@Setter +@Data +@AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) public class ExperimentDTO { @@ -30,4 +32,23 @@ public class ExperimentDTO { private ExperimentDAO.Status status; private ExaremeAlgorithmDTO algorithm; + public ExperimentDTO(){ + + } + public ExperimentDTO(boolean includeResult, ExperimentDAO experimentDAO) + { + this.algorithm = JsonConverters.convertJsonStringToObject(experimentDAO.getAlgorithm(), ExaremeAlgorithmDTO.class); + this.created = experimentDAO.getCreated(); + this.updated = experimentDAO.getUpdated(); + this.finished = experimentDAO.getFinished(); + this.createdBy = experimentDAO.getCreatedBy().getUsername(); + this.name = experimentDAO.getName(); + if(includeResult){ + this.result = JsonConverters.convertJsonStringToObject(String.valueOf(experimentDAO.getResult()), new ArrayList<>().getClass()); + } + this.status = experimentDAO.getStatus(); + this.uuid = experimentDAO.getUuid(); + this.shared = experimentDAO.isShared(); + this.viewed = experimentDAO.isViewed(); + } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index 98677991e..5edfbfe77 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -1,17 +1,14 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; -import eu.hbp.mip.utils.Exceptions.InternalServerError; -import lombok.Getter; -import lombok.Setter; +import lombok.AllArgsConstructor; +import lombok.Data; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Hashtable; import java.util.List; -@Getter -@Setter +@Data +@AllArgsConstructor public class MIPEngineAlgorithmDTO { @SerializedName("name") @@ -27,17 +24,17 @@ public class MIPEngineAlgorithmDTO { private String type; @SerializedName("parameters") - private Hashtable<String, ParameterDTO> parameters; + private Hashtable<String, MIPEngineAlgorithmParameterDTO> parameters; @SerializedName("crossvalidation") private String crossvalidation; @SerializedName("inputdata") - private InputdataDTO inputdata; + private MIPEngineAlgorithmInputdataDTO inputdata; - @Getter - @Setter - public static class ParameterDTO { + @Data + @AllArgsConstructor + public static class MIPEngineAlgorithmParameterDTO { @SerializedName("label") private String label; @@ -65,56 +62,30 @@ public class MIPEngineAlgorithmDTO { @SerializedName("enums") private List<String> enums; - - public ExaremeAlgorithmRequestParamDTO convertToexaremeAlgorithmRequestDTO(String name){ - ExaremeAlgorithmRequestParamDTO exaremeAlgorithmRequestParamDTO = new ExaremeAlgorithmRequestParamDTO(); - exaremeAlgorithmRequestParamDTO.setName(name); - exaremeAlgorithmRequestParamDTO.setDesc(this.desc); - exaremeAlgorithmRequestParamDTO.setValueType(this.type); - exaremeAlgorithmRequestParamDTO.setType("other"); - exaremeAlgorithmRequestParamDTO.setDefaultValue(this.default_value); - exaremeAlgorithmRequestParamDTO.setValueNotBlank(this.notblank); - exaremeAlgorithmRequestParamDTO.setLabel(this.label); - exaremeAlgorithmRequestParamDTO.setValueEnumerations(this.enums); - exaremeAlgorithmRequestParamDTO.setValueMultiple(this.multiple); - exaremeAlgorithmRequestParamDTO.setValueMin(this.min); - exaremeAlgorithmRequestParamDTO.setValueMax(this.max); - return exaremeAlgorithmRequestParamDTO; - } } - @Getter - @Setter - public static class InputdataDTO { + @Data + @AllArgsConstructor + public static class MIPEngineAlgorithmInputdataDTO { @SerializedName("x") - private InputDataDetailDTO x; + private MIPEngineAlgorithmInputDataDetailDTO x; @SerializedName("y") - private InputDataDetailDTO y; + private MIPEngineAlgorithmInputDataDetailDTO y; @SerializedName("pathology") - private InputDataDetailDTO pathology; + private MIPEngineAlgorithmInputDataDetailDTO pathology; @SerializedName("datasets") - private InputDataDetailDTO datasets; + private MIPEngineAlgorithmInputDataDetailDTO datasets; @SerializedName("filter") - private InputDataDetailDTO filter; - - public List<ExaremeAlgorithmRequestParamDTO> convertToAlgorithmRequestParamDTOs(){ - List<ExaremeAlgorithmRequestParamDTO> exaremeAlgorithmRequestParamDTOS = new ArrayList<>(); - exaremeAlgorithmRequestParamDTOS.add(this.x.convertToExaremeAlgorithmRequestDTO("x")); - exaremeAlgorithmRequestParamDTOS.add(this.y.convertToExaremeAlgorithmRequestDTO("y")); - exaremeAlgorithmRequestParamDTOS.add(this.pathology.convertToExaremeAlgorithmRequestDTO("pathology")); - exaremeAlgorithmRequestParamDTOS.add(this.datasets.convertToExaremeAlgorithmRequestDTO("dataset")); - exaremeAlgorithmRequestParamDTOS.add(this.filter.convertToExaremeAlgorithmRequestDTO("filter")); - return exaremeAlgorithmRequestParamDTOS; - } + private MIPEngineAlgorithmInputDataDetailDTO filter; } - @Getter - @Setter - public static class InputDataDetailDTO { + @Data + @AllArgsConstructor + public static class MIPEngineAlgorithmInputDataDetailDTO { @SerializedName("stattypes") private List<String> stattypes; @@ -136,58 +107,5 @@ public class MIPEngineAlgorithmDTO { @SerializedName("desc") private String desc; - - public ExaremeAlgorithmRequestParamDTO convertToExaremeAlgorithmRequestDTO(String name){ - ExaremeAlgorithmRequestParamDTO exaremeAlgorithmRequestParamDTO = new ExaremeAlgorithmRequestParamDTO(); - exaremeAlgorithmRequestParamDTO.setName(name); - exaremeAlgorithmRequestParamDTO.setDesc(this.desc); - exaremeAlgorithmRequestParamDTO.setValue(""); - exaremeAlgorithmRequestParamDTO.setValueNotBlank(this.notblank); - exaremeAlgorithmRequestParamDTO.setValueMultiple(this.multiple); - String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; - exaremeAlgorithmRequestParamDTO.setLabel(Arrays.asList(hidden).contains(exaremeAlgorithmRequestParamDTO.getName()) ? exaremeAlgorithmRequestParamDTO.getName():this.label); - if(name.equals("dataset") || name.equals("filter") || name.equals("pathology")){ - exaremeAlgorithmRequestParamDTO.setValueType(this.types.get(0)); - exaremeAlgorithmRequestParamDTO.setType(exaremeAlgorithmRequestParamDTO.getName()); - } - else{ - exaremeAlgorithmRequestParamDTO.setType("column"); - exaremeAlgorithmRequestParamDTO.setColumnValuesSQLType(String.join(", ", this.types)); - exaremeAlgorithmRequestParamDTO.setColumnValuesIsCategorical(getColumnValuesIsCategorical(this.stattypes)); - } - return exaremeAlgorithmRequestParamDTO; - } - - private String getColumnValuesIsCategorical(List<String> stattypes){ - - if (stattypes.contains("nominal") && stattypes.contains("numerical")){ - return ""; - } - else if (stattypes.contains("nominal")){ - return "true"; - } - else if (stattypes.contains("numerical")){ - return "false"; - } - else{ - throw new InternalServerError("Invalid stattypes"); - } - } - } - - public ExaremeAlgorithmDTO convertToAlgorithmDTO() - { - ExaremeAlgorithmDTO exaremeAlgorithmDTO = new ExaremeAlgorithmDTO(); - exaremeAlgorithmDTO.setName(this.name.toUpperCase()); - exaremeAlgorithmDTO.setLabel(this.label); - exaremeAlgorithmDTO.setDesc(this.desc); - exaremeAlgorithmDTO.setType("mipengine"); - List<ExaremeAlgorithmRequestParamDTO> parameters = new ArrayList<>(this.inputdata.convertToAlgorithmRequestParamDTOs()); - this.parameters.forEach((name, parameterDTO) -> { - ExaremeAlgorithmRequestParamDTO parameter = parameterDTO.convertToexaremeAlgorithmRequestDTO(name); - parameters.add(parameter); - }); - exaremeAlgorithmDTO.setParameters(parameters); - return exaremeAlgorithmDTO; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java index ff8229e37..a5604f2e7 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmRequestDTO.java @@ -1,23 +1,68 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; +import eu.hbp.mip.utils.JsonConverters; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; -import java.util.Hashtable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; -@Getter -@Setter +@Data +@AllArgsConstructor public class MIPEngineAlgorithmRequestDTO { @SerializedName("inputdata") private InputData inputdata; @SerializedName("parameters") - private Hashtable<String, Object> parameters; + private HashMap<String, Object> parameters; - @Getter - @Setter + public MIPEngineAlgorithmRequestDTO(List<ExaremeAlgorithmRequestParamDTO> exaremeAlgorithmRequestParamDTOs) + { + MIPEngineAlgorithmRequestDTO.InputData inputData = new MIPEngineAlgorithmRequestDTO.InputData(); + HashMap<String, Object> mipEngineParameters = new HashMap<>(); + + List<Object> rules = new ArrayList<>(); + exaremeAlgorithmRequestParamDTOs.forEach(parameter -> { + + switch (parameter.getName()) { + case "x": + List<String> x = Arrays.asList(parameter.getValue().split(",")); + x.forEach(column -> rules.add(new ExaremeAlgorithmDTO.Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setX(x); + break; + case "y": + List<String> y = Arrays.asList(parameter.getValue().split(",")); + y.forEach(column -> rules.add(new ExaremeAlgorithmDTO.Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); + inputData.setY(y); + break; + case "dataset": + List<String> datasets = Arrays.asList(parameter.getValue().split(",")); + rules.add(new ExaremeAlgorithmDTO.Rule("dataset", "string", "in", datasets)); + inputData.setDatasets(datasets); + break; + case "pathology": + inputData.setPathology(parameter.getValue()); + break; + case "filter": + if (!parameter.getValue().equals("")) + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), MIPEngineAlgorithmRequestDTO.Filter.class)); + break; + default: + mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); + break; + } + }); + MIPEngineAlgorithmRequestDTO.Filter filter = new MIPEngineAlgorithmRequestDTO.Filter("AND", rules); + inputData.setFilters(filter); + this.inputdata = inputData; + this.parameters = mipEngineParameters; + } + + + @Data + @AllArgsConstructor public static class InputData { @SerializedName("pathology") private String pathology; @@ -29,10 +74,12 @@ public class MIPEngineAlgorithmRequestDTO { private List<String> x; @SerializedName("y") private List<String> y; + public InputData(){ + + } } - @Getter - @Setter + @Data @AllArgsConstructor public static class Filter { @@ -41,8 +88,5 @@ public class MIPEngineAlgorithmRequestDTO { @SerializedName("rules") private List<Object> rules; - - @SerializedName("valid") - private boolean valid; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java index 087adb1f8..4491ddb44 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmResultDTO.java @@ -1,23 +1,14 @@ package eu.hbp.mip.models.DTOs; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; -import java.util.HashMap; import java.util.List; -@Getter -@Setter +@Data @AllArgsConstructor public class MIPEngineAlgorithmResultDTO { private final String title; - private final List<MIPEngineTabularVisualizationDTO.Field> columns; + private final List<TabularVisualizationDTO.Field> columns; private final List<List<Object>> data; - - public MIPEngineTabularVisualizationDTO convertToVisualization() { - HashMap<String, List<MIPEngineTabularVisualizationDTO.Field>> schema = new HashMap<>(); - schema.put("fields", columns); - return new MIPEngineTabularVisualizationDTO(this.title, "tabular-data-resource", schema, this.data); - } } \ No newline at end of file diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java deleted file mode 100644 index 7be3fad33..000000000 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineTabularVisualizationDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package eu.hbp.mip.models.DTOs; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -import java.util.HashMap; -import java.util.List; - -@Getter -@Setter -@AllArgsConstructor -public class MIPEngineTabularVisualizationDTO { - private final String name; - private final String profile; - private final HashMap<String, List<Field>> schema; - private final List<List<Object>> data; - - @Getter - @Setter - @AllArgsConstructor - public static class Field { - private final String name; - private final String type; - } -} - diff --git a/src/main/java/eu/hbp/mip/models/DTOs/PathologyDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/PathologyDTO.java index aa78ef8b0..ecc5b723b 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/PathologyDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/PathologyDTO.java @@ -1,13 +1,13 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; -import lombok.Getter; -import lombok.Setter; +import lombok.AllArgsConstructor; +import lombok.Data; import java.util.List; -@Getter -@Setter +@Data +@AllArgsConstructor public class PathologyDTO { @SerializedName("code") @@ -22,8 +22,11 @@ public class PathologyDTO { @SerializedName("datasets") private List<PathologyDatasetDTO> datasets; - @Getter - @Setter + public PathologyDTO(){ + + } + @Data + @AllArgsConstructor public static class PathologyDatasetDTO { @SerializedName("code") private String code; diff --git a/src/main/java/eu/hbp/mip/repositories/ExperimentRepository.java b/src/main/java/eu/hbp/mip/repositories/ExperimentRepository.java index 9ac54cada..b776b6c46 100644 --- a/src/main/java/eu/hbp/mip/repositories/ExperimentRepository.java +++ b/src/main/java/eu/hbp/mip/repositories/ExperimentRepository.java @@ -1,9 +1,17 @@ package eu.hbp.mip.repositories; import eu.hbp.mip.models.DAOs.ExperimentDAO; +import eu.hbp.mip.models.DAOs.UserDAO; +import eu.hbp.mip.models.DTOs.ExperimentDTO; +import eu.hbp.mip.utils.Exceptions.BadRequestException; +import eu.hbp.mip.utils.Exceptions.ExperimentNotFoundException; +import eu.hbp.mip.utils.Exceptions.InternalServerError; +import eu.hbp.mip.utils.JsonConverters; +import eu.hbp.mip.utils.Logger; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; +import java.util.Date; import java.util.Optional; import java.util.UUID; @@ -14,4 +22,91 @@ import java.util.UUID; public interface ExperimentRepository extends CrudRepository<ExperimentDAO, UUID>, JpaSpecificationExecutor<ExperimentDAO> { ExperimentDAO findByUuid(UUID experimentUuid); + + /** + * The loadExperiment access the database and load the information of a specific experiment + * + * @param uuid is the id of the experiment to be retrieved + * @return the experiment information that was retrieved from database + */ + default ExperimentDAO loadExperiment(String uuid, Logger logger) { + UUID experimentUuid; + ExperimentDAO experimentDAO; + + try { + experimentUuid = UUID.fromString(uuid); + } catch (Exception e) { + logger.LogUserAction( e.getMessage()); + throw new BadRequestException(e.getMessage()); + } + + experimentDAO = findByUuid(experimentUuid); + if (experimentDAO == null) { + logger.LogUserAction( "Experiment with uuid : " + uuid + "was not found."); + throw new ExperimentNotFoundException("Experiment with uuid : " + uuid + " was not found."); + } + + return experimentDAO; + } + + /** + * The createExperimentInTheDatabase will insert a new experiment in the database according to the given experiment information + * + * @param experimentDTO is the experiment information to inserted in the database + * @return the experiment information that was inserted into the database + * @Note In the database there will be stored Algorithm Details that is the whole information about the algorithm + * and an Algorithm column that is required for the filtering with algorithm name in the GET /experiments. + */ + default ExperimentDAO createExperimentInTheDatabase(ExperimentDTO experimentDTO, UserDAO user, Logger logger) { + + ExperimentDAO experimentDAO = new ExperimentDAO(); + experimentDAO.setUuid(UUID.randomUUID()); + experimentDAO.setCreatedBy(user); + experimentDAO.setAlgorithm(JsonConverters.convertObjectToJsonString(experimentDTO.getAlgorithm())); + experimentDAO.setAlgorithmId(experimentDTO.getAlgorithm().getName()); + experimentDAO.setName(experimentDTO.getName()); + experimentDAO.setStatus(ExperimentDAO.Status.pending); + + try { + save(experimentDAO); + } catch (Exception e) { + logger.LogUserAction("Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); + throw new InternalServerError(e.getMessage()); + } + + logger.LogUserAction(" id : " + experimentDAO.getUuid()); + logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); + logger.LogUserAction(" name : " + experimentDAO.getName()); + return experimentDAO; + } + + default void saveExperiment(ExperimentDAO experimentDAO, Logger logger) { + + logger.LogUserAction(" id : " + experimentDAO.getUuid()); + logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); + logger.LogUserAction(" name : " + experimentDAO.getName()); + logger.LogUserAction(" historyId : " + experimentDAO.getWorkflowHistoryId()); + logger.LogUserAction(" status : " + experimentDAO.getStatus()); + + try { + save(experimentDAO); + } catch (Exception e) { + logger.LogUserAction("Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); + throw new InternalServerError(e.getMessage()); + } + + logger.LogUserAction("Saved experiment"); + } + + default void finishExperiment(ExperimentDAO experimentDAO, Logger logger) { + experimentDAO.setFinished(new Date()); + + try { + save(experimentDAO); + } catch (Exception e) { + logger.LogUserAction( "Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); + throw new InternalServerError(e.getMessage()); + } + } + } diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index 3c52503c2..c421fd471 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -1,23 +1,10 @@ package eu.hbp.mip.services; -import com.github.jmchilton.blend4j.galaxy.GalaxyInstance; -import com.github.jmchilton.blend4j.galaxy.GalaxyInstanceFactory; -import com.github.jmchilton.blend4j.galaxy.WorkflowsClient; -import com.github.jmchilton.blend4j.galaxy.beans.Workflow; -import com.github.jmchilton.blend4j.galaxy.beans.WorkflowDetails; -import com.github.jmchilton.blend4j.galaxy.beans.WorkflowInputDefinition; import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.internal.LinkedTreeMap; -import eu.hbp.mip.controllers.galaxy.retrofit.RetroFitGalaxyClients; -import eu.hbp.mip.controllers.galaxy.retrofit.RetrofitClientInstance; import eu.hbp.mip.models.DAOs.ExperimentDAO; import eu.hbp.mip.models.DAOs.UserDAO; import eu.hbp.mip.models.DTOs.*; -import eu.hbp.mip.models.galaxy.GalaxyWorkflowResult; -import eu.hbp.mip.models.galaxy.PostWorkflowToGalaxyDtoResponse; import eu.hbp.mip.repositories.ExperimentRepository; import eu.hbp.mip.services.Specifications.ExperimentSpecifications; import eu.hbp.mip.utils.ClaimUtils; @@ -25,8 +12,6 @@ import eu.hbp.mip.utils.Exceptions.*; import eu.hbp.mip.utils.HTTPUtil; import eu.hbp.mip.utils.JsonConverters; import eu.hbp.mip.utils.Logger; -import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -34,13 +19,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; -import retrofit2.Call; -import retrofit2.Response; - -import java.io.IOException; import java.util.*; -import static java.lang.Thread.sleep; @Service public class ExperimentService { @@ -52,22 +32,18 @@ public class ExperimentService { @Value("#{'${services.mipengine.algorithmsUrl}'}") private String mipengineAlgorithmsUrl; - @Value("#{'${services.galaxy.galaxyUrl}'}") - private String galaxyUrl; - - @Value("#{'${services.galaxy.galaxyApiKey}'}") - private String galaxyApiKey; - @Value("#{'${authentication.enabled}'}") private boolean authenticationIsEnabled; private static final Gson gson = new Gson(); private final ActiveUserService activeUserService; + private final GalaxyService galaxyService; private final ExperimentRepository experimentRepository; - public ExperimentService(ActiveUserService activeUserService, ExperimentRepository experimentRepository) { + public ExperimentService(ActiveUserService activeUserService, GalaxyService galaxyService, ExperimentRepository experimentRepository) { this.activeUserService = activeUserService; + this.galaxyService = galaxyService; this.experimentRepository = experimentRepository; } @@ -121,7 +97,7 @@ public class ExperimentService { throw new NoContent("No experiment found with the filters provided."); List<ExperimentDTO> experimentDTOs = new ArrayList<>(); - experimentDAOs.forEach(experimentDAO -> experimentDTOs.add(experimentDAO.convertToDTO(false))); + experimentDAOs.forEach(experimentDAO -> experimentDTOs.add(new ExperimentDTO(false, experimentDAO))); Map<String, Object> response = new HashMap<>(); response.put("experiments", experimentDTOs); @@ -146,7 +122,7 @@ public class ExperimentService { logger.LogUserAction("Loading Experiment with uuid : " + uuid); - experimentDAO = loadExperiment(uuid, logger); + experimentDAO = experimentRepository.loadExperiment(uuid, logger); if ( !experimentDAO.isShared() && !experimentDAO.getCreatedBy().getUsername().equals(user.getUsername()) @@ -156,7 +132,7 @@ public class ExperimentService { logger.LogUserAction("Accessing Experiment is unauthorized."); throw new UnauthorizedException("You don't have access to the experiment."); } - ExperimentDTO experimentDTO = experimentDAO.convertToDTO(true); + ExperimentDTO experimentDTO = new ExperimentDTO(true, experimentDAO); logger.LogUserAction("Experiment was Loaded with uuid : " + uuid + "."); return experimentDTO; @@ -193,7 +169,7 @@ public class ExperimentService { // Run with the appropriate engine if (algorithmType.equals("workflow")) { logger.LogUserAction("Algorithm runs on Galaxy."); - return runGalaxyWorkflow(experimentDTO, logger); + return galaxyService.runGalaxyWorkflow(experimentDTO, logger); } else { logger.LogUserAction("Algorithm runs on Exareme."); return createExperiment(experimentDTO, logger); @@ -253,7 +229,7 @@ public class ExperimentService { UserDAO user = activeUserService.getActiveUser(); logger.LogUserAction("Updating experiment with uuid : " + uuid + "."); - experimentDAO = loadExperiment(uuid, logger); + experimentDAO = experimentRepository.loadExperiment(uuid, logger); //Verify (PATCH) /experiments non editable fields. verifyPatchExperimentNonEditableFields(experimentDTO, logger); @@ -281,7 +257,7 @@ public class ExperimentService { logger.LogUserAction("Updated experiment with uuid : " + uuid + "."); - experimentDTO = experimentDAO.convertToDTO(true); + experimentDTO = new ExperimentDTO(true, experimentDAO); return experimentDTO; } @@ -296,7 +272,7 @@ public class ExperimentService { UserDAO user = activeUserService.getActiveUser(); logger.LogUserAction("Deleting experiment with uuid : " + uuid + "."); - experimentDAO = loadExperiment(uuid, logger); + experimentDAO = experimentRepository.loadExperiment(uuid, logger); if (!experimentDAO.getCreatedBy().getUsername().equals(user.getUsername())) throw new UnauthorizedException("You don't have access to the experiment."); @@ -409,106 +385,10 @@ public class ExperimentService { return experimentDatasets; } - /** - * The loadExperiment access the database and load the information of a specific experiment - * - * @param uuid is the id of the experiment to be retrieved - * @return the experiment information that was retrieved from database - */ - private ExperimentDAO loadExperiment(String uuid, Logger logger) { - UUID experimentUuid; - ExperimentDAO experimentDAO; - - try { - experimentUuid = UUID.fromString(uuid); - } catch (Exception e) { - logger.LogUserAction( e.getMessage()); - throw new BadRequestException(e.getMessage()); - } - - experimentDAO = experimentRepository.findByUuid(experimentUuid); - if (experimentDAO == null) { - logger.LogUserAction( "Experiment with uuid : " + uuid + "was not found."); - throw new ExperimentNotFoundException("Experiment with uuid : " + uuid + " was not found."); - } - - return experimentDAO; - } - - /** - * The createExperimentInTheDatabase will insert a new experiment in the database according to the given experiment information - * - * @param experimentDTO is the experiment information to inserted in the database - * @return the experiment information that was inserted into the database - * @Note In the database there will be stored Algorithm Details that is the whole information about the algorithm - * and an Algorithm column that is required for the filtering with algorithm name in the GET /experiments. - */ - private ExperimentDAO createExperimentInTheDatabase(ExperimentDTO experimentDTO, Logger logger) { - UserDAO user = activeUserService.getActiveUser(); - - ExperimentDAO experimentDAO = new ExperimentDAO(); - experimentDAO.setUuid(UUID.randomUUID()); - experimentDAO.setCreatedBy(user); - experimentDAO.setAlgorithm(JsonConverters.convertObjectToJsonString(experimentDTO.getAlgorithm())); - experimentDAO.setAlgorithmId(experimentDTO.getAlgorithm().getName()); - experimentDAO.setName(experimentDTO.getName()); - experimentDAO.setStatus(ExperimentDAO.Status.pending); - - try { - experimentRepository.save(experimentDAO); - } catch (Exception e) { - logger.LogUserAction("Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); - throw new InternalServerError(e.getMessage()); - } - - logger.LogUserAction(" id : " + experimentDAO.getUuid()); - logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); - logger.LogUserAction(" name : " + experimentDAO.getName()); - return experimentDAO; - } - - private void saveExperiment(ExperimentDAO experimentDAO, Logger logger) { - - logger.LogUserAction(" id : " + experimentDAO.getUuid()); - logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); - logger.LogUserAction(" name : " + experimentDAO.getName()); - logger.LogUserAction(" historyId : " + experimentDAO.getWorkflowHistoryId()); - logger.LogUserAction(" status : " + experimentDAO.getStatus()); - - try { - experimentRepository.save(experimentDAO); - } catch (Exception e) { - logger.LogUserAction("Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); - throw new InternalServerError(e.getMessage()); - } - - logger.LogUserAction("Saved experiment"); - } - - private void finishExperiment(ExperimentDAO experimentDAO, Logger logger) { - experimentDAO.setFinished(new Date()); - - try { - experimentRepository.save(experimentDAO); - } catch (Exception e) { - logger.LogUserAction( "Attempted to save changes to database but an error ocurred : " + e.getMessage() + "."); - throw new InternalServerError(e.getMessage()); - } - } - - private String formattingGalaxyResult(String result) { - List<LinkedTreeMap<String,Object>> jsonObject = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<Object>>().getClass()); - LinkedTreeMap<String,Object> firstResult = jsonObject.get(0); - jsonObject = (List<LinkedTreeMap<String, Object>>) firstResult.get("result"); - List<LinkedTreeMap<String,Object>> finalJsonObject = new ArrayList<>(); - finalJsonObject.add(jsonObject.get(0)); - return JsonConverters.convertObjectToJsonString(finalJsonObject); - } - private ExaremeAlgorithmResultDTO convertMIPEngineResultToExaremeAlgorithmResult(int code, String result) { MIPEngineAlgorithmResultDTO mipVisualization = JsonConverters.convertJsonStringToObject(result, MIPEngineAlgorithmResultDTO.class); LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); - data.put("data", mipVisualization.convertToVisualization()); + data.put("data", new TabularVisualizationDTO(mipVisualization)); data.put("type", "application/vnd.dataresource+json"); List<Object> finalObject = new ArrayList<>(); finalObject.add(data); @@ -531,7 +411,7 @@ public class ExperimentService { // Run with the appropriate engine if (algorithmType.equals("mipengine")) { - MIPEngineAlgorithmRequestDTO mipEngineAlgorithmRequestDTO = experimentDTO.getAlgorithm().convertToMIPEngineBody(); + MIPEngineAlgorithmRequestDTO mipEngineAlgorithmRequestDTO = new MIPEngineAlgorithmRequestDTO(experimentDTO.getAlgorithm().getParameters()); String body = JsonConverters.convertObjectToJsonString(mipEngineAlgorithmRequestDTO); String url = mipengineAlgorithmsUrl + "/" + algorithmName.toLowerCase(); logger.LogUserAction("url: " + url + ", body: " + body); @@ -609,10 +489,9 @@ public class ExperimentService { logger.LogUserAction("Running the algorithm..."); - ExperimentDAO experimentDAO = createExperimentInTheDatabase(experimentDTO, logger); + ExperimentDAO experimentDAO = experimentRepository.createExperimentInTheDatabase(experimentDTO, activeUserService.getActiveUser(), logger); logger.LogUserAction("Created experiment with uuid :" + experimentDAO.getUuid()); - logger.LogUserAction("Starting execution in thread"); ExperimentDTO finalExperimentDTO = experimentDTO; new Thread(() -> { @@ -635,402 +514,13 @@ public class ExperimentService { experimentDAO.setStatus(ExperimentDAO.Status.error); } - finishExperiment(experimentDAO, logger); + experimentRepository.finishExperiment(experimentDAO, logger); Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Finished the experiment: " + experimentDAO); }).start(); - experimentDTO = experimentDAO.convertToDTO(true); + experimentDTO = new ExperimentDTO(true, experimentDAO); return experimentDTO; } /* --------------------------------------- GALAXY CALLS ---------------------------------------------------------*/ - - /** - * The runWorkflow will POST the algorithm to the galaxy client - * - * @param experimentDTO is the request with the experiment information - * @return the response to be returned - */ - public ExperimentDTO runGalaxyWorkflow(ExperimentDTO experimentDTO, Logger logger) { - logger.LogUserAction("Running a workflow..."); - - ExperimentDAO experimentDAO = createExperimentInTheDatabase(experimentDTO, logger); - logger.LogUserAction("Created experiment with uuid :" + experimentDAO.getUuid()); - - - // Run the 1st algorithm from the list - String workflowId = experimentDTO.getAlgorithm().getName(); - - // Get the parameters - List<ExaremeAlgorithmRequestParamDTO> algorithmParameters - = experimentDTO.getAlgorithm().getParameters(); - - // Convert the parameters to workflow parameters - HashMap<String, String> algorithmParamsIncludingEmpty = new HashMap<>(); - if (algorithmParameters != null) { - for (ExaremeAlgorithmRequestParamDTO param : algorithmParameters) { - algorithmParamsIncludingEmpty.put(param.getName(), param.getValue()); - } - } - - // Get all the algorithm parameters because the frontend provides only the non-null - final GalaxyInstance instance = GalaxyInstanceFactory.get(galaxyUrl, galaxyApiKey); - final WorkflowsClient workflowsClient = instance.getWorkflowsClient(); - Workflow workflow = null; - for (Workflow curWorkflow : workflowsClient.getWorkflows()) { - if (curWorkflow.getId().equals(workflowId)) { - workflow = curWorkflow; - break; - } - } - if (workflow == null) { - logger.LogUserAction("Could not find algorithm code: " + workflowId); - throw new BadRequestException("Could not find galaxy algorithm."); - } - final WorkflowDetails workflowDetails = workflowsClient.showWorkflow(workflow.getId()); - for (Map.Entry<String, WorkflowInputDefinition> workflowParameter : workflowDetails.getInputs().entrySet()) { - if (!(algorithmParamsIncludingEmpty.containsKey(workflowParameter.getValue().getUuid()))) { - algorithmParamsIncludingEmpty.put(workflowParameter.getValue().getUuid(), ""); - } - } - - // Create the body of the request - HashMap<String, HashMap<String, String>> requestBody = new HashMap<>(); - requestBody.put("inputs", algorithmParamsIncludingEmpty); - JsonObject requestBodyJson = new JsonParser().parse(gson.toJson(requestBody)).getAsJsonObject(); - - // Create the request client - RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); - logger.LogUserAction("Running Galaxy workflow with id: " + workflow.getId()); - - // Call Galaxy to run the workflow - Call<PostWorkflowToGalaxyDtoResponse> call = service.postWorkflowToGalaxy(workflow.getId(), galaxyApiKey, requestBodyJson); - try { - Response<PostWorkflowToGalaxyDtoResponse> response = call.execute(); - - if (response.code() == 200) { // Call succeeded - String responseBody = gson.toJson(response.body()); - logger.LogUserAction("Response: " + responseBody); - - String historyId = (String) new JSONObject(responseBody).get("history_id"); - experimentDAO.setWorkflowHistoryId(historyId); - experimentDAO.setStatus(ExperimentDAO.Status.success); - - } else { // Something unexpected happened - String msgErr = gson.toJson(response.errorBody()); - logger.LogUserAction("Error Response: " + msgErr); - experimentDTO.setStatus((response.code() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); - } - - } catch (Exception e) { - logger.LogUserAction("An exception occurred: " + e.getMessage()); - experimentDAO.setStatus(ExperimentDAO.Status.error); - } - saveExperiment(experimentDAO, logger); - - // Start the process of fetching the status - updateWorkflowExperiment(experimentDAO, logger); - - logger.LogUserAction("Run workflow completed!"); - - experimentDTO = experimentDAO.convertToDTO(true); - return experimentDTO; - } - - - /** - * This method creates a thread that will fetch the workflow result when it is ready - * - * @param experimentDAO will be used to fetch it's workflow status, it should have the workflowHistoryId initialized - * and the result should not already be fetched - */ - public void updateWorkflowExperiment(ExperimentDAO experimentDAO, Logger logger) { - - if (experimentDAO == null) { - logger.LogUserAction("The experiment does not exist."); - return; - } - - logger.LogUserAction(" Experiment id : " + experimentDAO.getUuid()); - if (experimentDAO.getWorkflowHistoryId() == null) { - logger.LogUserAction("History Id does not exist."); - return; - } - - logger.LogUserAction("Starting Thread..."); - new Thread(() -> { - while (true) { - // ATTENTION: Inside the Thread only LogExperimentAction should be used, not LogExperimentAction! - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Thread is running..."); - - try { - sleep(2000); - } catch (InterruptedException e) { - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Sleep was disrupted: " + e.getMessage()); - } - - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Fetching status for experiment Id: " + experimentDAO.getUuid()); - - String state = getWorkflowStatus(experimentDAO); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "State is: " + state); - - switch (state) { - case "pending": - // Do nothing, when the experiment is created the status is set to running - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Workflow is still running."); - break; - - case "success": - // Get only the job result that is visible - List<GalaxyWorkflowResult> workflowJobsResults = getWorkflowResults(experimentDAO); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Results are: " + workflowJobsResults.toString()); - - boolean resultFound = false; - for (GalaxyWorkflowResult jobResult : workflowJobsResults) { - if (jobResult.getVisible()) { - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Visible result are: " + jobResult.getId()); - - String result = getWorkflowResultBody(experimentDAO, jobResult.getId()); - - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "ResultDTO: " + result); - if (result == null) { - experimentDAO.setStatus(ExperimentDAO.Status.error); - } else { - experimentDAO.setResult(result); - experimentDAO.setStatus(ExperimentDAO.Status.success); - resultFound = true; - } - } - } - - if (!resultFound) { // If there is no visible result - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "No visible result"); - experimentDAO.setStatus(ExperimentDAO.Status.error); - } - - finishExperiment(experimentDAO, logger); - break; - - case "error": - // Get the job result that failed - workflowJobsResults = getWorkflowResults(experimentDAO); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Error results are: " + workflowJobsResults.toString()); - - boolean failedJobFound = false; - for (GalaxyWorkflowResult jobResult : workflowJobsResults) { - if (jobResult.getState().equals("error")) { - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Failed job is: " + jobResult.getId()); - - String result = getWorkflowJobError(jobResult.getId(), experimentDAO); - - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Job result: " + result); - if (result == null) { - experimentDAO.setStatus(ExperimentDAO.Status.error); - } - experimentDAO.setStatus(ExperimentDAO.Status.error); - failedJobFound = true; - } - } - - if (!failedJobFound) { // If there is no visible failed job - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "No failed result"); - experimentDAO.setStatus(ExperimentDAO.Status.error); - } - finishExperiment(experimentDAO, logger); - break; - - default: // InternalError or unexpected result - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "An unexpected error occurred."); - experimentDAO.setStatus(ExperimentDAO.Status.error); - finishExperiment(experimentDAO, logger); - break; - } - - // If result exists return - if (experimentDAO.getResult() != null) { - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "ResultDTO exists: " + experimentDAO.getResult()); - return; - } - } - }).start(); - } - - - /** - * @param experimentDAO The experiment of the workflow - * @return "pending" -> When the workflow is still running - * "internalError" -> When an exception or a bad request occurred - * "error" -> When the workflow produced an error - * "success" -> When the workflow completed successfully - */ - public String getWorkflowStatus(ExperimentDAO experimentDAO) { - String historyId = experimentDAO.getWorkflowHistoryId(); - String experimentName = experimentDAO.getName(); - UUID experimentId = experimentDAO.getUuid(); - - // ATTENTION: This function is used from a Thread. Only LogExperimentAction should be used, not LogUserAction! - Logger.LogExperimentAction(experimentName, experimentId, " History Id : " + historyId); - - // Create the request client - RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); - Call<Object> call = service.getWorkflowStatusFromGalaxy(historyId, galaxyApiKey); - - String result; - try { - Response<Object> response = call.execute(); - if (response.code() >= 400) { - Logger.LogExperimentAction(experimentName, experimentId, " Response code: " - + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); - return "internalError"; - } - result = new Gson().toJson(response.body()); - Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + result); - - } catch (IOException e) { - Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); - return "internalError"; - } - - String state; - try { - JSONObject resultJson = new JSONObject(result); - state = resultJson.getString("state"); - } catch (JSONException e) { - Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); - return "internalError"; - } - - Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); - switch (state) { - case "ok": - return "success"; - case "error": - return "error"; - case "pending": - case "new": - case "waiting": - case "queued": - return "pending"; - default: - return "internalError"; - } - } - - /** - * @param experimentDAO The experiment of the workflow - * @return a List<GalaxyWorkflowResult> or null when an error occurred - */ - public List<GalaxyWorkflowResult> getWorkflowResults(ExperimentDAO experimentDAO) { - - String historyId = experimentDAO.getWorkflowHistoryId(); - String experimentName = experimentDAO.getName(); - UUID experimentId = experimentDAO.getUuid(); - Logger.LogExperimentAction(experimentName, experimentId, " historyId : " + historyId); - - RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); - Call<List<GalaxyWorkflowResult>> call = service.getWorkflowResultsFromGalaxy(historyId, galaxyApiKey); - - List<GalaxyWorkflowResult> getGalaxyWorkflowResultList; - try { - Response<List<GalaxyWorkflowResult>> response = call.execute(); - if (response.code() >= 400) { - Logger.LogExperimentAction(experimentName, experimentId, " Response code: " - + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); - return null; - } - getGalaxyWorkflowResultList = response.body(); - Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + response.body()); - - } catch (IOException e) { - Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); - return null; - } - - Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); - return getGalaxyWorkflowResultList; - - } - - /** - * @param experimentDAO The experiment of the workflow - * @param contentId the id of the job result that we want - * @return the result of the specific workflow job, null if there was an error - */ - public String getWorkflowResultBody(ExperimentDAO experimentDAO, String contentId) { - - String historyId = experimentDAO.getWorkflowHistoryId(); - String experimentName = experimentDAO.getName(); - UUID experimentId = experimentDAO.getUuid(); - - Logger.LogExperimentAction(experimentName, experimentId, " historyId : " + historyId); - - RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); - Call<Object> call = - service.getWorkflowResultsBodyFromGalaxy(historyId, contentId, galaxyApiKey); - - String resultJson; - try { - Response<Object> response = call.execute(); - if (response.code() >= 400) { - Logger.LogExperimentAction(experimentName, experimentId, " Response code: " - + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); - return null; - } - resultJson = new Gson().toJson(response.body()); - Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + resultJson); - - } catch (IOException e) { - Logger.LogExperimentAction(experimentName, experimentId, - " An exception happened: " + e.getMessage()); - return null; - } - - Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); - return formattingGalaxyResult(resultJson); - } - - - /** - * @param jobId the id of the workflow job that failed - * @return the error that was produced or null if an error occurred - */ - public String getWorkflowJobError(String jobId, ExperimentDAO experimentDAO) { - String experimentName = experimentDAO.getName(); - UUID experimentId = experimentDAO.getUuid(); - - Logger.LogExperimentAction(experimentName, experimentId, " jobId : " + jobId); - RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); - Call<Object> callError = service.getErrorMessageOfWorkflowFromGalaxy(jobId, galaxyApiKey); - - String fullError; - String returnError; - try { - Response<Object> response = callError.execute(); - if (response.code() >= 400) { - Logger.LogExperimentAction(experimentName, experimentId, "Response code: " - + response.code() + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); - return null; - } - - // Parsing the stderr of the job that failed - String jsonString = new Gson().toJson(response.body()); - JsonElement jsonElement = new JsonParser().parse(jsonString); - JsonObject rootObject = jsonElement.getAsJsonObject(); - fullError = rootObject.get("stderr").getAsString(); - Logger.LogExperimentAction(experimentName, experimentId, "Error: " + fullError); - - String[] arrOfStr = fullError.split("ValueError", 0); - String specError = arrOfStr[arrOfStr.length - 1]; - returnError = specError.substring(1); - Logger.LogExperimentAction(experimentName, experimentId, "Parsed Error: " + returnError); - - } catch (IOException e) { - Logger.LogExperimentAction(experimentName, experimentId, "Exception: " + e.getMessage()); - return null; - } - - Logger.LogExperimentAction(experimentName, experimentId, "Completed successfully!"); - - return returnError; - } } diff --git a/src/main/java/eu/hbp/mip/services/GalaxyService.java b/src/main/java/eu/hbp/mip/services/GalaxyService.java new file mode 100644 index 000000000..80590c7be --- /dev/null +++ b/src/main/java/eu/hbp/mip/services/GalaxyService.java @@ -0,0 +1,454 @@ +package eu.hbp.mip.services; + +import com.github.jmchilton.blend4j.galaxy.GalaxyInstance; +import com.github.jmchilton.blend4j.galaxy.GalaxyInstanceFactory; +import com.github.jmchilton.blend4j.galaxy.WorkflowsClient; +import com.github.jmchilton.blend4j.galaxy.beans.Workflow; +import com.github.jmchilton.blend4j.galaxy.beans.WorkflowDetails; +import com.github.jmchilton.blend4j.galaxy.beans.WorkflowInputDefinition; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.internal.LinkedTreeMap; +import eu.hbp.mip.controllers.galaxy.retrofit.RetroFitGalaxyClients; +import eu.hbp.mip.controllers.galaxy.retrofit.RetrofitClientInstance; +import eu.hbp.mip.models.DAOs.ExperimentDAO; +import eu.hbp.mip.models.DTOs.ExaremeAlgorithmRequestParamDTO; +import eu.hbp.mip.models.DTOs.ExperimentDTO; +import eu.hbp.mip.models.galaxy.GalaxyWorkflowResult; +import eu.hbp.mip.models.galaxy.PostWorkflowToGalaxyDtoResponse; +import eu.hbp.mip.repositories.ExperimentRepository; +import eu.hbp.mip.utils.Exceptions.BadRequestException; +import eu.hbp.mip.utils.JsonConverters; +import eu.hbp.mip.utils.Logger; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import retrofit2.Call; +import retrofit2.Response; + +import java.io.IOException; +import java.util.*; + +import static java.lang.Thread.sleep; + +@Service +public class GalaxyService { + + private final ActiveUserService activeUserService; + private final ExperimentRepository experimentRepository; + public GalaxyService( + ActiveUserService activeUserService, + ExperimentRepository experimentRepository + ) { + this.activeUserService = activeUserService; + this.experimentRepository = experimentRepository; + } + @Value("#{'${services.galaxy.galaxyUrl}'}") + private String galaxyUrl; + + @Value("#{'${services.galaxy.galaxyApiKey}'}") + private String galaxyApiKey; + + private static final Gson gson = new Gson(); + + /** + * The runWorkflow will POST the algorithm to the galaxy client + * + * @param experimentDTO is the request with the experiment information + * @return the response to be returned + */ + public ExperimentDTO runGalaxyWorkflow(ExperimentDTO experimentDTO, Logger logger) { + logger.LogUserAction("Running a workflow..."); + + ExperimentDAO experimentDAO = experimentRepository.createExperimentInTheDatabase(experimentDTO, activeUserService.getActiveUser(), logger); + logger.LogUserAction("Created experiment with uuid :" + experimentDAO.getUuid()); + + + // Run the 1st algorithm from the list + String workflowId = experimentDTO.getAlgorithm().getName(); + + // Get the parameters + List<ExaremeAlgorithmRequestParamDTO> algorithmParameters + = experimentDTO.getAlgorithm().getParameters(); + + // Convert the parameters to workflow parameters + HashMap<String, String> algorithmParamsIncludingEmpty = new HashMap<>(); + if (algorithmParameters != null) { + for (ExaremeAlgorithmRequestParamDTO param : algorithmParameters) { + algorithmParamsIncludingEmpty.put(param.getName(), param.getValue()); + } + } + + // Get all the algorithm parameters because the frontend provides only the non-null + final GalaxyInstance instance = GalaxyInstanceFactory.get(galaxyUrl, galaxyApiKey); + final WorkflowsClient workflowsClient = instance.getWorkflowsClient(); + Workflow workflow = null; + for (Workflow curWorkflow : workflowsClient.getWorkflows()) { + if (curWorkflow.getId().equals(workflowId)) { + workflow = curWorkflow; + break; + } + } + if (workflow == null) { + logger.LogUserAction("Could not find algorithm code: " + workflowId); + throw new BadRequestException("Could not find galaxy algorithm."); + } + final WorkflowDetails workflowDetails = workflowsClient.showWorkflow(workflow.getId()); + for (Map.Entry<String, WorkflowInputDefinition> workflowParameter : workflowDetails.getInputs().entrySet()) { + if (!(algorithmParamsIncludingEmpty.containsKey(workflowParameter.getValue().getUuid()))) { + algorithmParamsIncludingEmpty.put(workflowParameter.getValue().getUuid(), ""); + } + } + + // Create the body of the request + HashMap<String, HashMap<String, String>> requestBody = new HashMap<>(); + requestBody.put("inputs", algorithmParamsIncludingEmpty); + JsonObject requestBodyJson = new JsonParser().parse(gson.toJson(requestBody)).getAsJsonObject(); + + // Create the request client + RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); + logger.LogUserAction("Running Galaxy workflow with id: " + workflow.getId()); + + // Call Galaxy to run the workflow + Call<PostWorkflowToGalaxyDtoResponse> call = service.postWorkflowToGalaxy(workflow.getId(), galaxyApiKey, requestBodyJson); + try { + Response<PostWorkflowToGalaxyDtoResponse> response = call.execute(); + + if (response.code() == 200) { // Call succeeded + String responseBody = gson.toJson(response.body()); + logger.LogUserAction("Response: " + responseBody); + + String historyId = (String) new JSONObject(responseBody).get("history_id"); + experimentDAO.setWorkflowHistoryId(historyId); + experimentDAO.setStatus(ExperimentDAO.Status.success); + + } else { // Something unexpected happened + String msgErr = gson.toJson(response.errorBody()); + logger.LogUserAction("Error Response: " + msgErr); + experimentDTO.setStatus((response.code() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); + } + + } catch (Exception e) { + logger.LogUserAction("An exception occurred: " + e.getMessage()); + experimentDAO.setStatus(ExperimentDAO.Status.error); + } + experimentRepository.saveExperiment(experimentDAO, logger); + + // Start the process of fetching the status + updateWorkflowExperiment(experimentDAO, logger); + + logger.LogUserAction("Run workflow completed!"); + + experimentDTO = new ExperimentDTO(true, experimentDAO); + return experimentDTO; + } + + + + /** + * @param experimentDAO The experiment of the workflow + * @return "pending" -> When the workflow is still running + * "internalError" -> When an exception or a bad request occurred + * "error" -> When the workflow produced an error + * "success" -> When the workflow completed successfully + */ + public String getWorkflowStatus(ExperimentDAO experimentDAO) { + String historyId = experimentDAO.getWorkflowHistoryId(); + String experimentName = experimentDAO.getName(); + UUID experimentId = experimentDAO.getUuid(); + + // ATTENTION: This function is used from a Thread. Only LogExperimentAction should be used, not LogUserAction! + Logger.LogExperimentAction(experimentName, experimentId, " History Id : " + historyId); + + // Create the request client + RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); + Call<Object> call = service.getWorkflowStatusFromGalaxy(historyId, galaxyApiKey); + + String result; + try { + Response<Object> response = call.execute(); + if (response.code() >= 400) { + Logger.LogExperimentAction(experimentName, experimentId, " Response code: " + + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); + return "internalError"; + } + result = new Gson().toJson(response.body()); + Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + result); + + } catch (IOException e) { + Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); + return "internalError"; + } + + String state; + try { + JSONObject resultJson = new JSONObject(result); + state = resultJson.getString("state"); + } catch (JSONException e) { + Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); + return "internalError"; + } + + Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); + switch (state) { + case "ok": + return "success"; + case "error": + return "error"; + case "pending": + case "new": + case "waiting": + case "queued": + return "pending"; + default: + return "internalError"; + } + } + + /** + * @param experimentDAO The experiment of the workflow + * @return a List<GalaxyWorkflowResult> or null when an error occurred + */ + public List<GalaxyWorkflowResult> getWorkflowResults(ExperimentDAO experimentDAO) { + + String historyId = experimentDAO.getWorkflowHistoryId(); + String experimentName = experimentDAO.getName(); + UUID experimentId = experimentDAO.getUuid(); + Logger.LogExperimentAction(experimentName, experimentId, " historyId : " + historyId); + + RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); + Call<List<GalaxyWorkflowResult>> call = service.getWorkflowResultsFromGalaxy(historyId, galaxyApiKey); + + List<GalaxyWorkflowResult> getGalaxyWorkflowResultList; + try { + Response<List<GalaxyWorkflowResult>> response = call.execute(); + if (response.code() >= 400) { + Logger.LogExperimentAction(experimentName, experimentId, " Response code: " + + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); + return null; + } + getGalaxyWorkflowResultList = response.body(); + Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + response.body()); + + } catch (IOException e) { + Logger.LogExperimentAction(experimentName, experimentId, " An exception happened: " + e.getMessage()); + return null; + } + + Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); + return getGalaxyWorkflowResultList; + + } + + /** + * @param experimentDAO The experiment of the workflow + * @param contentId the id of the job result that we want + * @return the result of the specific workflow job, null if there was an error + */ + public String getWorkflowResultBody(ExperimentDAO experimentDAO, String contentId) { + + String historyId = experimentDAO.getWorkflowHistoryId(); + String experimentName = experimentDAO.getName(); + UUID experimentId = experimentDAO.getUuid(); + + Logger.LogExperimentAction(experimentName, experimentId, " historyId : " + historyId); + + RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); + Call<Object> call = + service.getWorkflowResultsBodyFromGalaxy(historyId, contentId, galaxyApiKey); + + String resultJson; + try { + Response<Object> response = call.execute(); + if (response.code() >= 400) { + Logger.LogExperimentAction(experimentName, experimentId, " Response code: " + + response.code() + "" + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); + return null; + } + resultJson = new Gson().toJson(response.body()); + Logger.LogExperimentAction(experimentName, experimentId, " ResultDTO: " + resultJson); + + } catch (IOException e) { + Logger.LogExperimentAction(experimentName, experimentId, + " An exception happened: " + e.getMessage()); + return null; + } + + Logger.LogExperimentAction(experimentName, experimentId, " Completed!"); + return formattingGalaxyResult(resultJson); + } + + private String formattingGalaxyResult(String result) { + List<LinkedTreeMap<String,Object>> jsonObject = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<Object>>().getClass()); + LinkedTreeMap<String,Object> firstResult = jsonObject.get(0); + jsonObject = (List<LinkedTreeMap<String, Object>>) firstResult.get("result"); + List<LinkedTreeMap<String,Object>> finalJsonObject = new ArrayList<>(); + finalJsonObject.add(jsonObject.get(0)); + return JsonConverters.convertObjectToJsonString(finalJsonObject); + } + + + /** + * @param jobId the id of the workflow job that failed + * @return the error that was produced or null if an error occurred + */ + public String getWorkflowJobError(String jobId, ExperimentDAO experimentDAO) { + String experimentName = experimentDAO.getName(); + UUID experimentId = experimentDAO.getUuid(); + + Logger.LogExperimentAction(experimentName, experimentId, " jobId : " + jobId); + RetroFitGalaxyClients service = RetrofitClientInstance.getRetrofitInstance().create(RetroFitGalaxyClients.class); + Call<Object> callError = service.getErrorMessageOfWorkflowFromGalaxy(jobId, galaxyApiKey); + + String fullError; + String returnError; + try { + Response<Object> response = callError.execute(); + if (response.code() >= 400) { + Logger.LogExperimentAction(experimentName, experimentId, "Response code: " + + response.code() + " with body: " + (response.errorBody() != null ? response.errorBody().string() : " ")); + return null; + } + + // Parsing the stderr of the job that failed + String jsonString = new Gson().toJson(response.body()); + JsonElement jsonElement = new JsonParser().parse(jsonString); + JsonObject rootObject = jsonElement.getAsJsonObject(); + fullError = rootObject.get("stderr").getAsString(); + Logger.LogExperimentAction(experimentName, experimentId, "Error: " + fullError); + + String[] arrOfStr = fullError.split("ValueError", 0); + String specError = arrOfStr[arrOfStr.length - 1]; + returnError = specError.substring(1); + Logger.LogExperimentAction(experimentName, experimentId, "Parsed Error: " + returnError); + + } catch (IOException e) { + Logger.LogExperimentAction(experimentName, experimentId, "Exception: " + e.getMessage()); + return null; + } + + Logger.LogExperimentAction(experimentName, experimentId, "Completed successfully!"); + + return returnError; + } + + /** + * This method creates a thread that will fetch the workflow result when it is ready + * + * @param experimentDAO will be used to fetch it's workflow status, it should have the workflowHistoryId initialized + * and the result should not already be fetched + */ + public void updateWorkflowExperiment(ExperimentDAO experimentDAO, Logger logger) { + + if (experimentDAO == null) { + logger.LogUserAction("The experiment does not exist."); + return; + } + + logger.LogUserAction(" Experiment id : " + experimentDAO.getUuid()); + if (experimentDAO.getWorkflowHistoryId() == null) { + logger.LogUserAction("History Id does not exist."); + return; + } + + logger.LogUserAction("Starting Thread..."); + new Thread(() -> { + while (true) { + // ATTENTION: Inside the Thread only LogExperimentAction should be used, not LogExperimentAction! + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Thread is running..."); + + try { + sleep(2000); + } catch (InterruptedException e) { + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Sleep was disrupted: " + e.getMessage()); + } + + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Fetching status for experiment Id: " + experimentDAO.getUuid()); + + String state = getWorkflowStatus(experimentDAO); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "State is: " + state); + + switch (state) { + case "pending": + // Do nothing, when the experiment is created the status is set to running + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Workflow is still running."); + break; + + case "success": + // Get only the job result that is visible + List<GalaxyWorkflowResult> workflowJobsResults = getWorkflowResults(experimentDAO); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Results are: " + workflowJobsResults.toString()); + + boolean resultFound = false; + for (GalaxyWorkflowResult jobResult : workflowJobsResults) { + if (jobResult.getVisible()) { + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Visible result are: " + jobResult.getId()); + + String result = getWorkflowResultBody(experimentDAO, jobResult.getId()); + + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "ResultDTO: " + result); + if (result == null) { + experimentDAO.setStatus(ExperimentDAO.Status.error); + } else { + experimentDAO.setResult(result); + experimentDAO.setStatus(ExperimentDAO.Status.success); + resultFound = true; + } + } + } + + if (!resultFound) { // If there is no visible result + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "No visible result"); + experimentDAO.setStatus(ExperimentDAO.Status.error); + } + + experimentRepository.finishExperiment(experimentDAO, logger); + break; + + case "error": + // Get the job result that failed + workflowJobsResults = getWorkflowResults(experimentDAO); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Error results are: " + workflowJobsResults.toString()); + + boolean failedJobFound = false; + for (GalaxyWorkflowResult jobResult : workflowJobsResults) { + if (jobResult.getState().equals("error")) { + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Failed job is: " + jobResult.getId()); + + String result = getWorkflowJobError(jobResult.getId(), experimentDAO); + + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Job result: " + result); + if (result == null) { + experimentDAO.setStatus(ExperimentDAO.Status.error); + } + experimentDAO.setStatus(ExperimentDAO.Status.error); + failedJobFound = true; + } + } + + if (!failedJobFound) { // If there is no visible failed job + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "No failed result"); + experimentDAO.setStatus(ExperimentDAO.Status.error); + } + experimentRepository.finishExperiment(experimentDAO, logger); + break; + + default: // InternalError or unexpected result + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "An unexpected error occurred."); + experimentDAO.setStatus(ExperimentDAO.Status.error); + experimentRepository.finishExperiment(experimentDAO, logger); + break; + } + + // If result exists return + if (experimentDAO.getResult() != null) { + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "ResultDTO exists: " + experimentDAO.getResult()); + return; + } + } + }).start(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8aadac388..d8d542b6b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,7 +35,7 @@ spring: ### EXTERNAL SERVICES ### services: mipengine: - algorithmsUrl: "http://192.168.124.129:5000/algorithms" + algorithmsUrl: "http://127.0.0.1:5000/algorithms" exareme: queryExaremeUrl: "http://127.0.0.1:9090/mining/query" algorithmsUrl: "http://127.0.0.1:9090/mining/algorithms.json" -- GitLab From 82c131267c4de8e4e6eb4dd7e94225dfc70a01c5 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Fri, 9 Jul 2021 07:07:13 -0700 Subject: [PATCH 10/12] Add the TabularVisualizationDTO class --- .../models/DTOs/TabularVisualizationDTO.java | 33 +++++++++++++++++++ .../eu/hbp/mip/services/GalaxyService.java | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/eu/hbp/mip/models/DTOs/TabularVisualizationDTO.java diff --git a/src/main/java/eu/hbp/mip/models/DTOs/TabularVisualizationDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/TabularVisualizationDTO.java new file mode 100644 index 000000000..3e17932f7 --- /dev/null +++ b/src/main/java/eu/hbp/mip/models/DTOs/TabularVisualizationDTO.java @@ -0,0 +1,33 @@ +package eu.hbp.mip.models.DTOs; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.HashMap; +import java.util.List; + +@Data +@AllArgsConstructor +public class TabularVisualizationDTO { + private final String name; + private final String profile; + private final HashMap<String, List<Field>> schema; + private final List<List<Object>> data; + + + public TabularVisualizationDTO(MIPEngineAlgorithmResultDTO mipEngineAlgorithmResultDTO) { + HashMap<String, List<TabularVisualizationDTO.Field>> schema = new HashMap<>(); + schema.put("fields", mipEngineAlgorithmResultDTO.getColumns()); + this.name = mipEngineAlgorithmResultDTO.getTitle(); + this.profile = "tabular-data-resource"; + this.schema = schema; + this.data = mipEngineAlgorithmResultDTO.getData(); + } + @Data + @AllArgsConstructor + public static class Field { + private final String name; + private final String type; + } +} + diff --git a/src/main/java/eu/hbp/mip/services/GalaxyService.java b/src/main/java/eu/hbp/mip/services/GalaxyService.java index 80590c7be..cc10afebd 100644 --- a/src/main/java/eu/hbp/mip/services/GalaxyService.java +++ b/src/main/java/eu/hbp/mip/services/GalaxyService.java @@ -20,6 +20,7 @@ import eu.hbp.mip.models.galaxy.GalaxyWorkflowResult; import eu.hbp.mip.models.galaxy.PostWorkflowToGalaxyDtoResponse; import eu.hbp.mip.repositories.ExperimentRepository; import eu.hbp.mip.utils.Exceptions.BadRequestException; +import eu.hbp.mip.utils.Exceptions.InternalServerError; import eu.hbp.mip.utils.JsonConverters; import eu.hbp.mip.utils.Logger; import org.codehaus.jettison.json.JSONException; @@ -364,6 +365,7 @@ public class GalaxyService { sleep(2000); } catch (InterruptedException e) { Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Sleep was disrupted: " + e.getMessage()); + throw new InternalServerError(e.getMessage()); } Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Fetching status for experiment Id: " + experimentDAO.getUuid()); -- GitLab From 5e48e460c7571092c0d57f642e4d8d91edd95a32 Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Fri, 16 Jul 2021 07:30:07 -0700 Subject: [PATCH 11/12] Updated Exareme algorithm results to result --- .../eu/hbp/mip/controllers/AlgorithmsAPI.java | 19 +++++++++++++------ .../DTOs/ExaremeAlgorithmResultDTO.java | 2 +- .../hbp/mip/services/ExperimentService.java | 8 ++++---- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 5ac49a402..a15fd37cd 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -27,6 +27,7 @@ import retrofit2.Call; import retrofit2.Response; import java.io.IOException; +import java.net.ConnectException; import java.util.ArrayList; import java.util.List; @@ -69,27 +70,27 @@ public class AlgorithmsAPI { logger.LogUserAction("Executing..."); ArrayList<ExaremeAlgorithmDTO> mipengineAlgorithms = getMIPEngineAlgorithms(logger); - logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); ArrayList<ExaremeAlgorithmDTO> exaremeAlgorithms = getExaremeAlgorithms(logger); - logger.LogUserAction("Loaded " + exaremeAlgorithms.size() + " exareme algorithms"); ArrayList<ExaremeAlgorithmDTO> galaxyAlgorithms = getGalaxyWorkflows(logger); - logger.LogUserAction("Loaded " + galaxyAlgorithms.size() + " galaxy algorithms"); ArrayList<ExaremeAlgorithmDTO> algorithms = new ArrayList<>(); if (exaremeAlgorithms != null) { algorithms.addAll(exaremeAlgorithms); + logger.LogUserAction("Loaded " + exaremeAlgorithms.size() + " exareme algorithms"); } else { - logger.LogUserAction("Getting exareme algorithms failed and returned null"); + logger.LogUserAction("Fetching exareme algorithms failed"); } if (mipengineAlgorithms != null) { algorithms.addAll(mipengineAlgorithms); + logger.LogUserAction("Loaded " + mipengineAlgorithms.size() + " mipengine algorithms"); } else { - logger.LogUserAction("Getting mipengine algorithms failed and returned null"); + logger.LogUserAction("Fetching mipengine algorithms failed"); } if (galaxyAlgorithms != null) { algorithms.addAll(galaxyAlgorithms); + logger.LogUserAction("Loaded " + galaxyAlgorithms.size() + " galaxy algorithms"); } else { - logger.LogUserAction("Getting galaxy workflows failed and returned null"); + logger.LogUserAction("Fetching galaxy workflows failed"); } List<String> disabledAlgorithms = new ArrayList<>(); @@ -126,6 +127,9 @@ public class AlgorithmsAPI { new TypeToken<ArrayList<ExaremeAlgorithmDTO>>() { }.getType() ); + } catch (ConnectException e) { + logger.LogUserAction("An exception occurred: " + e.getMessage()); + return null; } catch (IOException e) { logger.LogUserAction("An exception occurred: " + e.getMessage()); return null; @@ -153,6 +157,9 @@ public class AlgorithmsAPI { new TypeToken<ArrayList<MIPEngineAlgorithmDTO>>() { }.getType() ); + } catch (ConnectException e) { + logger.LogUserAction("An exception occurred: " + e.getMessage()); + return null; } catch (IOException e) { logger.LogUserAction("An exception occurred: " + e.getMessage()); return null; diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java index d1f5947c8..88b5fb627 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExaremeAlgorithmResultDTO.java @@ -9,7 +9,7 @@ import java.util.List; @AllArgsConstructor public class ExaremeAlgorithmResultDTO { private int code; - private List<Object> results; + private List<Object> result; } diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index c421fd471..1bd848ed6 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -209,9 +209,9 @@ public class ExperimentService { // Results are stored in the experiment object ExaremeAlgorithmResultDTO exaremeAlgorithmResultDTO = runExperiment(experimentDTO, logger); - logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResults()); + logger.LogUserAction("Experiment with uuid: " + experimentDTO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResult()); - experimentDTO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : exaremeAlgorithmResultDTO.getResults()); + experimentDTO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : exaremeAlgorithmResultDTO.getResult()); experimentDTO.setStatus((exaremeAlgorithmResultDTO.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); return experimentDTO; @@ -504,9 +504,9 @@ public class ExperimentService { // Results are stored in the experiment object ExaremeAlgorithmResultDTO exaremeAlgorithmResultDTO = runExperiment(finalExperimentDTO, logger); - Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResults()); + Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "Experiment with uuid: " + experimentDAO.getUuid() + "gave response code: " + exaremeAlgorithmResultDTO.getCode() + " and result: " + exaremeAlgorithmResultDTO.getResult()); - experimentDAO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(exaremeAlgorithmResultDTO.getResults())); + experimentDAO.setResult((exaremeAlgorithmResultDTO.getCode() >= 400) ? null : JsonConverters.convertObjectToJsonString(exaremeAlgorithmResultDTO.getResult())); experimentDAO.setStatus((exaremeAlgorithmResultDTO.getCode() >= 400) ? ExperimentDAO.Status.error : ExperimentDAO.Status.success); } catch (Exception e) { Logger.LogExperimentAction(experimentDAO.getName(), experimentDAO.getUuid(), "There was an exception: " + e.getMessage()); -- GitLab From 3abaf92884ff6e1797b5a268821f0e0af4ed236e Mon Sep 17 00:00:00 2001 From: kfilippopolitis <kostasfilippop@gmail.com> Date: Mon, 19 Jul 2021 01:23:53 -0700 Subject: [PATCH 12/12] Remove debugging comments. --- src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java b/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java index 449765fc9..e5d0b04c5 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentAPI.java @@ -78,7 +78,6 @@ public class ExperimentAPI { @ApiOperation(value = "Create an experiment", response = ExperimentDTO.class) @RequestMapping(method = RequestMethod.POST) public ResponseEntity<String> createExperiment(Authentication authentication, @RequestBody ExperimentDTO experimentDTO) { - new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments").LogUserAction("TEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEST"); experimentDTO = experimentService.createExperiment(authentication, experimentDTO, new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments")); return new ResponseEntity<>(JsonConverters.convertObjectToJsonString(experimentDTO), HttpStatus.CREATED); } @@ -104,7 +103,6 @@ public class ExperimentAPI { @ApiOperation(value = "Create a transient experiment", response = ExperimentDTO.class) @RequestMapping(value = "/transient", method = RequestMethod.POST) public ResponseEntity<String> createTransientExperiment(Authentication authentication, @RequestBody ExperimentDTO experimentDTO) { - new Logger(activeUserService.getActiveUser().getUsername(),"(POST) /experiments").LogUserAction("TEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEST"); experimentDTO = experimentService.createTransientExperiment(authentication, experimentDTO, new Logger(activeUserService.getActiveUser().getUsername(), "(POST) /experiments/transient")); return new ResponseEntity<>(JsonConverters.convertObjectToJsonString(experimentDTO), HttpStatus.OK); } -- GitLab