diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py index 442484d..8d35e48 100644 --- a/Backend-libXML/Parser.py +++ b/Backend-libXML/Parser.py @@ -40,17 +40,20 @@ def formatXML(source: str, prettify: bool) -> 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) if prettify: prolog += "\n" + return prolog + etree.tostring(xml, pretty_print=True, encoding="utf-8").decode("utf-8") - return prolog + etree.tostring(xml, pretty_print=prettify).decode() + 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: """ @@ -83,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 @@ -104,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 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(): 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..88132fe --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XmlFormatterController.java @@ -0,0 +1,51 @@ +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) { + 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)); + + } + 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)); + } +} 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; + } + } +} diff --git a/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue b/Frontend/src/components/formatter/XMLButtonFormatterComponent.vue index 2274d3d..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 = "prettify" - if (props.isMinimizer) - mode = "minimize" - return document.location.protocol + "//" + document.location.hostname + "/libxml/" + mode + 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) {