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] 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