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