From 6926d90d13cf01e80342c58b4f7e4ef21329f50a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Ko=C5=82ecki?= Date: Wed, 1 Mar 2023 14:42:01 +0100 Subject: [PATCH 01/11] Refactored tools services endpoints system. --- Backend/pom.xml | 2 +- .../{xslt-rest => tools-services}/Dockerfile | 0 Backend/{xslt-rest => tools-services}/pom.xml | 20 +- .../java/com/r11/tools/SparkApplication.java | 39 +++ .../java/com/r11/tools/SparkInitializer.java | 7 + .../r11/tools/controller/JsonController.java | 17 ++ .../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 | 54 ++++ .../internal/ScopedControllerManifest.java | 15 + .../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/tools/jsonFormatter.html | 122 +++++--- Frontend/tools/xmlFormatter.html | 126 ++++----- readme.md | 2 +- 26 files changed, 622 insertions(+), 415 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 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/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..9ac56d7 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 @@ -19,20 +19,6 @@ - - - - - - - - - - - - - - maven-compiler-plugin 3.8.1 @@ -51,7 +37,7 @@ true lib/ - com.r11.tools.xslt.Main + com.r11.tools.SparkInitializer @@ -142,7 +128,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..aab6bc2 --- /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..60d9270 --- /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..1e68949 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/JsonController.java @@ -0,0 +1,17 @@ +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 spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class JsonController implements RestController { + + @ScopedControllerManifest(method = HandlerType.GET, path = "/json") + public void formatting(Request request, Response response) { + response.body("Hello World!"); + } +} 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..adcbc75 --- /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..7562412 --- /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..c98ef7c --- /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..52b5cfe --- /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..7541f91 --- /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..073e4ba --- /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..f27bacd --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/RestControllerRegistry.java @@ -0,0 +1,54 @@ +package com.r11.tools.controller.internal; + +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 = 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..61be486 --- /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/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/tools/jsonFormatter.html b/Frontend/tools/jsonFormatter.html index 05a3b6e..4935d5c 100644 --- a/Frontend/tools/jsonFormatter.html +++ b/Frontend/tools/jsonFormatter.html @@ -1,54 +1,90 @@ - - - + + + - - - - - - - - + + + + + + + + - -
-
-
-
-

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..eb82781 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/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 -- 2.51.0 From 41f6cd38d36dd3c1394cb933fcfd47ec4341f87f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Ko=C5=82ecki?= Date: Wed, 1 Mar 2023 14:46:05 +0100 Subject: [PATCH 02/11] Changed endpoints names on frontend. --- Frontend/tools/xpath.html | 2 +- Frontend/tools/xsd.html | 2 +- Frontend/tools/xslt.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Frontend/tools/xpath.html b/Frontend/tools/xpath.html index ad29e18..6f541bd 100644 --- a/Frontend/tools/xpath.html +++ b/Frontend/tools/xpath.html @@ -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..efa62b0 100644 --- a/Frontend/tools/xsd.html +++ b/Frontend/tools/xsd.html @@ -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..0e36c34 100644 --- a/Frontend/tools/xslt.html +++ b/Frontend/tools/xslt.html @@ -52,7 +52,7 @@ onfocus="clearDefaultContent(this, 'Insert XSLT here');">
+ onclick="performRequest('xslt', true, true)">Execute XSLT transform

-- 2.51.0 From 4a19c45fa27ce5e509c57f18247f086361879181 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 1 Mar 2023 15:11:24 +0100 Subject: [PATCH 03/11] Fixed path to java backend --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: -- 2.51.0 From 753650f81cccc592b7de5d98842c51e4093fa57d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Ko=C5=82ecki?= Date: Wed, 1 Mar 2023 16:02:38 +0100 Subject: [PATCH 04/11] Working json formatter with xml tags support. --- Backend/tools-services/pom.xml | 6 + .../r11/tools/controller/JsonController.java | 44 ++++- .../internal/RestControllerRegistry.java | 7 +- .../controller/internal/path/PathBuilder.java | 30 ++++ Frontend/assets/scripts/tools/json.js | 35 ++-- Frontend/tools/jsonFormatter.html | 161 ++++++++++++++++++ 6 files changed, 268 insertions(+), 15 deletions(-) create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/internal/path/PathBuilder.java diff --git a/Backend/tools-services/pom.xml b/Backend/tools-services/pom.xml index 9ac56d7..6e02cfc 100644 --- a/Backend/tools-services/pom.xml +++ b/Backend/tools-services/pom.xml @@ -15,6 +15,7 @@ 2.14.1 2.0.6 2.19.0 + 2.10.1 @@ -68,6 +69,11 @@ + + com.google.code.gson + gson + ${gson.version} + com.fasterxml.jackson.core jackson-core 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 index 1e68949..8648ed8 100644 --- 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 @@ -1,5 +1,8 @@ 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; @@ -7,11 +10,46 @@ import com.r11.tools.controller.internal.ScopedControllerManifest; import spark.Request; import spark.Response; -@GlobalControllerManifest +@GlobalControllerManifest(path = "/json") public class JsonController implements RestController { - @ScopedControllerManifest(method = HandlerType.GET, path = "/json") + 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) { - response.body("Hello World!"); + try { + JsonObject jsonObject = this.gson.fromJson(request.body(), JsonObject.class); + response.status(200); + response.body(this.prettyGson.toJson(jsonObject)); + System.out.printf(response.body()); + } catch (Exception e) { + response.status(500); + Throwable cause = e.getCause(); + if (cause == null) { + response.body(e.getMessage()); + } else { + response.body(cause.getMessage()); + } + System.out.printf(response.body()); + } + } + + @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); + response.body(e.getMessage()); + } } } 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 index f27bacd..88bd537 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -33,7 +34,11 @@ public class RestControllerRegistry { (method.isAnnotationPresent(ScopedControllerManifest.class)) ) { HandlerType handlerType = method.getAnnotation(ScopedControllerManifest.class).method(); - String path = method.getAnnotation(ScopedControllerManifest.class).path(); + + String path = PathBuilder.resolvePathOf( + parent.getAnnotation(GlobalControllerManifest.class).path(), + method.getAnnotation(ScopedControllerManifest.class).path() + ); switch (handlerType) { case GET: 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..9f6c10f --- /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/Frontend/assets/scripts/tools/json.js b/Frontend/assets/scripts/tools/json.js index 6e448b1..1ce3473 100644 --- a/Frontend/assets/scripts/tools/json.js +++ b/Frontend/assets/scripts/tools/json.js @@ -1,21 +1,33 @@ 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); + }); + + const end = new Date(); + processInfo.innerHTML = "Validation and formatting time: " + (end.getMilliseconds() - start.getMilliseconds()) + "ms"; } function minimizeJson(errorElement) { @@ -31,7 +43,8 @@ function minimizeJson(errorElement) { hljs.highlightElement(input); const end = new Date(); - processInfo.innerHTML = "Validation and formatting time: " + (end.getMilliseconds() - start.getMilliseconds()) + "ms"; + processInfo.innerHTML = "Validation and formatting time: " + + (end.getMilliseconds() - start.getMilliseconds()) + "ms"; } catch (error) { processInfo.innerHTML = "" + error + ""; console.error("Error: ", error) diff --git a/Frontend/tools/jsonFormatter.html b/Frontend/tools/jsonFormatter.html index 4935d5c..8fe6ee2 100644 --- a/Frontend/tools/jsonFormatter.html +++ b/Frontend/tools/jsonFormatter.html @@ -52,6 +52,167 @@