From 070c0fae94254ef8df7bb6d4eb3d706e54661c6e Mon Sep 17 00:00:00 2001 From: ThanKarab Date: Mon, 16 Nov 2020 12:24:17 +0200 Subject: [PATCH 1/2] Request response status refactor. 1) User Error -> 200 2) Bad algorithm name -> 400 3) Every other exception -> 500 --- .../root/exareme/convert-csv-dataset-to-db.py | 2 +- .../HBP/Exceptions/RequestException.java | 7 ++++ .../async/handler/HBP/HBPQueryHandler.java | 33 +++++++++---------- .../control/handler/HttpAsyncCheckWorker.java | 7 ++-- 4 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/Exceptions/RequestException.java diff --git a/Exareme-Docker/files/root/exareme/convert-csv-dataset-to-db.py b/Exareme-Docker/files/root/exareme/convert-csv-dataset-to-db.py index 9bffa3fb6..4ad341440 100755 --- a/Exareme-Docker/files/root/exareme/convert-csv-dataset-to-db.py +++ b/Exareme-Docker/files/root/exareme/convert-csv-dataset-to-db.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 # -*- coding: utf-8 -*- """ diff --git a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/Exceptions/RequestException.java b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/Exceptions/RequestException.java new file mode 100644 index 000000000..cecd101d1 --- /dev/null +++ b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/Exceptions/RequestException.java @@ -0,0 +1,7 @@ +package madgik.exareme.master.gateway.async.handler.HBP.Exceptions; + +public class RequestException extends Exception { + public RequestException(String algorithmName, String message) { + super(message + " Algorithm: " + algorithmName); + } +} \ No newline at end of file diff --git a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java index bbc7c6b95..464e7f564 100644 --- a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java +++ b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java @@ -1,6 +1,5 @@ package madgik.exareme.master.gateway.async.handler.HBP; -import com.google.gson.JsonSyntaxException; import madgik.exareme.common.consts.HBPConstants; import madgik.exareme.master.client.AdpDBClient; import madgik.exareme.master.client.AdpDBClientFactory; @@ -14,12 +13,12 @@ import madgik.exareme.master.engine.iterations.handler.NIterativeAlgorithmResultEntity; import madgik.exareme.master.engine.iterations.state.IterativeAlgorithmState; import madgik.exareme.master.gateway.ExaremeGatewayUtils; +import madgik.exareme.master.gateway.async.handler.HBP.Exceptions.RequestException; import madgik.exareme.master.gateway.async.handler.HBP.Exceptions.UserException; import madgik.exareme.master.gateway.async.handler.entity.NQueryResultEntity; import madgik.exareme.master.queryProcessor.HBP.AlgorithmProperties; import madgik.exareme.master.queryProcessor.HBP.Algorithms; import madgik.exareme.master.queryProcessor.HBP.Composer; -import madgik.exareme.master.queryProcessor.HBP.Exceptions.AlgorithmException; import madgik.exareme.worker.art.container.ContainerProxy; import org.apache.http.*; import org.apache.http.entity.BasicHttpEntity; @@ -116,7 +115,7 @@ private void handleHBPAlgorithmExecution(HttpRequest request, HttpResponse respo AlgorithmProperties algorithmProperties = Algorithms.getInstance().getAlgorithmProperties(algorithmName); if (algorithmProperties == null) - throw new AlgorithmException(algorithmName, "The algorithm '" + algorithmName + "' does not exist."); + throw new RequestException(algorithmName, "The algorithm '" + algorithmName + "' does not exist."); algorithmProperties.mergeWithAlgorithmParameters(algorithmParameters); @@ -167,27 +166,27 @@ private void handleHBPAlgorithmExecution(HttpRequest request, HttpResponse respo response.setStatusCode(HttpStatus.SC_OK); response.setEntity(entity); } - } catch (IterationsFatalException e) { - log.error(e); - if (e.getErroneousAlgorithmKey() != null) - iterationsHandler.removeIterativeAlgorithmStateInstanceFromISM( - e.getErroneousAlgorithmKey()); - log.error(e); - String errorType = HBPQueryHelper.ErrorResponse.ErrorResponseTypes.error; - response.setStatusCode(HttpStatus.SC_BAD_REQUEST); + } catch (UserException e) { + log.error(e.getMessage()); + String errorType = HBPQueryHelper.ErrorResponse.ErrorResponseTypes.user_error; + response.setStatusCode(HttpStatus.SC_OK); response.setEntity(createErrorResponseEntity(e.getMessage(), errorType)); - } catch (UserException e) { + } catch (RequestException e) { log.error(e.getMessage()); String errorType = HBPQueryHelper.ErrorResponse.ErrorResponseTypes.user_error; response.setStatusCode(HttpStatus.SC_BAD_REQUEST); response.setEntity(createErrorResponseEntity(e.getMessage(), errorType)); - } catch (JsonSyntaxException e) { - log.error("Could not parse the algorithms properly."); + } catch (IterationsFatalException e) { + log.error(e); + if (e.getErroneousAlgorithmKey() != null) + iterationsHandler.removeIterativeAlgorithmStateInstanceFromISM( + e.getErroneousAlgorithmKey()); + log.error(e); String errorType = HBPQueryHelper.ErrorResponse.ErrorResponseTypes.error; - response.setStatusCode(HttpStatus.SC_BAD_REQUEST); - response.setEntity(createErrorResponseEntity(serverErrorOccurred, errorType)); + response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR); + response.setEntity(createErrorResponseEntity(e.getMessage(), errorType)); } catch (Exception e) { log.error(e.getMessage()); @@ -197,7 +196,7 @@ private void handleHBPAlgorithmExecution(HttpRequest request, HttpResponse respo } log.error(e.getStackTrace()); String errorType = HBPQueryHelper.ErrorResponse.ErrorResponseTypes.error; - response.setStatusCode(HttpStatus.SC_BAD_REQUEST); + response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR); response.setEntity(createErrorResponseEntity(serverErrorOccurred, errorType)); } } diff --git a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/control/handler/HttpAsyncCheckWorker.java b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/control/handler/HttpAsyncCheckWorker.java index d320049f9..5274c9f9e 100644 --- a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/control/handler/HttpAsyncCheckWorker.java +++ b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/control/handler/HttpAsyncCheckWorker.java @@ -9,6 +9,7 @@ import madgik.exareme.master.engine.AdpDBManager; import madgik.exareme.master.engine.AdpDBManagerLocator; import madgik.exareme.master.gateway.ExaremeGatewayUtils; +import madgik.exareme.master.gateway.async.handler.HBP.Exceptions.RequestException; import madgik.exareme.master.gateway.async.handler.HBP.Exceptions.UserException; import madgik.exareme.master.gateway.async.handler.entity.NQueryResultEntity; import madgik.exareme.master.queryProcessor.HBP.AlgorithmProperties; @@ -54,7 +55,7 @@ public void handle( HttpResponse response = httpexchange.getResponse(); try { handleInternal(request, response, context); - } catch (AlgorithmException | CDEsMetadataException | ComposerException | UserException e) { + } catch (AlgorithmException | CDEsMetadataException | ComposerException | UserException | RequestException e) { e.printStackTrace(); } httpexchange.submitResponse(new BasicAsyncResponseProducer(response)); @@ -64,7 +65,7 @@ private void handleInternal( final HttpRequest request, final HttpResponse response, final HttpContext context - ) throws HttpException, IOException, AlgorithmException, CDEsMetadataException, ComposerException, UserException { + ) throws HttpException, IOException, AlgorithmException, CDEsMetadataException, ComposerException, UserException, RequestException { String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH); if (!method.equals("GET") && !method.equals("HEAD") && !method.equals("POST")) { @@ -87,7 +88,7 @@ private void handleInternal( AlgorithmProperties algorithmProperties = Algorithms.getInstance().getAlgorithmProperties(algorithmName); if (algorithmProperties == null) - throw new AlgorithmException(algorithmName, "The algorithm does not exist."); + throw new RequestException(algorithmName, "The algorithm does not exist."); algorithmProperties.mergeWithAlgorithmParameters(inputContent); From 70e816182dde07c2413d6198e3a095098b4cb139 Mon Sep 17 00:00:00 2001 From: ThanKarab Date: Mon, 16 Nov 2020 18:49:44 +0200 Subject: [PATCH 2/2] Algorithm name check before dataset check. --- .../gateway/async/handler/HBP/HBPQueryHandler.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java index 464e7f564..e48228f53 100644 --- a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java +++ b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/gateway/async/handler/HBP/HBPQueryHandler.java @@ -99,9 +99,14 @@ private void handleHBPAlgorithmExecution(HttpRequest request, HttpResponse respo preExecutionChecks(request); String algorithmName = getAlgorithmName(request); + AlgorithmProperties algorithmProperties = Algorithms.getInstance().getAlgorithmProperties(algorithmName); + if (algorithmProperties == null) + throw new RequestException(algorithmName, "The algorithm '" + algorithmName + "' does not exist."); + String algorithmKey = algorithmName + "_" + System.currentTimeMillis(); - log.info("Executing algorithm: " + algorithmName + " with key: " + algorithmKey); + // Logging the algorithm execution parameters + log.info("Executing algorithm: " + algorithmName + " with key: " + algorithmKey); HashMap algorithmParameters = HBPQueryHelper.getAlgorithmParameters(request); log.info("Request for algorithm: " + algorithmName); if (algorithmParameters != null) { @@ -113,10 +118,6 @@ private void handleHBPAlgorithmExecution(HttpRequest request, HttpResponse respo AdpDBClientQueryStatus queryStatus; - AlgorithmProperties algorithmProperties = Algorithms.getInstance().getAlgorithmProperties(algorithmName); - if (algorithmProperties == null) - throw new RequestException(algorithmName, "The algorithm '" + algorithmName + "' does not exist."); - algorithmProperties.mergeWithAlgorithmParameters(algorithmParameters); DataSerialization ds = DataSerialization.summary;