From c8faaed2e54f52da9d1374e6161632dd620511bf Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Oct 2023 08:59:24 +0200 Subject: [PATCH] Added new controller --- .../r11/tools/controller/XmlController.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/XmlController.java diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlController.java new file mode 100644 index 0000000..b5ba958 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlController.java @@ -0,0 +1,94 @@ +package com.r11.tools.controller; + +import com.google.gson.Gson; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import com.r11.tools.model.XMLRequestBody; +import com.r11.tools.model.XMLResponseBody; +import com.r11.tools.model.XPathQueryResult; +import com.r11.tools.xml.XmlEngine; +import org.apache.logging.log4j.Logger; +import spark.Request; +import spark.Response; + +public class XmlController { + + private final Gson gson; + private final Logger logger; + + private final XmlEngine saxon; + private final XmlEngine xalan; + + public XmlController(Gson gson, Logger logger, XmlEngine saxon, XmlEngine xalan) { + this.gson = gson; + this.logger = logger; + this.saxon = saxon; + this.xalan = xalan; + } + + private XMLResponseBody errorResponse(String message, String processor) { + return new XMLResponseBody(message, "ERR", processor, -1); + } + + private void nonValidEngineSelectedResponse(Response response) { + XMLResponseBody responseBody = + errorResponse("Valid engines are: saxon, xalan", "N/A"); + response.body(this.gson.toJson(responseBody)); + response.status(400); + } + + @ScopedControllerManifest(method = HandlerType.POST, path = "/xpath") + public void acceptRequest(Request request, Response response) { + XMLRequestBody requestBody; + try { + requestBody = this.gson.fromJson(request.body(), XMLRequestBody.class); + } catch (Exception e) { + XMLResponseBody responseBody = errorResponse(e.getMessage(), "N/A"); + response.status(400); + response.body(this.gson.toJson(responseBody)); + return; + } + + if (requestBody.getProcessor() == null) { + nonValidEngineSelectedResponse(response); + return; + } + + switch (requestBody.getProcessor()) { + case "saxon": + process(response, requestBody, saxon); + break; + case "xalan": + process(response, requestBody, xalan); + break; + default: + nonValidEngineSelectedResponse(response); + } + } + + private void process(Response response, XMLRequestBody requestBody, XmlEngine engine) { + long timeStart = System.currentTimeMillis(); + XMLResponseBody responseBody = null; + try { + XPathQueryResult xPathQueryResult = + engine.processXPath(requestBody.getData(), requestBody.getProcess(), requestBody.getVersion()); + + response.status(200); + long duration = System.currentTimeMillis() - timeStart; + responseBody = new XMLResponseBody(xPathQueryResult.getData().trim(), + "OK", engine.getVersion(),duration); + + responseBody.setType(xPathQueryResult.getType()); + this.logger.info("Request (XPath, " + engine.getVersion() + ") processed in " + duration + " ms."); + } catch (Exception ex) { + responseBody = errorResponse(ex.getMessage(), engine.getVersion()); + response.status(400); + + this.logger.error("Error on processing XPath using " + engine.getVersion() + ". " + ex); + } finally { + response.body(this.gson.toJson(responseBody)); + } + + } + +}