From 5281c1874485d0c879a06b1d3cc4f185cc3beff1 Mon Sep 17 00:00:00 2001
From: Manuel Spuhler <manuel.spuhler@gmail.com>
Date: Fri, 7 Jun 2019 08:48:37 +0200
Subject: [PATCH] Workflow enpoint POC

---
 .../eu/hbp/mip/controllers/ExperimentApi.java | 47 ++++++++++++++++++-
 src/main/java/eu/hbp/mip/utils/HTTPUtil.java  | 42 +++++++++++++++++
 2 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
index fba15a4f8..1f36e8710 100644
--- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
@@ -69,7 +69,7 @@ public class ExperimentApi extends WokenClientController {
     @ApiOperation(value = "Create an experiment on Exareme", response = Experiment.class)
     @RequestMapping(value = "/exareme", method = RequestMethod.POST)
     public ResponseEntity<String> runExaremeExperiment(@RequestBody ExperimentQuery expQuery) {
-        LOGGER.info("sendExaremeExperiment");
+        LOGGER.info("send ExaremeExperiment");
 
         Experiment experiment = saveExperiment(expQuery);
 
@@ -80,6 +80,20 @@ public class ExperimentApi extends WokenClientController {
         return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK);
     }
 
+    @ApiOperation(value = "Create a workflow", response = Experiment.class)
+    @RequestMapping(value = "/workflow", method = RequestMethod.POST)
+    public ResponseEntity<String> runWorkflow(@RequestBody ExperimentQuery expQuery) {
+        LOGGER.info("send Workflow");
+
+        Experiment experiment = saveExperiment(expQuery);
+
+        String algoCode = expQuery.getAlgorithms().get(0).getCode();
+        List<AlgorithmParam> params = expQuery.getAlgorithms().get(0).getParameters();
+        sendWorkflow(experiment, algoCode, params);
+
+        return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK);
+    }
+
     @ApiOperation(value = "get an experiment", response = Experiment.class)
     @RequestMapping(value = "/{uuid}", method = RequestMethod.GET)
     public ResponseEntity<String> getExperiment(
@@ -297,6 +311,37 @@ public class ExperimentApi extends WokenClientController {
         }).start();
     }
 
+    private void sendWorkflow(Experiment experiment, String algoCode, List<AlgorithmParam> params) {
+        // this runs in the background. For future optimization: use a thread pool
+        new Thread(() -> {
+            HashMap<String, String> queryMap = new HashMap<String, String>();
+
+            if (params != null) {
+                for (AlgorithmParam p : params) {
+                    queryMap.put(p.getName(), p.getValue());
+                }
+            }
+
+            String query = gson.toJson(queryMap);
+            String url = "http://88.197.53.36:8080/Gateway_API-1.0.0-SNAPSHOT/api/runWorkflow/3f5830403180d620";
+            // Results are stored in the experiment object
+            try {
+                StringBuilder results = new StringBuilder();
+                int code = HTTPUtil.sendWorkflowHTTP(url, query, results);
+                experiment.setResult("[" + results.toString() + "]");
+                experiment.setHasError(code >= 400);
+                experiment.setHasServerError(code >= 500);
+            } catch (IOException e) {
+                LOGGER.trace("Invalid UUID", e);
+                LOGGER.warn("Exareme experiment failed to run properly !");
+                experiment.setHasError(true);
+                experiment.setHasServerError(true);
+                experiment.setResult(e.getMessage());
+            }
+            finishExperiment(experiment);
+        }).start();
+    }
+
     private void finishExperiment(Experiment experiment) {
         experiment.setFinished(new Date());
         experimentRepository.save(experiment);
diff --git a/src/main/java/eu/hbp/mip/utils/HTTPUtil.java b/src/main/java/eu/hbp/mip/utils/HTTPUtil.java
index 37d3af8d8..e3c1de511 100644
--- a/src/main/java/eu/hbp/mip/utils/HTTPUtil.java
+++ b/src/main/java/eu/hbp/mip/utils/HTTPUtil.java
@@ -47,6 +47,48 @@ public class HTTPUtil {
             }
         }
 
+        int respCode = con.getResponseCode();
+
+        BufferedReader in;
+        if(respCode == 200) {
+            in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+        }
+        else
+        {
+            in = new BufferedReader(new InputStreamReader(con.getErrorStream()));
+        }
+        String inputLine;
+        StringBuilder response = new StringBuilder();
+
+        while ((inputLine = in.readLine()) != null) {
+            response.append(inputLine);
+        }
+        in.close();
+        resp.append(response.toString());
+
+        return respCode;
+    }
+
+    /* FIXME: Authorization */ 
+    public static int sendWorkflowHTTP(String url, String query, StringBuilder resp) throws IOException {
+
+        URL obj = new URL(url);
+        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+
+        con.setRequestMethod("POST");
+        if(query != null && query.length() > 0)
+        {
+            con.addRequestProperty("Content-Type", "application/json");
+            con.setRequestProperty("Content-Length", Integer.toString(query.length()));
+
+            con.setDoOutput(true);
+            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
+            wr.write(query.getBytes(StandardCharsets.UTF_8));
+            wr.flush();
+            wr.close();
+        }
+        
+
         int respCode = con.getResponseCode();
 
         BufferedReader in;
-- 
GitLab