diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index fba15a4f834083e101ecbcb5b28fe77f2e199c8b..1f36e87107bbd3a19311e444f5ab6d18d725b664 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 37d3af8d830e87d7e655ba096fb496fab6eb29a5..e3c1de5111c762b5b23c660f8a2e4b0ca43c909a 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;