From 50e4575102f7b988ee396c42ee17a53ff993816a Mon Sep 17 00:00:00 2001 From: szewczyw Date: Thu, 16 Jan 2025 17:54:59 +0100 Subject: [PATCH 1/7] Added basic formatting feature --- .../java/com/r11/tools/SparkApplication.java | 1 + .../controller/XmlFormatterController.java | 47 +++++++++++++++++++ .../com/r11/tools/model/XMLRequestBody.java | 7 +++ .../com/r11/tools/model/XMLResponseBody.java | 6 +++ .../java/com/r11/tools/xml/XmlFormatter.java | 37 +++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java create mode 100644 Backend/tools-services/src/main/java/com/r11/tools/xml/XmlFormatter.java 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 index ce40a6b..30c1905 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/SparkApplication.java @@ -44,6 +44,7 @@ public class SparkApplication { registry.registerController(new XmlController(gson, logger, saxon, xalan)); registry.registerController(new MultipleXMLController(gson,logger, saxon)); registry.registerController(new JsonController(gson, jsongson, logger)); + registry.registerController(new XmlFormatterController(gson)); registry.register(); diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java new file mode 100644 index 0000000..821990a --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java @@ -0,0 +1,47 @@ +package com.r11.tools.controller; + +import com.google.gson.Gson; +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.controller.internal.XmlJobType; +import com.r11.tools.model.XMLRequestBody; +import com.r11.tools.model.XMLResponseBody; +import com.r11.tools.xml.XmlFormatter; +import spark.Request; +import spark.Response; + +@GlobalControllerManifest +public class XmlFormatterController implements RestController { + private final Gson gson; + + public XmlFormatterController(Gson gson) { + this.gson = gson; + } + + + @ScopedControllerManifest(method = HandlerType.POST, path = "/prettify") + public void acceptRequestXslt(Request request, Response response) { + System.out.println("kurwa piwo"); + acceptRequest(request, response); + } + private void acceptRequest(Request request, Response response){ + long timeStart = System.currentTimeMillis(); + long duration; + + XmlFormatter formatter = new XmlFormatter(); + XMLRequestBody requestBody; + try { + requestBody = this.gson.fromJson(request.body(), XMLRequestBody.class); + } catch (Exception e) { + //requestErrorResponse(response, e); + return; + } + String responseString = formatter.formatXML(requestBody.getData()); + duration = System.currentTimeMillis() - timeStart; + XMLResponseBody responseBody = new XMLResponseBody(responseString,"OK",duration); + response.body(this.gson.toJson(responseBody)); + + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/model/XMLRequestBody.java b/Backend/tools-services/src/main/java/com/r11/tools/model/XMLRequestBody.java index e7b06aa..b330ba9 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/model/XMLRequestBody.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/model/XMLRequestBody.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName; /** * POJO class used to contain body of XML related requests + * * @author Adam Bem */ public class XMLRequestBody { @@ -15,6 +16,8 @@ public class XMLRequestBody { private String processor; @SerializedName("version") private String version; + @SerializedName("pretify") + private String pretif; public String getData() { return data; @@ -31,4 +34,8 @@ public class XMLRequestBody { public String getVersion() { return version; } + + public String getPretif() { + return pretif; + } } diff --git a/Backend/tools-services/src/main/java/com/r11/tools/model/XMLResponseBody.java b/Backend/tools-services/src/main/java/com/r11/tools/model/XMLResponseBody.java index 81f8d73..b5ea050 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/model/XMLResponseBody.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/model/XMLResponseBody.java @@ -2,6 +2,7 @@ package com.r11.tools.model; public class XMLResponseBody { + private String result; private String status; private String processor; @@ -10,6 +11,11 @@ public class XMLResponseBody { // Optional private String type; + public XMLResponseBody(String result, String status, long duration) { + this.result = result; + this.status = status; + this.duration = duration; + } public XMLResponseBody(String result, String status, String processor) { this.result = result; this.status = status; diff --git a/Backend/tools-services/src/main/java/com/r11/tools/xml/XmlFormatter.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/XmlFormatter.java new file mode 100644 index 0000000..8e1b768 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/XmlFormatter.java @@ -0,0 +1,37 @@ +package com.r11.tools.xml; + +import org.w3c.dom.Document; +import org.xml.sax.InputSource; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.StringReader; +import java.io.StringWriter; + +public class XmlFormatter { + public String formatXML(String inputXML) { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new InputSource(new StringReader(inputXML))); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + + StringWriter writer = new StringWriter(); + transformer.transform(new DOMSource(document), new StreamResult(writer)); + return writer.toString(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} -- 2.51.0 From 276ca1b3bd735fae5f6d18fe7e485bd866feaf3d Mon Sep 17 00:00:00 2001 From: szewczyw Date: Fri, 17 Jan 2025 09:45:24 +0100 Subject: [PATCH 2/7] Forwarded pretify request to Java backend --- .../components/formatter/XMLButtonFormatterComponent.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue b/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue index 2274d3d..e185763 100644 --- a/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue +++ b/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue @@ -26,10 +26,10 @@ function prepareRequest():Request { } function prepareURL(): string { - var mode = "prettify" + var mode = "/java/prettify" if (props.isMinimizer) - mode = "minimize" - return document.location.protocol + "//" + document.location.hostname + "/libxml/" + mode + mode = "/libxml/minimize" + return document.location.protocol + "//" + document.location.hostname + mode } function prepareRequestBody():string { -- 2.51.0 From 6137235d2caf8d074d7ea51e2db55904bae10635 Mon Sep 17 00:00:00 2001 From: szewczyw Date: Fri, 17 Jan 2025 09:51:00 +0100 Subject: [PATCH 3/7] Removed redundant log message --- .../java/com/r11/tools/controller/XmlFormatterController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java index 821990a..087aa0b 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java @@ -23,7 +23,6 @@ public class XmlFormatterController implements RestController { @ScopedControllerManifest(method = HandlerType.POST, path = "/prettify") public void acceptRequestXslt(Request request, Response response) { - System.out.println("kurwa piwo"); acceptRequest(request, response); } private void acceptRequest(Request request, Response response){ -- 2.51.0 From 5e169082fefe69fdc818349f358727ae75656fbc Mon Sep 17 00:00:00 2001 From: szewczyw Date: Fri, 17 Jan 2025 09:57:00 +0100 Subject: [PATCH 4/7] Added handling error response --- .../com/r11/tools/controller/XmlFormatterController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java index 087aa0b..88132fe 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java @@ -34,7 +34,7 @@ public class XmlFormatterController implements RestController { try { requestBody = this.gson.fromJson(request.body(), XMLRequestBody.class); } catch (Exception e) { - //requestErrorResponse(response, e); + requestErrorResponse(response, e); return; } String responseString = formatter.formatXML(requestBody.getData()); @@ -43,4 +43,9 @@ public class XmlFormatterController implements RestController { response.body(this.gson.toJson(responseBody)); } + private void requestErrorResponse(Response response, Exception ex) { + XMLResponseBody responseBody = new XMLResponseBody(ex.getMessage(), "ERR", "N/A", -1); + response.status(400); + response.body(this.gson.toJson(responseBody)); + } } -- 2.51.0 From 1056f55887a30f76574cbb2653516ab7c533bf75 Mon Sep 17 00:00:00 2001 From: szewczyw Date: Fri, 17 Jan 2025 10:25:26 +0100 Subject: [PATCH 5/7] Commmented redundat endpoints --- Backend-libXML/Parser.py | 7 ++----- Backend-libXML/main.py | 11 ++++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py index 442484d..547b5f5 100644 --- a/Backend-libXML/Parser.py +++ b/Backend-libXML/Parser.py @@ -23,7 +23,7 @@ def formatHTML(source: str, prettify: bool) -> str: return html.tostring(htmlDoc).decode().replace("\n", "").replace("> ", ">") return etree.tostring(htmlDoc, encoding='unicode', pretty_print=True) -def formatXML(source: str, prettify: bool) -> str: +def formatXML(source: str) -> str: """Method used to format XML :param source: XML to format @@ -46,10 +46,7 @@ def formatXML(source: str, prettify: bool) -> str: parser = etree.XMLParser(remove_blank_text=True) xml = etree.parse(byte_input, parser=parser) - if prettify: - prolog += "\n" - - return prolog + etree.tostring(xml, pretty_print=prettify).decode() + return prolog + etree.tostring(xml, pretty_print=False).decode() def xpath(source: str, xpath: str) -> str: diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 88550a8..52999b4 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -36,8 +36,8 @@ def process_xml(request: request, type: str) -> str: response_json['result'] = Parser.xslt(data, processorData) elif (type == "xpath"): response_json['result'], response_json['type'] = Parser.xpath(data, processorData) - elif (type == "prettify"): - response_json['result'] = Parser.formatXML(data, True) + # elif (type == "prettify"): + # response_json['result'] = Parser.formatXML(data, True) elif (type == "minimize"): response_json['result'] = Parser.formatXML(data, False) elif (type == "prettifyHtml"): @@ -77,9 +77,10 @@ def xsd(): def xslt(): return process_xml(request, "xslt") -@app.route("/prettify", methods=["POST"]) -def prettify(): - return process_xml(request, "prettify") +# Removed because lxml can't pretify +# @app.route("/prettify", methods=["POST"]) +# def prettify(): +# return process_xml(request, "prettify") @app.route("/minimize", methods=["POST"]) def minimize(): -- 2.51.0 From 8797cac3247973b3a5fe9ae29f4e69ab264f03cd Mon Sep 17 00:00:00 2001 From: szewczyw Date: Tue, 21 Jan 2025 12:04:58 +0100 Subject: [PATCH 6/7] Clear code and fix minimize --- Backend-libXML/main.py | 2 +- .../formatter/XMLButtonFormatterComponent.vue | 37 +++++++++---------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 52999b4..50d6cec 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -39,7 +39,7 @@ def process_xml(request: request, type: str) -> str: # elif (type == "prettify"): # response_json['result'] = Parser.formatXML(data, True) elif (type == "minimize"): - response_json['result'] = Parser.formatXML(data, False) + response_json['result'] = Parser.formatXML(data) elif (type == "prettifyHtml"): response_json['result'] = Parser.formatHTML(data, True) elif (type == "minimizeHtml"): diff --git a/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue b/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue index e185763..aa237a1 100644 --- a/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue +++ b/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue @@ -18,38 +18,37 @@ function process() { } function prepareRequest():Request { - var request = new Request(prepareURL(), { - body: prepareRequestBody(), - method: "POST" + return new Request(prepareURL(), { + body: prepareRequestBody(), + method: "POST" }) - return request } function prepareURL(): string { - var mode = "/java/prettify" - if (props.isMinimizer) + let mode = "/java/prettify"; + console.log("prepareUrl") + console.log(props.isMinimizer) + if (props.isMinimizer) mode = "/libxml/minimize" return document.location.protocol + "//" + document.location.hostname + mode } function prepareRequestBody():string { - var requestBody = JSON.stringify({ - "data": props.xml, - "processorData": "N/A", - "processor": "libxml", - "version": "1.0" + return JSON.stringify({ + "data": props.xml, + "processorData": "N/A", + "processor": "libxml", + "version": "1.0" }) - return requestBody } async function fetchRequest(request: Request):Promise { - var responseBody = await fetch(request) - .then(response => response.json()) - .then((body) => { - emit("update:error", body.status == "ERR") - return body - }) - return responseBody + return await fetch(request) + .then(response => response.json()) + .then((body) => { + emit("update:error", body.status == "ERR") + return body + }) } function sendProcessedData(data: JSON) { -- 2.51.0 From eb0e895eab0f93837b17bc382e0655e5126cad63 Mon Sep 17 00:00:00 2001 From: szewczyw Date: Mon, 10 Feb 2025 13:24:49 +0100 Subject: [PATCH 7/7] fixed formatXML() --- Backend-libXML/Parser.py | 17 ++++++++++------- Backend-libXML/main.py | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py index 547b5f5..8d35e48 100644 --- a/Backend-libXML/Parser.py +++ b/Backend-libXML/Parser.py @@ -23,7 +23,7 @@ def formatHTML(source: str, prettify: bool) -> str: return html.tostring(htmlDoc).decode().replace("\n", "").replace("> ", ">") return etree.tostring(htmlDoc, encoding='unicode', pretty_print=True) -def formatXML(source: str) -> str: +def formatXML(source: str, prettify: bool) -> str: """Method used to format XML :param source: XML to format @@ -40,14 +40,20 @@ def formatXML(source: str) -> str: if prolog_start != -1: prolog_end = source.find("?>") + 2 prolog = source[prolog_start:prolog_end] - source = source[prolog_end: ] - + source = source[prolog_end:].strip() + byte_input = BytesIO(source.encode("utf-8")) parser = etree.XMLParser(remove_blank_text=True) xml = etree.parse(byte_input, parser=parser) - return prolog + etree.tostring(xml, pretty_print=False).decode() + if prettify: + prolog += "\n" + return prolog + etree.tostring(xml, pretty_print=True, encoding="utf-8").decode("utf-8") + raw_xml = etree.tostring(xml, encoding="utf-8").decode("utf-8") + raw_xml = " ".join(raw_xml.split()) + + return prolog + raw_xml def xpath(source: str, xpath: str) -> str: """ @@ -80,7 +86,6 @@ def xpath(source: str, xpath: str) -> str: return result_string, "node" - def xsd(source: str, xsd: str) -> bool: """ Method used to validate XML string against XSD schema @@ -101,8 +106,6 @@ def xsd(source: str, xsd: str) -> bool: except etree.DocumentInvalid as e: return str(e) - - def xslt(source: str, xslt: str) -> str: """ Method used to transform XML string using XSLT diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 50d6cec..52999b4 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -39,7 +39,7 @@ def process_xml(request: request, type: str) -> str: # elif (type == "prettify"): # response_json['result'] = Parser.formatXML(data, True) elif (type == "minimize"): - response_json['result'] = Parser.formatXML(data) + response_json['result'] = Parser.formatXML(data, False) elif (type == "prettifyHtml"): response_json['result'] = Parser.formatHTML(data, True) elif (type == "minimizeHtml"): -- 2.51.0