From b0b930926c1c034d52bfc1646e5128b1fdef233d Mon Sep 17 00:00:00 2001 From: Artur Kolecki Date: Thu, 2 Mar 2023 11:49:21 +0100 Subject: [PATCH] Refactored tools services endpoints system and fixed json formatter. (#91) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Artur KoĊ‚ecki Co-authored-by: Adam Bem Reviewed-on: https://gitea.release11.com/R11/release11-tools-web/pulls/91 --- Backend-libXML/main.py | 10 +- Backend/pom.xml | 2 +- .../{xslt-rest => tools-services}/Dockerfile | 0 Backend/{xslt-rest => tools-services}/pom.xml | 26 +- .../java/com/r11/tools/SparkApplication.java | 39 +++ .../java/com/r11/tools/SparkInitializer.java | 7 + .../r11/tools/controller/JsonController.java | 58 ++++ .../controller/ProcessorInfoController.java | 34 +++ .../r11/tools/controller/XPathController.java | 104 +++++++ .../r11/tools/controller/XsdController.java | 70 +++++ .../r11/tools/controller/XsltController.java | 105 +++++++ .../internal/GlobalControllerManifest.java | 14 + .../controller/internal/HandlerType.java | 7 + .../controller/internal/RestController.java | 5 + .../internal/RestControllerRegistry.java | 59 ++++ .../internal/ScopedControllerManifest.java | 15 + .../controller/internal/path/PathBuilder.java | 30 ++ .../r11/tools/xml}/NewNamespaceResolver.java | 2 +- .../main/java/com/r11/tools/xml}/Saxon.java | 4 +- .../main/java/com/r11/tools/xml}/Xalan.java | 9 +- .../tools/xml}/XalanNamespaceResolver.java | 2 +- .../src/main/resources/log4j.properties | 0 .../src/main/resources/log4j2.xml | 2 +- .../main/java/com/r11/tools/xslt/Main.java | 15 - .../com/r11/tools/xslt/SparkInitializer.java | 260 ---------------- Frontend/assets/scripts/tools/json.js | 52 +++- Frontend/tools/jsonFormatter.html | 283 +++++++++++++++--- Frontend/tools/xmlFormatter.html | 126 ++++---- Frontend/tools/xpath.html | 4 +- Frontend/tools/xsd.html | 4 +- Frontend/tools/xslt.html | 4 +- Swagger/swagger.json | 88 +++++- docker-compose.yml | 2 +- readme.md | 2 +- 34 files changed, 1000 insertions(+), 444 deletions(-) rename Backend/{xslt-rest => tools-services}/Dockerfile (100%) rename Backend/{xslt-rest => tools-services}/pom.xml (81%) create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/SparkInitializer.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/JsonController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/ProcessorInfoController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/XsdController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/XsltController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/GlobalControllerManifest.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/HandlerType.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestControllerRegistry.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/ScopedControllerManifest.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/path/PathBuilder.java rename Backend/{xslt-rest/src/main/java/com/r11/tools/xslt/processors => tools-services/src/main/java/com/r11/tools/xml}/NewNamespaceResolver.java (98%) rename Backend/{xslt-rest/src/main/java/com/r11/tools/xslt/processors => tools-services/src/main/java/com/r11/tools/xml}/Saxon.java (95%) rename Backend/{xslt-rest/src/main/java/com/r11/tools/xslt/processors => tools-services/src/main/java/com/r11/tools/xml}/Xalan.java (94%) rename Backend/{xslt-rest/src/main/java/com/r11/tools/xslt/processors => tools-services/src/main/java/com/r11/tools/xml}/XalanNamespaceResolver.java (99%) rename Backend/{xslt-rest => tools-services}/src/main/resources/log4j.properties (100%) rename Backend/{xslt-rest => tools-services}/src/main/resources/log4j2.xml (86%) delete mode 100644 Backend/xslt-rest/src/main/java/com/r11/tools/xslt/Main.java delete mode 100644 Backend/xslt-rest/src/main/java/com/r11/tools/xslt/SparkInitializer.java diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 55582cd..117b089 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -96,23 +96,23 @@ def process_xml(request: request, type: str) -> str: return json.dumps(response_json), code -@app.route("/xpathpost", methods=["POST"]) +@app.route("/xpath", methods=["POST"]) def xpath(): return process_xml(request, "xpath") -@app.route("/xsdpost", methods=["POST"]) +@app.route("/xsd", methods=["POST"]) def xsd(): return process_xml(request, "xsd") -@app.route("/xsltpost", methods=["POST"]) +@app.route("/xslt", methods=["POST"]) def xslt(): return process_xml(request, "xslt") -@app.route("/prettifypost", methods=["POST"]) +@app.route("/prettify", methods=["POST"]) def prettify(): return process_xml(request, "prettify") -@app.route("/minimizepost", methods=["POST"]) +@app.route("/minimize", methods=["POST"]) def minimize(): return process_xml(request, "minimize") diff --git a/Backend/pom.xml b/Backend/pom.xml index e6ca669..4983597 100644 --- a/Backend/pom.xml +++ b/Backend/pom.xml @@ -19,7 +19,7 @@ pom - xslt-rest + tools-services mocked-services \ No newline at end of file diff --git a/Backend/xslt-rest/Dockerfile b/Backend/tools-services/Dockerfile similarity index 100% rename from Backend/xslt-rest/Dockerfile rename to Backend/tools-services/Dockerfile diff --git a/Backend/xslt-rest/pom.xml b/Backend/tools-services/pom.xml similarity index 81% rename from Backend/xslt-rest/pom.xml rename to Backend/tools-services/pom.xml index 4f593b2..6e02cfc 100644 --- a/Backend/xslt-rest/pom.xml +++ b/Backend/tools-services/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.r11.tools - xslt-rest + tools-services 1.0-SNAPSHOT @@ -15,24 +15,11 @@ 2.14.1 2.0.6 2.19.0 + 2.10.1 - - - - - - - - - - - - - - maven-compiler-plugin 3.8.1 @@ -51,7 +38,7 @@ true lib/ - com.r11.tools.xslt.Main + com.r11.tools.SparkInitializer @@ -82,6 +69,11 @@ + + com.google.code.gson + gson + ${gson.version} + com.fasterxml.jackson.core jackson-core @@ -142,7 +134,5 @@ log4j-api ${log4j.version} - - \ No newline at end of file diff --git a/Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java b/Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java new file mode 100644 index 0000000..4e8512c --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java @@ -0,0 +1,39 @@ +package com.r11.tools; + +import com.r11.tools.controller.JsonController; +import com.r11.tools.controller.ProcessorInfoController; +import com.r11.tools.controller.XPathController; +import com.r11.tools.controller.XsdController; +import com.r11.tools.controller.XsltController; +import com.r11.tools.controller.internal.RestControllerRegistry; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import spark.Spark; + +public class SparkApplication { + + public static void run() { + // TODO: read port from config + Spark.port(8081); + + Spark.after((request, response) -> { + response.header("Access-Control-Allow-Origin", "*"); + response.header("access-control-allow-headers", "*"); + response.header("access-control-expose-headers", "*"); + response.header("Access-Control-Allow-Methods", "POST"); + }); + + Logger logger = LogManager.getLogger(SparkApplication.class); + + RestControllerRegistry registry = new RestControllerRegistry(); + registry.registerController(new ProcessorInfoController(logger)); + registry.registerController(new XsdController(logger)); + registry.registerController(new XPathController(logger)); + registry.registerController(new XsltController(logger)); + registry.registerController(new JsonController()); + + registry.register(); + + logger.info("Server is online at port: " + Spark.port()); + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/SparkInitializer.java b/Backend/tools-services/src/main/java/com/r11/tools/SparkInitializer.java new file mode 100644 index 0000000..a461ee5 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/SparkInitializer.java @@ -0,0 +1,7 @@ +package com.r11.tools; + +public class SparkInitializer { + public static void main(String[] args) { + SparkApplication.run(); + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/JsonController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/JsonController.java new file mode 100644 index 0000000..581c5d8 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/JsonController.java @@ -0,0 +1,58 @@ +package com.r11.tools.controller; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.r11.tools.controller.internal.GlobalControllerManifest; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.RestController; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest(path = "/json") +public class JsonController implements RestController { + + private final Gson prettyGson = new GsonBuilder() + .disableHtmlEscaping() + .setPrettyPrinting() + .create(); + + private final Gson gson = new GsonBuilder() + .disableHtmlEscaping() + .create(); + + @ScopedControllerManifest(method = HandlerType.POST, path = "/formatting") + public void formatting(Request request, Response response) { + try { + JsonObject jsonObject = this.gson.fromJson(request.body(), JsonObject.class); + response.status(200); + response.body(this.prettyGson.toJson(jsonObject)); + } catch (Exception e) { + response.status(500); + Throwable cause = e.getCause(); + if (cause == null) { + response.body(e.getMessage()); + } else { + response.body(cause.getMessage()); + } + } + } + + @ScopedControllerManifest(method = HandlerType.POST, path = "/minimize") + public void minimize(Request request, Response response) { + try { + JsonObject jsonObject = this.prettyGson.fromJson(request.body(), JsonObject.class); + response.status(200); + response.body(this.gson.toJson(jsonObject)); + } catch (Exception e) { + response.status(500); + Throwable cause = e.getCause(); + if (cause == null) { + response.body(e.getMessage()); + } else { + response.body(cause.getMessage()); + } + } + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/ProcessorInfoController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/ProcessorInfoController.java new file mode 100644 index 0000000..2a8333c --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/ProcessorInfoController.java @@ -0,0 +1,34 @@ +package com.r11.tools.controller; + +import com.r11.tools.controller.internal.GlobalControllerManifest; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.RestController; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import com.r11.tools.xml.Saxon; +import org.apache.logging.log4j.Logger; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class ProcessorInfoController implements RestController { + + private final Logger logger; + + public ProcessorInfoController(Logger logger) { + this.logger = logger; + } + + /** + * Handler that returns processor version + */ + @ScopedControllerManifest(method = HandlerType.GET, path = "/procinfo") + public void processorInfo(Request request, Response response) { + try { + response.header("processor", "Saxon " + Saxon.getVersion() + " over s9api"); + response.body(Saxon.getVersion()); + } catch (Exception ex) { + this.logger.error("Error on retrieving engine version. " + ex); + response.body(ex.getMessage()); + } + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java new file mode 100644 index 0000000..84dc235 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java @@ -0,0 +1,104 @@ +package com.r11.tools.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.r11.tools.controller.internal.GlobalControllerManifest; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.RestController; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import com.r11.tools.xml.Saxon; +import com.r11.tools.xml.Xalan; +import java.util.HashMap; +import java.util.Map; +import org.apache.logging.log4j.Logger; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class XPathController implements RestController { + + private final Logger logger; + + public XPathController(Logger logger) { + this.logger = logger; + } + + @ScopedControllerManifest(method = HandlerType.POST, path = "/xpath") + public void transform(Request request, Response response) throws JsonProcessingException { + String body = request.body(); + ObjectMapper mapper = new ObjectMapper(); + Map requestMap = new HashMap<>(); + Map responseMap = new HashMap<>(); + try { + requestMap = mapper.readValue(body, Map.class); + } catch (JsonProcessingException ex) { + this.logger.error("Request JSON error. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("processor", "N/A"); + responseMap.put("status", "ERR"); + responseMap.put("time", "N/A"); + response.status(400); + response.body(mapper.writeValueAsString(responseMap)); + return; + } + + String data = requestMap.get("data"); + String query = requestMap.get("process"); + String processor = requestMap.get("processor"); + String version = requestMap.get("version"); + + + String tmp = ""; + long timeStart; + long duration; + + if (processor == null) { + response.body("saxon, xalan"); + return; + } + + switch (processor) { + case "saxon": + response.header("processor", "Saxon " + Saxon.getVersion() + " " + version + " over s9api"); + timeStart = System.currentTimeMillis(); + try { + tmp = Saxon.processXPath(data, query, version).trim(); + responseMap.put("result", tmp); + responseMap.put("status", "OK"); + } catch (Exception ex) { + this.logger.error("Error on processing XPath using Saxon. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("status", "ERR"); + response.status(400); + } + duration = System.currentTimeMillis() - timeStart; + this.logger.info("Request" + body + " processed in " + duration + " ms."); + responseMap.put("processor", "Saxon " + Saxon.getVersion() + " " + version + " over s9api"); + responseMap.put("time", "" + duration); + response.body(mapper.writeValueAsString(responseMap)); + return; + + case "xalan": + response.header("processor", Xalan.getVersion()); + timeStart = System.currentTimeMillis(); + try { + tmp = Xalan.processXPath(data, query).trim(); + responseMap.put("result", tmp); + responseMap.put("status", "OK"); + } catch (Exception ex) { + this.logger.error("Error on processing XPath using Xalan. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("status", "ERR"); + response.status(400); + } + duration = System.currentTimeMillis() - timeStart; + this.logger.info("Request: " + body + " processed in " + duration + " ms."); + responseMap.put("processor", Xalan.getVersion()); + responseMap.put("time", Long.toString(duration)); + response.body(mapper.writeValueAsString(responseMap)); + return; + default: + response.body("saxon, xalan"); + } + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XsdController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XsdController.java new file mode 100644 index 0000000..5e29f8a --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XsdController.java @@ -0,0 +1,70 @@ +package com.r11.tools.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.r11.tools.controller.internal.GlobalControllerManifest; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.RestController; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import com.r11.tools.xml.Xalan; +import java.util.HashMap; +import java.util.Map; +import org.apache.logging.log4j.Logger; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class XsdController implements RestController { + + private final Logger logger; + + public XsdController(Logger logger) { + this.logger = logger; + } + + @ScopedControllerManifest(method = HandlerType.POST, path = "/xsd") + public Response transform(Request req, Response resp) throws JsonProcessingException { + String body = req.body(); + + ObjectMapper mapper = new ObjectMapper(); + Map requestMap = new HashMap<>(); + Map responseMap = new HashMap<>(); + + try { + requestMap = mapper.readValue(body, Map.class); + } catch (JsonProcessingException ex) { + this.logger.error("Request JSON error. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("processor", "N/A"); + responseMap.put("status", "ERR"); + responseMap.put("time", "N/A"); + resp.status(400); + resp.body(mapper.writeValueAsString(responseMap)); + return resp; + } + + String data = requestMap.get("data"); + String xsd = requestMap.get("process"); + + resp.header("processor", Xalan.getVersion()); + long timeStart = System.currentTimeMillis(); + String tmp; + try { + tmp = Xalan.validate(data, xsd).trim(); + responseMap.put("result", tmp); + responseMap.put("status", "OK"); + } catch (Exception ex) { + this.logger.error("Error on validation against XSD using Xalan. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("status", "ERR"); + resp.status(400); + } + + long duration = System.currentTimeMillis() - timeStart; + this.logger.info("Request: " + body + " processed in " + duration + " ms."); + responseMap.put("processor", Xalan.getVersion()); + responseMap.put("time", "" + duration); + resp.body(mapper.writeValueAsString(responseMap)); + return resp; + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XsltController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XsltController.java new file mode 100644 index 0000000..56d3bff --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XsltController.java @@ -0,0 +1,105 @@ +package com.r11.tools.controller; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.r11.tools.controller.internal.GlobalControllerManifest; +import com.r11.tools.controller.internal.HandlerType; +import com.r11.tools.controller.internal.RestController; +import com.r11.tools.controller.internal.ScopedControllerManifest; +import com.r11.tools.xml.Saxon; +import com.r11.tools.xml.Xalan; +import java.util.HashMap; +import java.util.Map; +import org.apache.logging.log4j.Logger; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class XsltController implements RestController { + + private final Logger logger; + + public XsltController(Logger logger) { + this.logger = logger; + } + + @ScopedControllerManifest(method = HandlerType.POST, path = "/xslt") + public void transform(Request request, Response response) throws JsonProcessingException { + String body = request.body(); + ObjectMapper mapper = new ObjectMapper(); + Map requestMap = new HashMap<>(); + Map responseMap = new HashMap<>(); + try { + requestMap = mapper.readValue(body, Map.class); + } catch (JsonMappingException | JsonParseException ex) { + this.logger.error("Request JSON error. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("processor", "N/A"); + responseMap.put("status", "ERR"); + responseMap.put("time", "N/A"); + response.status(400); + response.body(mapper.writeValueAsString(responseMap)); + return; + } + + String data = requestMap.get("data"); + String query = requestMap.get("process"); + String processor = requestMap.get("processor"); + String version = requestMap.get("version"); + + if (processor == null) { + response.body("saxon, xalan"); + return; + } + + String tmp; + long timeStart; + long duration; + switch (processor) { + case "saxon": + timeStart = System.currentTimeMillis(); + try { + tmp = Saxon.processXSLT(data, query); + responseMap.put("result", tmp); + responseMap.put("status", "OK"); + } catch (Exception ex) { + this.logger.error("Error on processing XSLT using Saxon. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("status", "ERR"); + response.status(400); + } + + duration = System.currentTimeMillis() - timeStart; + this.logger.info("Request: " + body + " processed in " + duration + " ms."); + responseMap.put("processor", "Saxon " + Saxon.getVersion() + " " + version); + responseMap.put("time", Long.toString(duration)); + response.body(mapper.writeValueAsString(responseMap)); + return; + + case "xalan": + timeStart = System.currentTimeMillis(); + try { + tmp = Xalan.processXSLT(data, query); + responseMap.put("result", tmp); + responseMap.put("status", "OK"); + } catch (Exception ex) { + this.logger.error("Error on processing XSLT using Xalan. " + ex); + responseMap.put("result", ex.getMessage()); + responseMap.put("status", "ERR"); + response.status(400); + } + + duration = System.currentTimeMillis() - timeStart; + this.logger.info("Request: " + body + " processed in " + duration + " ms."); + responseMap.put("processor", Xalan.getVersion()); + responseMap.put("time", Long.toString(duration)); + response.body(mapper.writeValueAsString(responseMap)); + return; + + default: + response.body("saxon, xalan"); + } + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/GlobalControllerManifest.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/GlobalControllerManifest.java new file mode 100644 index 0000000..6ccee1d --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/GlobalControllerManifest.java @@ -0,0 +1,14 @@ +package com.r11.tools.controller.internal; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface GlobalControllerManifest { + + String path() default ""; +} \ No newline at end of file diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/HandlerType.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/HandlerType.java new file mode 100644 index 0000000..d65b4b5 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/HandlerType.java @@ -0,0 +1,7 @@ +package com.r11.tools.controller.internal; + +public enum HandlerType { + + GET, POST, PUT, DELETE + +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestController.java new file mode 100644 index 0000000..a9934aa --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestController.java @@ -0,0 +1,5 @@ +package com.r11.tools.controller.internal; + +public interface RestController { + +} \ No newline at end of file diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestControllerRegistry.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestControllerRegistry.java new file mode 100644 index 0000000..7f25eb6 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestControllerRegistry.java @@ -0,0 +1,59 @@ +package com.r11.tools.controller.internal; + +import com.r11.tools.controller.internal.path.PathBuilder; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; +import spark.Spark; + +public class RestControllerRegistry { + + private final Set registeredControllers; + + public RestControllerRegistry() { + this.registeredControllers = new HashSet<>(); + } + + public void registerController(RestController restController) { + this.registeredControllers.add(restController); + } + + public void register() { + this.registeredControllers.forEach(controller -> { + if (controller.getClass().isAnnotationPresent(GlobalControllerManifest.class)) { + for (Method method : controller.getClass().getMethods()) { + this.registerAssignableHandlers(controller.getClass(), controller, method); + } + } + }); + } + + private void registerAssignableHandlers(Class parent, RestController parentValue, Method method) { + if ( + (parent.isAnnotationPresent(GlobalControllerManifest.class)) && + (method.isAnnotationPresent(ScopedControllerManifest.class)) + ) { + HandlerType handlerType = method.getAnnotation(ScopedControllerManifest.class).method(); + + String path = PathBuilder.resolvePathOf( + parent.getAnnotation(GlobalControllerManifest.class).path(), + method.getAnnotation(ScopedControllerManifest.class).path() + ); + + switch (handlerType) { + case GET: + Spark.get(path, (request, response) -> method.invoke(parentValue, request, response)); + break; + case PUT: + Spark.put(path, (request, response) -> method.invoke(parentValue, request, response)); + break; + case POST: + Spark.post(path, (request, response) -> method.invoke(parentValue, request, response)); + break; + case DELETE: + Spark.delete(path, (request, response) -> method.invoke(parentValue, request, response)); + break; + } + } + } +} \ No newline at end of file diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/ScopedControllerManifest.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/ScopedControllerManifest.java new file mode 100644 index 0000000..5e6034e --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/ScopedControllerManifest.java @@ -0,0 +1,15 @@ +package com.r11.tools.controller.internal; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ScopedControllerManifest { + + HandlerType method(); + + String path(); +} \ No newline at end of file diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/path/PathBuilder.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/path/PathBuilder.java new file mode 100644 index 0000000..7308e92 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/path/PathBuilder.java @@ -0,0 +1,30 @@ +package com.r11.tools.controller.internal.path; + +public final class PathBuilder { + + private static final String PATH_SEPARATOR = "/"; + + private PathBuilder() { + + } + + public static String resolvePathOf(String globalPath, String scopedPath) { + String resolvedPath = + PathBuilder.removeTrailingPathSeparator(globalPath) + + PathBuilder.removeTrailingPathSeparator(scopedPath); + + if (resolvedPath.endsWith(PATH_SEPARATOR)) { + resolvedPath = resolvedPath.substring(0, resolvedPath.length() - 1); + } + + return PATH_SEPARATOR + resolvedPath; + } + + private static String removeTrailingPathSeparator(String path) { + if (path.endsWith(PATH_SEPARATOR)) { + return path.substring(0, path.length() - 1); + } + + return path; + } +} \ No newline at end of file diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/NewNamespaceResolver.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/NewNamespaceResolver.java similarity index 98% rename from Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/NewNamespaceResolver.java rename to Backend/tools-services/src/main/java/com/r11/tools/xml/NewNamespaceResolver.java index ba8a439..4150d70 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/NewNamespaceResolver.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/NewNamespaceResolver.java @@ -1,4 +1,4 @@ -package com.r11.tools.xslt.processors; +package com.r11.tools.xml; import net.sf.saxon.om.NamespaceMap; import net.sf.saxon.s9api.XPathCompiler; diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Saxon.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java similarity index 95% rename from Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Saxon.java rename to Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java index f4f10fe..567c889 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Saxon.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java @@ -1,8 +1,6 @@ -package com.r11.tools.xslt.processors; +package com.r11.tools.xml; import net.sf.saxon.s9api.*; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import javax.xml.transform.stream.StreamSource; import java.io.StringReader; diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java similarity index 94% rename from Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java rename to Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java index 85fb7e7..c67168a 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java @@ -1,8 +1,5 @@ -package com.r11.tools.xslt.processors; +package com.r11.tools.xml; -import net.sf.saxon.lib.RawResult; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -19,10 +16,6 @@ import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathFactory; import java.io.*; /** diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/XalanNamespaceResolver.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/XalanNamespaceResolver.java similarity index 99% rename from Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/XalanNamespaceResolver.java rename to Backend/tools-services/src/main/java/com/r11/tools/xml/XalanNamespaceResolver.java index ca6d194..c6f27cf 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/XalanNamespaceResolver.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/XalanNamespaceResolver.java @@ -1,4 +1,4 @@ -package com.r11.tools.xslt.processors; +package com.r11.tools.xml; import org.w3c.dom.*; diff --git a/Backend/xslt-rest/src/main/resources/log4j.properties b/Backend/tools-services/src/main/resources/log4j.properties similarity index 100% rename from Backend/xslt-rest/src/main/resources/log4j.properties rename to Backend/tools-services/src/main/resources/log4j.properties diff --git a/Backend/xslt-rest/src/main/resources/log4j2.xml b/Backend/tools-services/src/main/resources/log4j2.xml similarity index 86% rename from Backend/xslt-rest/src/main/resources/log4j2.xml rename to Backend/tools-services/src/main/resources/log4j2.xml index f0933e3..98a7838 100644 --- a/Backend/xslt-rest/src/main/resources/log4j2.xml +++ b/Backend/tools-services/src/main/resources/log4j2.xml @@ -11,7 +11,7 @@ - + diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/Main.java b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/Main.java deleted file mode 100644 index 0ed6142..0000000 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.r11.tools.xslt; - -/** - * Application initializer - * @author Wojciech Czop - */ -public class Main { - /** - * Initializes the application - * @param args - */ - public static void main(String[] args) { - SparkInitializer.run(); - } -} diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/SparkInitializer.java b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/SparkInitializer.java deleted file mode 100644 index 99a6133..0000000 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/SparkInitializer.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.r11.tools.xslt; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.r11.tools.xslt.processors.Saxon; -import com.r11.tools.xslt.processors.Xalan; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import spark.*; - -import java.util.HashMap; -import java.util.Map; - -/** - * Class contains spark configuration and method initializing spark framework - * @author Wojciech Czop - */ -public class SparkInitializer { - - private static final Logger LOG = LogManager.getLogger(SparkInitializer.class); - - /** - * Initializes spark framework - */ - public static void run(){ -// TODO: Port value as property - Spark.port(8081); - - Spark.after((request, response) -> { - response.header("Access-Control-Allow-Origin", "*"); - response.header("access-control-allow-headers", "*"); - response.header("access-control-expose-headers", "*"); - response.header("Access-Control-Allow-Methods", "POST"); - }); - - Spark.post("/xsltpost", xsltHandler); - Spark.post("/xpathpost", xpathHandler); - Spark.post("/xsdpost", xsdHandler); - Spark.get("/procinfo", procinfoHandler); - - LOG.info("Server is online at port: " + Spark.port()); - } - - /** - * Handler that returns processor version - */ - private static final Route procinfoHandler = (Request req, Response resp) -> { - try { - resp.header("processor", "Saxon " + Saxon.getVersion() + " over s9api"); - return Saxon.getVersion(); - } catch (Exception ex) { - LOG.error("Error on retrieving engine version. " + ex); - return ex.getMessage(); - } - }; - - /** - * Handler that returns info if document is valid - * Also provides info about request time and processor - */ - private static final Route xsdHandler = (Request req, Response resp) -> { - String body = req.body(); - ObjectMapper mapper = new ObjectMapper(); - Map requestMap = new HashMap<>(); - Map responseMap = new HashMap<>(); - try { - requestMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException | JsonParseException ex) { - LOG.error("Request JSON error. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("processor", "N/A"); - responseMap.put("status", "ERR"); - responseMap.put("time", "N/A"); - resp.status(400); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - } - - String data = requestMap.get("data"); - String xsd = requestMap.get("process"); - - resp.header("processor", Xalan.getVersion()); - long timeStart = System.currentTimeMillis(); - String tmp; - try { - tmp = Xalan.validate(data, xsd).trim(); - responseMap.put("result", tmp); - responseMap.put("status", "OK"); - } catch (Exception ex) { - LOG.error("Error on validation against XSD using Xalan. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("status", "ERR"); - resp.status(400); - } - long duration = System.currentTimeMillis() - timeStart; - LOG.info("Request: " + body + " processed in " + duration + " ms."); - responseMap.put("processor", Xalan.getVersion()); - responseMap.put("time", "" + duration); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - }; - - /** - * Handler that returns output of xpath query and processor data - */ - private static final Route xpathHandler = (Request req, Response resp) -> { - String body = req.body(); - ObjectMapper mapper = new ObjectMapper(); - Map requestMap = new HashMap<>(); - Map responseMap = new HashMap<>(); - try { - requestMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException | JsonParseException ex) { - LOG.error("Request JSON error. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("processor", "N/A"); - responseMap.put("status", "ERR"); - responseMap.put("time", "N/A"); - resp.status(400); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - } - - String data = requestMap.get("data"); - String query = requestMap.get("process"); - String processor = requestMap.get("processor"); - String version = requestMap.get("version"); - - - String tmp = ""; - long timeStart; - long duration; - - if (processor == null) { - return "saxon, xalan"; - } - - switch (processor) { - case "saxon": - resp.header("processor", "Saxon " + Saxon.getVersion() + " " + version + " over s9api"); - timeStart = System.currentTimeMillis(); - try { - tmp = Saxon.processXPath(data, query, version).trim(); - responseMap.put("result", tmp); - responseMap.put("status", "OK"); - } catch (Exception ex) { - LOG.error("Error on processing XPath using Saxon. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("status", "ERR"); - resp.status(400); - } - duration = System.currentTimeMillis() - timeStart; - LOG.info("Request" + body + " processed in " + duration + " ms."); - responseMap.put("processor", "Saxon " + Saxon.getVersion() + " " + version + " over s9api"); - responseMap.put("time", "" + duration); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - - case "xalan": - resp.header("processor", Xalan.getVersion()); - timeStart = System.currentTimeMillis(); - try { - tmp = Xalan.processXPath(data, query).trim(); - responseMap.put("result", tmp); - responseMap.put("status", "OK"); - } catch (Exception ex) { - LOG.error("Error on processing XPath using Xalan. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("status", "ERR"); - resp.status(400); - } - duration = System.currentTimeMillis() - timeStart; - LOG.info("Request: " + body + " processed in " + duration + " ms."); - responseMap.put("processor", Xalan.getVersion()); - responseMap.put("time", Long.toString(duration)); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - - default: - return "saxon, xalan"; - } - }; - - /** - * Handler that returns outcome of xslt transformation and processor data - */ - private static final Route xsltHandler = (Request req, Response resp) -> { - String body = req.body(); - ObjectMapper mapper = new ObjectMapper(); - Map requestMap = new HashMap<>(); - Map responseMap = new HashMap<>(); - try { - requestMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException | JsonParseException ex) { - LOG.error("Request JSON error. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("processor", "N/A"); - responseMap.put("status", "ERR"); - responseMap.put("time", "N/A"); - resp.status(400); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - } - String data = requestMap.get("data"); - String query = requestMap.get("process"); - String processor = requestMap.get("processor"); - String version = requestMap.get("version"); - - if (processor == null) { - return "saxon, xalan"; - } - - String tmp; - long timeStart; - long duration; - switch (processor) { - case "saxon": - timeStart = System.currentTimeMillis(); - try { - tmp = Saxon.processXSLT(data, query); - responseMap.put("result", tmp); - responseMap.put("status", "OK"); - } catch (Exception ex) { - LOG.error("Error on processing XSLT using Saxon. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("status", "ERR"); - resp.status(400); - } - duration = System.currentTimeMillis() - timeStart; - LOG.info("Request: " + body + " processed in " + duration + " ms."); - responseMap.put("processor", "Saxon " + Saxon.getVersion() + " " + version); - responseMap.put("time", Long.toString(duration)); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - - case "xalan": - timeStart = System.currentTimeMillis(); - try { - tmp = Xalan.processXSLT(data, query); - responseMap.put("result", tmp); - responseMap.put("status", "OK"); - } catch (Exception ex) { - LOG.error("Error on processing XSLT using Xalan. " + ex); - responseMap.put("result", ex.getMessage()); - responseMap.put("status", "ERR"); - resp.status(400); - } - duration = System.currentTimeMillis() - timeStart; - LOG.info("Request: " + body + " processed in " + duration + " ms."); - responseMap.put("processor", Xalan.getVersion()); - responseMap.put("time", Long.toString(duration)); - resp.body(mapper.writeValueAsString(responseMap)); - return resp; - - default: - return "saxon, xalan"; - } - }; -} diff --git a/Frontend/assets/scripts/tools/json.js b/Frontend/assets/scripts/tools/json.js index 6e448b1..04e2c55 100644 --- a/Frontend/assets/scripts/tools/json.js +++ b/Frontend/assets/scripts/tools/json.js @@ -1,39 +1,63 @@ function formatAndValidateJson(errorElement) { const input = document.querySelector('#jsonBlock'); const processInfo = document.getElementById(errorElement); + const start = new Date(); - try { - const start = new Date(); + const address = window.location.protocol + "//" + window.location.hostname + ":" + 8081 + "/json/formatting" - const obj = JSON.parse(input.textContent); - input.innerHTML = JSON.stringify(obj, null, 2); + fetch(address, { + method: 'POST', + body: input.textContent + }) + .then(async (response) => { + if (!response.ok) { + throw Error(await response.text()); + } + + return response.text(); + }) + .then((data) => { + input.innerText = data; processInfo.innerText = ""; hljs.highlightElement(input); const end = new Date(); processInfo.innerHTML = "Validation and formatting time: " + (end.getMilliseconds() - start.getMilliseconds()) + "ms"; - } catch (error) { + }) + .catch((error) => { processInfo.innerHTML = "" + error + ""; - console.error("Error: ", error) - } + console.error('Error:', error); + }); } function minimizeJson(errorElement) { const input = document.querySelector('#jsonBlock'); const processInfo = document.getElementById(errorElement); - try { - const start = new Date(); + const start = new Date(); + const address = window.location.protocol + "//" + window.location.hostname + ":" + 8081 + "/json/minimize" - const obj = JSON.parse(input.textContent); - input.innerHTML = JSON.stringify(obj); + fetch(address, { + method: 'POST', + body: input.textContent + }) + .then(async (response) => { + if (!response.ok) { + throw Error(await response.text()); + } + + return response.text(); + }) + .then((data) => { + input.innerText = data; processInfo.innerText = ""; hljs.highlightElement(input); const end = new Date(); processInfo.innerHTML = "Validation and formatting time: " + (end.getMilliseconds() - start.getMilliseconds()) + "ms"; - } catch (error) { + }) + .catch((error) => { processInfo.innerHTML = "" + error + ""; - console.error("Error: ", error) - } + console.error('Error:', error); + }); } \ No newline at end of file diff --git a/Frontend/tools/jsonFormatter.html b/Frontend/tools/jsonFormatter.html index 05a3b6e..8fe6ee2 100644 --- a/Frontend/tools/jsonFormatter.html +++ b/Frontend/tools/jsonFormatter.html @@ -1,54 +1,251 @@ - - - + + + - - - - - - - - + + + + + + + + - -
-
-
-
-

Online JSON Formatter

+ +
+
+
+
+

Online JSON Formatter

+
+ +

+ +
+            {"enter": "your", "json": "here"}
+          
+ + + +
- -

- -
-          {"enter": "your", "json": "here"}
-        
- - - -
+ +
+

What is this?

+

This tool has 2 main functions: +

    +
  • Prettify JSON to make it human-readable (add indentation etc.)
  • +
  • Minimize JSON to make it more compact (exactly opposite to above)
  • +
+

+
+
-
-

What is this?

-

This tool has 2 main functions: -

    -
  • Prettify JSON to make it human-readable (add indentation etc.)
  • -
  • Minimize JSON to make it more compact (exactly opposite to above)
  • -
-

-
+ + diff --git a/Frontend/tools/xmlFormatter.html b/Frontend/tools/xmlFormatter.html index 7ac84d2..02a23d4 100644 --- a/Frontend/tools/xmlFormatter.html +++ b/Frontend/tools/xmlFormatter.html @@ -1,79 +1,79 @@ - - - - - - - + + + + + + + - -
-
-
-
-

Online XML Formatter

-
- - -
-
-
- + +
+
+
+
+

Online XML Formatter

-
- - + + +
+
+
+ +
+
+ + +
+
+ +

+ + +
- - -

- - -
-
-
-

What is this?

-

This tool has 2 main functions: -

    -
  • Prettify XML to make it human-readable (add indentation etc.)
  • -
  • Minimize XML to make it more compact (exactly opposite to above)
  • -
-

+
+

What is this?

+

This tool has 2 main functions: +

    +
  • Prettify XML to make it human-readable (add indentation etc.)
  • +
  • Minimize XML to make it more compact (exactly opposite to above)
  • +
+

+
+ + +
+ - - - + diff --git a/Frontend/tools/xpath.html b/Frontend/tools/xpath.html index ad29e18..9179a2f 100644 --- a/Frontend/tools/xpath.html +++ b/Frontend/tools/xpath.html @@ -40,7 +40,7 @@ + onclick="performFormatRequest('prettify', true, 'xmlArea', 'xmlArea')">Format XML
@@ -59,7 +59,7 @@ onfocus="clearDefaultContent(this, 'Insert XPath expression here');">


diff --git a/Frontend/tools/xsd.html b/Frontend/tools/xsd.html index 749021e..d39ff63 100644 --- a/Frontend/tools/xsd.html +++ b/Frontend/tools/xsd.html @@ -28,7 +28,7 @@ + onclick="performFormatRequest('prettify', true, 'xmlArea', 'xmlArea')">Format XML
@@ -50,7 +50,7 @@ onfocus="clearDefaultContent(this, 'Insert XSD here');">
+ onclick="performRequest('xsd', true, true)">Verify XSD

diff --git a/Frontend/tools/xslt.html b/Frontend/tools/xslt.html index 83721d5..90d0abe 100644 --- a/Frontend/tools/xslt.html +++ b/Frontend/tools/xslt.html @@ -29,7 +29,7 @@ + onclick="performFormatRequest('prettify', true, 'xmlArea', 'xmlArea')">Format XML
@@ -52,7 +52,7 @@ onfocus="clearDefaultContent(this, 'Insert XSLT here');">
+ onclick="performRequest('xslt', true, true)">Execute XSLT transform

diff --git a/Swagger/swagger.json b/Swagger/swagger.json index d180a3d..5732422 100644 --- a/Swagger/swagger.json +++ b/Swagger/swagger.json @@ -423,7 +423,89 @@ } } }, - "/xpathpost": { + "/json/formatting": { + "post": { + "tags": [ + "JSON" + ], + "summary": "Json validation and formatting.", + "description": "", + "operationId": "json", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "request", + "description": "A transform that is to be performed", + "required": true, + "schema": { + "example": "{'a': 'b', 'c': 'd'}" + } + } + ], + "responses": { + "200": { + "description": "Formatted JSON", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Error message from json formatting.", + "schema": { + "type": "string" + } + } + } + } + }, + "/json/minimize": { + "post": { + "tags": [ + "JSON" + ], + "summary": "Json validation and minimize formatting.", + "description": "", + "operationId": "json", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "request", + "description": "A transform that is to be performed", + "required": true, + "schema": { + "example": "{'a': 'b', 'c': 'd'}" + } + } + ], + "responses": { + "200": { + "description": "Formatted JSON", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Error message from json formatting.", + "schema": { + "type": "string" + } + } + } + } + }, + "/xpath": { "post": { "tags": [ "XPath" @@ -470,7 +552,7 @@ } } }, - "/xsltpost": { + "/xslt": { "post": { "tags": [ "XSLT" @@ -517,7 +599,7 @@ } } }, - "/xsdpost": { + "/xsd": { "post": { "tags": [ "XSD" diff --git a/docker-compose.yml b/docker-compose.yml index baed536..fa20468 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: - 8086:80 xmltools-backend: - build: ./Backend/xslt-rest + build: ./Backend/tools-services container_name: xmltools-backend image: xmltools-backend ports: diff --git a/readme.md b/readme.md index 30694c5..e0e9ba1 100644 --- a/readme.md +++ b/readme.md @@ -11,7 +11,7 @@ Service is split into three microservices. Main page is hosted on port 8086. ## API Documentation -API documentation is available on port 8080/swagger/ +API documentation is available on port 8000/swagger/ ## JavaSpark backend Backend is hosted by default on port 8081. Rest api documentation is contained in OpenApi document