From 17299a9a9419d1b869afc3fe8797cecf43eba18d Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Jan 2023 09:59:27 +0100 Subject: [PATCH 01/37] Added early version of libxml backend --- Backend-libXML/Parser.py | 56 ++++++++++++++ .../__pycache__/Parser.cpython-310.pyc | Bin 0 -> 1653 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 1419 bytes Backend-libXML/main.py | 17 +++++ Backend-libXML/sample/xpath.curl | 5 ++ Backend-libXML/sample/xpath.json | 6 ++ Backend-libXML/sample/xsd.curl | 4 + Backend-libXML/sample/xsd.json | 6 ++ Backend-libXML/sample/xslt.curl | 4 + Backend-libXML/sample/xslt.json | 6 ++ Backend-libXML/server.py | 69 ++++++++++++++++++ 11 files changed, 173 insertions(+) create mode 100644 Backend-libXML/Parser.py create mode 100644 Backend-libXML/__pycache__/Parser.cpython-310.pyc create mode 100644 Backend-libXML/__pycache__/server.cpython-310.pyc create mode 100644 Backend-libXML/main.py create mode 100644 Backend-libXML/sample/xpath.curl create mode 100644 Backend-libXML/sample/xpath.json create mode 100644 Backend-libXML/sample/xsd.curl create mode 100644 Backend-libXML/sample/xsd.json create mode 100644 Backend-libXML/sample/xslt.curl create mode 100644 Backend-libXML/sample/xslt.json create mode 100644 Backend-libXML/server.py diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py new file mode 100644 index 0000000..ca60571 --- /dev/null +++ b/Backend-libXML/Parser.py @@ -0,0 +1,56 @@ +from lxml import etree + + +def xpath(source: str, xpath: str) -> str: + """ + Method used to get nodes from XML string using XPath + :param source: XML string used for selection + :param xpath: XPath query used for selection + :return: Nodes selected using XPath + """ + root = etree.XML(source) + nsmap = root.nsmap + + # LXML doesn't accept namespace with None key, + # so it need to be deleted if exists + try: + nsmap.pop(None) + except KeyError: + print(end="") + + result = root.xpath(xpath, namespaces=nsmap) + result_string = "" + for e in result: + result_string += etree.tostring(e, pretty_print=True).decode() + "\n" + return result_string + + + +def xsd(source: str, xsd: str) -> bool: + """ + Method used to validate XML string against XSD schema + :param source: XML string used for validation + :param xsd: XSD schema to validate XML against + :return: If the validation was successful or not + """ + xml_schema = etree.XMLSchema(etree.XML(xsd)) + + xml = etree.XML(source) + + return xml_schema.validate(xml) + + +def xslt(source: str, xslt: str) -> str: + """ + Method used to transformate XML string using XSLT + :param source: Transformed XML string + :param xslt: XSLT string used to transformate XML + :return: Result of transformation + """ + xslt_transform = etree.XSLT(etree.XML(xslt)) + + xml = etree.XML(source) + + transformated = xslt_transform(xml) + print(transformated) + return str(transformated) \ No newline at end of file diff --git a/Backend-libXML/__pycache__/Parser.cpython-310.pyc b/Backend-libXML/__pycache__/Parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6014e16c40ec22553faf399efcce4c6c63a711d GIT binary patch literal 1653 zcmaJ?KW`g16eo|o(^;{VOioiID2FaW(F*9+iQO^2e6VZ;XN1}F?hq%0+OM}?$f z%Q#KR>aS4PV?Rc>t{uy@L(#9$rG1YlDY9UM0?Fg!`~Q27GFw}10^^rQfAs%O3Hb{T zt0RNM*D&2vSQJsTASHc9DN%_|6obiiGRRb_*jxULMQRqQ9H=do0X2=(e960^a-e3a zeL%Xm{sFzDOGB!?)jDL(Ol)6=^lU8sFl1KyiLLqxa?M8z_8jK7Fx_idJh`MbxuUbA zPF^H4cHXMlB~$bY-29PL9Zo!-KA;4D9-L9^0&adH6+I;&k=3+jieDr%u98_=^T*`p z+q0}rJ$ccpF|_O=xy-MKYTYGYkXibwTc_Z9e*Sw~z<8ql&?qr+S_yB&iT0v0N;@&I zrW8j{c7^kHRGk0^u1EV2SQOkDODjv!M7(pI6LbxX6;2nr??tTXO=rGpDi|>E8Yn5U6_J$o@+R;nQOD9DM8TOY5}# zY&?yo&>8muEbUfC6W*blv_q5sI*ikt-lrVGKXd9@p`i%$L{n%V!v_``%%q0W!g7n> zSa_^XE?Ld4D3k>~|MRA@crA;Ol3uUEEKlU9a$X!AJQl7$)TLa7`F(XU*S205PC;2L zm0>krGds7}7+I9Y_XFXFdcg=9#i?|{P5OYp8%zoTWmp*>g}S`KegpD*5FNI+ATJ?b zm;r_eE+#s(&&uMsi3^fj77@l~xeNCenI6D&_{iL8wUc%d_?avGH53qmB?_Oz;e9C7 z>s~pPh$rN1Bfha$Yt|)(Q0^0$4*v`gi9E@nE%v&tzzakUJKlbTOKfWX+?XQbXHj%T9d@ckbVL4SY1E|9 SUr{(Ye6TmkHru}UVdsB)p|~{w literal 0 HcmV?d00001 diff --git a/Backend-libXML/__pycache__/server.cpython-310.pyc b/Backend-libXML/__pycache__/server.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fdb3a0027d0f60b11cc74ddaea3f225ba6c6361 GIT binary patch literal 1419 zcmb_cOK%e~5VpPc?&jH)XL*OmB?kxs2_aD-R0J1Z6-5HVAzEV7rtBkl9hyc7LMm4f zcP{ObpTpHxPMo=cc+5C$;ewzNyYe^V&*Pc#c;u{7DH8bJT>8*?7ZCChC%=CjCRbqO zZviBcG$sjcQHnYPowbpILe=b5@_|TuX2N&GFqwI zL%%ubMP|wJ`8x~u&?Hf2DU*2z_ilY~c7m0-3ghz(CB%?*xVBU* zBn#wy`L^XUGLa2>I_s!Bx4u?+KQ@-#xncd>M5dox@7mqF-79lbWXR8)J^#dV(@oTH zI_^FmB=Na=_FU;U>^O4S#wqkOr zmANQa*9INcGhNu> z+8FCS(RHx;aU<1&bCAnF zcB{tL)gi!U0rfNzyAZH+dN;xz0PBGty$`4R5oQn$05k%95cNX{ClL-K96>mWa15co z4aZSKJI9~cnhgac8k_%-DMv?tP4yH;{)bf2?mXJMRB_g*TJZ#*49$@D04&FT)cD{{ zD&vah>K3-!X$0-pwqDfhS)sGOQSNRg)pB{%apNz*8rg6*$z(rP@B+XSiZw2iGTc1& P0{mW;6=`)hjw<~L)`c#S literal 0 HcmV?d00001 diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py new file mode 100644 index 0000000..9dbe0d8 --- /dev/null +++ b/Backend-libXML/main.py @@ -0,0 +1,17 @@ +import Parser + + +if __name__ == '__main__': + SOURCE = "sample/xslt.xml" + XSLT = "sample/sample.xslt" + + file = open(SOURCE, "r") + xml = file.read() + file.close() + + file = open(XSLT, "r") + xslt = file.read() + print(Parser.xslt(xml, xslt)) + + file.close() + diff --git a/Backend-libXML/sample/xpath.curl b/Backend-libXML/sample/xpath.curl new file mode 100644 index 0000000..f72790a --- /dev/null +++ b/Backend-libXML/sample/xpath.curl @@ -0,0 +1,5 @@ +#url = "localhost:8081/xpathpost" +url = "localhost:5000/xpath" +request = "POST" +data = "@xpath.json" +header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xpath.json b/Backend-libXML/sample/xpath.json new file mode 100644 index 0000000..70faa16 --- /dev/null +++ b/Backend-libXML/sample/xpath.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "/books/book[name = 'The Law of Success']", + "processor": "saxon", + "version": "2.0" +} diff --git a/Backend-libXML/sample/xsd.curl b/Backend-libXML/sample/xsd.curl new file mode 100644 index 0000000..615fff6 --- /dev/null +++ b/Backend-libXML/sample/xsd.curl @@ -0,0 +1,4 @@ +url = "http://localhost:5000/xsd" +data = "@xsd.json" +header = "Content-Type: application/json" +request = POST diff --git a/Backend-libXML/sample/xsd.json b/Backend-libXML/sample/xsd.json new file mode 100644 index 0000000..91dd2f2 --- /dev/null +++ b/Backend-libXML/sample/xsd.json @@ -0,0 +1,6 @@ +{ + "data": "TestTest3", + "process": " ", + "processor": "saxon", + "version": "1.0" +} diff --git a/Backend-libXML/sample/xslt.curl b/Backend-libXML/sample/xslt.curl new file mode 100644 index 0000000..b5099ff --- /dev/null +++ b/Backend-libXML/sample/xslt.curl @@ -0,0 +1,4 @@ +url = "http://localhost:5000/xslt" +data = "@xslt.json" +header = "Content-Type: application/json" +request = POST diff --git a/Backend-libXML/sample/xslt.json b/Backend-libXML/sample/xslt.json new file mode 100644 index 0000000..f833a40 --- /dev/null +++ b/Backend-libXML/sample/xslt.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "", + "processor": "saxon", + "version": "1.0" +} diff --git a/Backend-libXML/server.py b/Backend-libXML/server.py new file mode 100644 index 0000000..b34ce99 --- /dev/null +++ b/Backend-libXML/server.py @@ -0,0 +1,69 @@ +from flask import Flask +from flask import request +from lxml import etree +import json +import time +import Parser + + +app = Flask(__name__) + +@app.route("/xpath", methods=["POST"]) +def xpath(): + request_data = request.get_json() + xml = request_data['data'] + xpath = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xpath(xml, xpath) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) + +@app.route("/xsd", methods=["POST"]) +def xsd(): + request_data = request.get_json() + xml = request_data['data'] + xsd = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xsd(xml, xsd) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) + +@app.route("/xslt", methods=["POST"]) +def xslt(): + request_data = request.get_json() + xml = request_data['data'] + xslt = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xslt(xml, xslt) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) \ No newline at end of file From e714c3472688a72055851ad34dc61aded2862d61 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Jan 2023 11:26:41 +0100 Subject: [PATCH 02/37] Prepared dockerfile --- Backend-libXML/Dockerfile | 8 ++++ Backend-libXML/main.py | 72 ++++++++++++++++++++++++++++----- Backend-libXML/requirements.txt | 2 + Backend-libXML/sample/xsd.curl | 2 +- Backend-libXML/server.py | 69 ------------------------------- 5 files changed, 73 insertions(+), 80 deletions(-) create mode 100644 Backend-libXML/Dockerfile create mode 100644 Backend-libXML/requirements.txt delete mode 100644 Backend-libXML/server.py diff --git a/Backend-libXML/Dockerfile b/Backend-libXML/Dockerfile new file mode 100644 index 0000000..f3524b4 --- /dev/null +++ b/Backend-libXML/Dockerfile @@ -0,0 +1,8 @@ +FROM tiangolo/meinheld-gunicorn-flask:python3.9 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./main.py /app/ +COPY ./Parser.py /app/ \ No newline at end of file diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 9dbe0d8..b34ce99 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -1,17 +1,69 @@ +from flask import Flask +from flask import request +from lxml import etree +import json +import time import Parser -if __name__ == '__main__': - SOURCE = "sample/xslt.xml" - XSLT = "sample/sample.xslt" +app = Flask(__name__) - file = open(SOURCE, "r") - xml = file.read() - file.close() +@app.route("/xpath", methods=["POST"]) +def xpath(): + request_data = request.get_json() + xml = request_data['data'] + xpath = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xpath(xml, xpath) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) - file = open(XSLT, "r") - xslt = file.read() - print(Parser.xslt(xml, xslt)) +@app.route("/xsd", methods=["POST"]) +def xsd(): + request_data = request.get_json() + xml = request_data['data'] + xsd = request_data['process'] - file.close() + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xsd(xml, xsd) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) +@app.route("/xslt", methods=["POST"]) +def xslt(): + request_data = request.get_json() + xml = request_data['data'] + xslt = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xslt(xml, xslt) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) \ No newline at end of file diff --git a/Backend-libXML/requirements.txt b/Backend-libXML/requirements.txt new file mode 100644 index 0000000..d176ffe --- /dev/null +++ b/Backend-libXML/requirements.txt @@ -0,0 +1,2 @@ +lxml +flask diff --git a/Backend-libXML/sample/xsd.curl b/Backend-libXML/sample/xsd.curl index 615fff6..9c1ce6a 100644 --- a/Backend-libXML/sample/xsd.curl +++ b/Backend-libXML/sample/xsd.curl @@ -1,4 +1,4 @@ -url = "http://localhost:5000/xsd" +url = "http://localhost:8082/xsd" data = "@xsd.json" header = "Content-Type: application/json" request = POST diff --git a/Backend-libXML/server.py b/Backend-libXML/server.py deleted file mode 100644 index b34ce99..0000000 --- a/Backend-libXML/server.py +++ /dev/null @@ -1,69 +0,0 @@ -from flask import Flask -from flask import request -from lxml import etree -import json -import time -import Parser - - -app = Flask(__name__) - -@app.route("/xpath", methods=["POST"]) -def xpath(): - request_data = request.get_json() - xml = request_data['data'] - xpath = request_data['process'] - - response = dict() - start = time.time_ns() - try: - response['result'] = Parser.xpath(xml, xpath) - response['status'] = "OK" - except BaseException as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) - -@app.route("/xsd", methods=["POST"]) -def xsd(): - request_data = request.get_json() - xml = request_data['data'] - xsd = request_data['process'] - - response = dict() - start = time.time_ns() - try: - response['result'] = Parser.xsd(xml, xsd) - response['status'] = "OK" - except BaseException as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) - -@app.route("/xslt", methods=["POST"]) -def xslt(): - request_data = request.get_json() - xml = request_data['data'] - xslt = request_data['process'] - - response = dict() - start = time.time_ns() - try: - response['result'] = Parser.xslt(xml, xslt) - response['status'] = "OK" - except BaseException as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) \ No newline at end of file From e8352dfe3da77944b59a64b1a579644c42c05851 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Jan 2023 13:33:48 +0100 Subject: [PATCH 03/37] Housekeeping --- Backend-libXML/.gitignore | 3 +++ Backend-libXML/Parser.py | 21 +++++++++++++----- .../__pycache__/Parser.cpython-310.pyc | Bin 1653 -> 0 bytes .../__pycache__/server.cpython-310.pyc | Bin 1419 -> 0 bytes Backend-libXML/sample/xpath.json | 6 ----- Backend-libXML/sample/xpath/data.json | 6 +++++ Backend-libXML/sample/xpath/dataNS.json | 6 +++++ .../sample/{xpath.curl => xpath/non-ns.conf} | 2 +- Backend-libXML/sample/xpath/ns.conf | 5 +++++ Backend-libXML/sample/{ => xsd}/xsd.curl | 3 ++- Backend-libXML/sample/{ => xsd}/xsd.json | 0 Backend-libXML/sample/{ => xslt}/xslt.curl | 0 Backend-libXML/sample/{ => xslt}/xslt.json | 0 13 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 Backend-libXML/.gitignore delete mode 100644 Backend-libXML/__pycache__/Parser.cpython-310.pyc delete mode 100644 Backend-libXML/__pycache__/server.cpython-310.pyc delete mode 100644 Backend-libXML/sample/xpath.json create mode 100644 Backend-libXML/sample/xpath/data.json create mode 100644 Backend-libXML/sample/xpath/dataNS.json rename Backend-libXML/sample/{xpath.curl => xpath/non-ns.conf} (85%) create mode 100644 Backend-libXML/sample/xpath/ns.conf rename Backend-libXML/sample/{ => xsd}/xsd.curl (52%) rename Backend-libXML/sample/{ => xsd}/xsd.json (100%) rename Backend-libXML/sample/{ => xslt}/xslt.curl (100%) rename Backend-libXML/sample/{ => xslt}/xslt.json (100%) diff --git a/Backend-libXML/.gitignore b/Backend-libXML/.gitignore new file mode 100644 index 0000000..9ca9383 --- /dev/null +++ b/Backend-libXML/.gitignore @@ -0,0 +1,3 @@ +.idea +__pycache** +venv diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py index ca60571..a76f67d 100644 --- a/Backend-libXML/Parser.py +++ b/Backend-libXML/Parser.py @@ -4,20 +4,24 @@ from lxml import etree def xpath(source: str, xpath: str) -> str: """ Method used to get nodes from XML string using XPath + :param source: XML string used for selection + :type source: str :param xpath: XPath query used for selection + :type xpath: str :return: Nodes selected using XPath + :rtype: str """ + + root = etree.XML(source) nsmap = root.nsmap # LXML doesn't accept namespace with None key, # so it need to be deleted if exists - try: + if None in nsmap: nsmap.pop(None) - except KeyError: - print(end="") - + result = root.xpath(xpath, namespaces=nsmap) result_string = "" for e in result: @@ -30,8 +34,11 @@ def xsd(source: str, xsd: str) -> bool: """ Method used to validate XML string against XSD schema :param source: XML string used for validation + :type source: str :param xsd: XSD schema to validate XML against + :type xsd: str :return: If the validation was successful or not + :rtype: bool """ xml_schema = etree.XMLSchema(etree.XML(xsd)) @@ -43,9 +50,13 @@ def xsd(source: str, xsd: str) -> bool: def xslt(source: str, xslt: str) -> str: """ Method used to transformate XML string using XSLT - :param source: Transformed XML string + + :param source: XML string to transform + :type source: str :param xslt: XSLT string used to transformate XML + :type xslt: str :return: Result of transformation + :rtype: str """ xslt_transform = etree.XSLT(etree.XML(xslt)) diff --git a/Backend-libXML/__pycache__/Parser.cpython-310.pyc b/Backend-libXML/__pycache__/Parser.cpython-310.pyc deleted file mode 100644 index a6014e16c40ec22553faf399efcce4c6c63a711d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1653 zcmaJ?KW`g16eo|o(^;{VOioiID2FaW(F*9+iQO^2e6VZ;XN1}F?hq%0+OM}?$f z%Q#KR>aS4PV?Rc>t{uy@L(#9$rG1YlDY9UM0?Fg!`~Q27GFw}10^^rQfAs%O3Hb{T zt0RNM*D&2vSQJsTASHc9DN%_|6obiiGRRb_*jxULMQRqQ9H=do0X2=(e960^a-e3a zeL%Xm{sFzDOGB!?)jDL(Ol)6=^lU8sFl1KyiLLqxa?M8z_8jK7Fx_idJh`MbxuUbA zPF^H4cHXMlB~$bY-29PL9Zo!-KA;4D9-L9^0&adH6+I;&k=3+jieDr%u98_=^T*`p z+q0}rJ$ccpF|_O=xy-MKYTYGYkXibwTc_Z9e*Sw~z<8ql&?qr+S_yB&iT0v0N;@&I zrW8j{c7^kHRGk0^u1EV2SQOkDODjv!M7(pI6LbxX6;2nr??tTXO=rGpDi|>E8Yn5U6_J$o@+R;nQOD9DM8TOY5}# zY&?yo&>8muEbUfC6W*blv_q5sI*ikt-lrVGKXd9@p`i%$L{n%V!v_``%%q0W!g7n> zSa_^XE?Ld4D3k>~|MRA@crA;Ol3uUEEKlU9a$X!AJQl7$)TLa7`F(XU*S205PC;2L zm0>krGds7}7+I9Y_XFXFdcg=9#i?|{P5OYp8%zoTWmp*>g}S`KegpD*5FNI+ATJ?b zm;r_eE+#s(&&uMsi3^fj77@l~xeNCenI6D&_{iL8wUc%d_?avGH53qmB?_Oz;e9C7 z>s~pPh$rN1Bfha$Yt|)(Q0^0$4*v`gi9E@nE%v&tzzakUJKlbTOKfWX+?XQbXHj%T9d@ckbVL4SY1E|9 SUr{(Ye6TmkHru}UVdsB)p|~{w diff --git a/Backend-libXML/__pycache__/server.cpython-310.pyc b/Backend-libXML/__pycache__/server.cpython-310.pyc deleted file mode 100644 index 6fdb3a0027d0f60b11cc74ddaea3f225ba6c6361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1419 zcmb_cOK%e~5VpPc?&jH)XL*OmB?kxs2_aD-R0J1Z6-5HVAzEV7rtBkl9hyc7LMm4f zcP{ObpTpHxPMo=cc+5C$;ewzNyYe^V&*Pc#c;u{7DH8bJT>8*?7ZCChC%=CjCRbqO zZviBcG$sjcQHnYPowbpILe=b5@_|TuX2N&GFqwI zL%%ubMP|wJ`8x~u&?Hf2DU*2z_ilY~c7m0-3ghz(CB%?*xVBU* zBn#wy`L^XUGLa2>I_s!Bx4u?+KQ@-#xncd>M5dox@7mqF-79lbWXR8)J^#dV(@oTH zI_^FmB=Na=_FU;U>^O4S#wqkOr zmANQa*9INcGhNu> z+8FCS(RHx;aU<1&bCAnF zcB{tL)gi!U0rfNzyAZH+dN;xz0PBGty$`4R5oQn$05k%95cNX{ClL-K96>mWa15co z4aZSKJI9~cnhgac8k_%-DMv?tP4yH;{)bf2?mXJMRB_g*TJZ#*49$@D04&FT)cD{{ zD&vah>K3-!X$0-pwqDfhS)sGOQSNRg)pB{%apNz*8rg6*$z(rP@B+XSiZw2iGTc1& P0{mW;6=`)hjw<~L)`c#S diff --git a/Backend-libXML/sample/xpath.json b/Backend-libXML/sample/xpath.json deleted file mode 100644 index 70faa16..0000000 --- a/Backend-libXML/sample/xpath.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", - "process": "/books/book[name = 'The Law of Success']", - "processor": "saxon", - "version": "2.0" -} diff --git a/Backend-libXML/sample/xpath/data.json b/Backend-libXML/sample/xpath/data.json new file mode 100644 index 0000000..2de1632 --- /dev/null +++ b/Backend-libXML/sample/xpath/data.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "/books/book[name = 'The Law of Success']", + "processor": "saxon", + "version": "2.0" +} diff --git a/Backend-libXML/sample/xpath/dataNS.json b/Backend-libXML/sample/xpath/dataNS.json new file mode 100644 index 0000000..ec5eb94 --- /dev/null +++ b/Backend-libXML/sample/xpath/dataNS.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "/b:books/b:book[b:name = 'The Law of Success']", + "processor": "saxon", + "version": "2.0" +} diff --git a/Backend-libXML/sample/xpath.curl b/Backend-libXML/sample/xpath/non-ns.conf similarity index 85% rename from Backend-libXML/sample/xpath.curl rename to Backend-libXML/sample/xpath/non-ns.conf index f72790a..064cfbf 100644 --- a/Backend-libXML/sample/xpath.curl +++ b/Backend-libXML/sample/xpath/non-ns.conf @@ -1,5 +1,5 @@ #url = "localhost:8081/xpathpost" url = "localhost:5000/xpath" request = "POST" -data = "@xpath.json" +data = "@data.json" header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xpath/ns.conf b/Backend-libXML/sample/xpath/ns.conf new file mode 100644 index 0000000..6f098cc --- /dev/null +++ b/Backend-libXML/sample/xpath/ns.conf @@ -0,0 +1,5 @@ +#url = "localhost:8081/xpathpost" +url = "localhost:5000/xpath" +request = "POST" +data = "@dataNS.json" +header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xsd.curl b/Backend-libXML/sample/xsd/xsd.curl similarity index 52% rename from Backend-libXML/sample/xsd.curl rename to Backend-libXML/sample/xsd/xsd.curl index 9c1ce6a..b9e65d1 100644 --- a/Backend-libXML/sample/xsd.curl +++ b/Backend-libXML/sample/xsd/xsd.curl @@ -1,4 +1,5 @@ -url = "http://localhost:8082/xsd" +#url = "http://localhost:8082/xsd" +url = "http://localhost:5000/xsd" data = "@xsd.json" header = "Content-Type: application/json" request = POST diff --git a/Backend-libXML/sample/xsd.json b/Backend-libXML/sample/xsd/xsd.json similarity index 100% rename from Backend-libXML/sample/xsd.json rename to Backend-libXML/sample/xsd/xsd.json diff --git a/Backend-libXML/sample/xslt.curl b/Backend-libXML/sample/xslt/xslt.curl similarity index 100% rename from Backend-libXML/sample/xslt.curl rename to Backend-libXML/sample/xslt/xslt.curl diff --git a/Backend-libXML/sample/xslt.json b/Backend-libXML/sample/xslt/xslt.json similarity index 100% rename from Backend-libXML/sample/xslt.json rename to Backend-libXML/sample/xslt/xslt.json From 6683ef688e101ac1b76168327a402192b2a233ca Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Jan 2023 13:41:19 +0100 Subject: [PATCH 04/37] Housekeeping --- Backend-libXML/Parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py index a76f67d..3b492b1 100644 --- a/Backend-libXML/Parser.py +++ b/Backend-libXML/Parser.py @@ -17,7 +17,7 @@ def xpath(source: str, xpath: str) -> str: root = etree.XML(source) nsmap = root.nsmap - # LXML doesn't accept namespace with None key, + # LXML doesn't accept empty (None) namespace prefix, # so it need to be deleted if exists if None in nsmap: nsmap.pop(None) From 0b0f0b55d01f13d0621f5f893e8a76ae600b2064 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 10:19:06 +0100 Subject: [PATCH 05/37] Adjusted processing time measuring --- Backend-libXML/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index b34ce99..1af4e90 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -10,12 +10,12 @@ app = Flask(__name__) @app.route("/xpath", methods=["POST"]) def xpath(): + start = time.time_ns() request_data = request.get_json() xml = request_data['data'] xpath = request_data['process'] response = dict() - start = time.time_ns() try: response['result'] = Parser.xpath(xml, xpath) response['status'] = "OK" @@ -30,12 +30,12 @@ def xpath(): @app.route("/xsd", methods=["POST"]) def xsd(): + start = time.time_ns() request_data = request.get_json() xml = request_data['data'] xsd = request_data['process'] response = dict() - start = time.time_ns() try: response['result'] = Parser.xsd(xml, xsd) response['status'] = "OK" @@ -50,12 +50,12 @@ def xsd(): @app.route("/xslt", methods=["POST"]) def xslt(): + start = time.time_ns() request_data = request.get_json() xml = request_data['data'] xslt = request_data['process'] response = dict() - start = time.time_ns() try: response['result'] = Parser.xslt(xml, xslt) response['status'] = "OK" @@ -66,4 +66,4 @@ def xslt(): exec_time = (time.time_ns() - start) / 10**6 response['time'] = f"{exec_time:.03f}" response['processor'] = "libxml2 over lxml" - return json.dumps(response) \ No newline at end of file + return json.dumps(response) From a914282a5dafcb4cc09e70f0d2d39f772ea0390b Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 10:49:34 +0100 Subject: [PATCH 06/37] Added mention of new backend in readme.md --- readme.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/readme.md b/readme.md index a6dc0d9..0f7839f 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,11 @@ openapi.yml Rest API accepts xml documents, given querry and processor version to call requested xml engine to perform given operation and finally returns outcome in response body. +## Flask Python backend + +This is module providing support for processing XMLs using libxml library. It consumes same JSON as Java backend. + + ## Mocked services MockedServices is a tool that allows developer to create, in easy and simple way, http server mocked endpoints for integration tests From 3817b1ac5a4d0d841d9035408b4708bcbe5c5940 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 10:53:39 +0100 Subject: [PATCH 07/37] API now ignores content-type header (to increase compatibility with Java backend) --- Backend-libXML/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 1af4e90..3fd45e5 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -11,7 +11,7 @@ app = Flask(__name__) @app.route("/xpath", methods=["POST"]) def xpath(): start = time.time_ns() - request_data = request.get_json() + request_data = json.loads(request.get_data(as_text=True)) xml = request_data['data'] xpath = request_data['process'] @@ -31,7 +31,7 @@ def xpath(): @app.route("/xsd", methods=["POST"]) def xsd(): start = time.time_ns() - request_data = request.get_json() + request_data = json.loads(request.get_data(as_text=True)) xml = request_data['data'] xsd = request_data['process'] From 598f0746542490ef42734de0eac0959497ae8a79 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 12:21:39 +0100 Subject: [PATCH 08/37] Enchanced error handling --- Backend-libXML/main.py | 63 +++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 3fd45e5..4d8de0d 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -8,18 +8,44 @@ import Parser app = Flask(__name__) +def process_xml(request, type): + start = time.time_ns() + + response = dict() + try: + request_data = json.loads(request.get_data(as_text=True)) + xml = request_data['data'] + xsd = request_data['process'] + response['result'] = Parser.xsd(xml, xsd) + response['status'] = "OK" + except KeyError as e: + response['result'] = "Missing key: " + str(e) + response['status'] = "ERR" + except Exception as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) + + @app.route("/xpath", methods=["POST"]) def xpath(): start = time.time_ns() - request_data = json.loads(request.get_data(as_text=True)) - xml = request_data['data'] - xpath = request_data['process'] response = dict() try: + request_data = json.loads(request.get_data(as_text=True)) + xml = request_data['data'] + xpath = request_data['process'] response['result'] = Parser.xpath(xml, xpath) response['status'] = "OK" - except BaseException as e: + except KeyError as e: + response['result'] = "Missing key: " + str(e) + response['status'] = "ERR" + except Exception as e: response['result'] = str(e) response['status'] = "ERR" finally: @@ -30,36 +56,23 @@ def xpath(): @app.route("/xsd", methods=["POST"]) def xsd(): - start = time.time_ns() - request_data = json.loads(request.get_data(as_text=True)) - xml = request_data['data'] - xsd = request_data['process'] - - response = dict() - try: - response['result'] = Parser.xsd(xml, xsd) - response['status'] = "OK" - except BaseException as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) + return process_xml(request, "xsd") @app.route("/xslt", methods=["POST"]) def xslt(): start = time.time_ns() - request_data = request.get_json() - xml = request_data['data'] - xslt = request_data['process'] response = dict() try: + request_data = json.loads(request.get_data(as_text=True)) + xml = request_data['data'] + xslt = request_data['process'] response['result'] = Parser.xslt(xml, xslt) response['status'] = "OK" - except BaseException as e: + except KeyError as e: + response['result'] = "Missing key: " + str(e) + response['status'] = "ERR" + except Exception as e: response['result'] = str(e) response['status'] = "ERR" finally: From ce417f8b94ea8b1a16f41141b806de196aab796f Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 12:39:53 +0100 Subject: [PATCH 09/37] Removed duplicate code --- Backend-libXML/main.py | 70 ++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 4d8de0d..50a5c09 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -8,15 +8,34 @@ import Parser app = Flask(__name__) -def process_xml(request, type): + +def process_xml(request: request, type: str) -> str: + """Function to process + + :param request: Received request + :type request: request + :param type: Type of needed processing: xsd, xslt or xpath + :type type: str + :raises ValueError: is raised when type is different than those provided above + :return: response JSON converted to string + :rtype: str + """ start = time.time_ns() response = dict() try: request_data = json.loads(request.get_data(as_text=True)) - xml = request_data['data'] - xsd = request_data['process'] - response['result'] = Parser.xsd(xml, xsd) + data = request_data['data'] + process = request_data['process'] + if (type == "xsd"): + response['result'] = Parser.xsd(data, process) + elif (type == "xslt"): + response['result'] = Parser.xslt(data, process) + elif (type == "xpath"): + response['result'] = Parser.xpath(data, process) + else: + raise ValueError("Valid operation types are: xsd, xslt, xpath") + response['status'] = "OK" except KeyError as e: response['result'] = "Missing key: " + str(e) @@ -33,26 +52,7 @@ def process_xml(request, type): @app.route("/xpath", methods=["POST"]) def xpath(): - start = time.time_ns() - - response = dict() - try: - request_data = json.loads(request.get_data(as_text=True)) - xml = request_data['data'] - xpath = request_data['process'] - response['result'] = Parser.xpath(xml, xpath) - response['status'] = "OK" - except KeyError as e: - response['result'] = "Missing key: " + str(e) - response['status'] = "ERR" - except Exception as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) + return process_xml(request, "xpath") @app.route("/xsd", methods=["POST"]) def xsd(): @@ -60,23 +60,7 @@ def xsd(): @app.route("/xslt", methods=["POST"]) def xslt(): - start = time.time_ns() + return process_xml(request, "xslt") - response = dict() - try: - request_data = json.loads(request.get_data(as_text=True)) - xml = request_data['data'] - xslt = request_data['process'] - response['result'] = Parser.xslt(xml, xslt) - response['status'] = "OK" - except KeyError as e: - response['result'] = "Missing key: " + str(e) - response['status'] = "ERR" - except Exception as e: - response['result'] = str(e) - response['status'] = "ERR" - finally: - exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) +if __name__ == "__main__": + app.run() \ No newline at end of file From 656aeb17dcb6f185ab99ead71564dc93585adea2 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Mon, 30 Jan 2023 12:42:40 +0100 Subject: [PATCH 10/37] Updated example requests --- Backend-libXML/sample/xpath/{non-ns.conf => non-ns.curl} | 1 - Backend-libXML/sample/xpath/{ns.conf => ns.curl} | 1 - Backend-libXML/sample/xsd/xsd.curl | 1 - Backend-libXML/sample/xslt/xslt.curl | 1 - 4 files changed, 4 deletions(-) rename Backend-libXML/sample/xpath/{non-ns.conf => non-ns.curl} (70%) rename Backend-libXML/sample/xpath/{ns.conf => ns.curl} (70%) diff --git a/Backend-libXML/sample/xpath/non-ns.conf b/Backend-libXML/sample/xpath/non-ns.curl similarity index 70% rename from Backend-libXML/sample/xpath/non-ns.conf rename to Backend-libXML/sample/xpath/non-ns.curl index 064cfbf..7d4219f 100644 --- a/Backend-libXML/sample/xpath/non-ns.conf +++ b/Backend-libXML/sample/xpath/non-ns.curl @@ -2,4 +2,3 @@ url = "localhost:5000/xpath" request = "POST" data = "@data.json" -header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xpath/ns.conf b/Backend-libXML/sample/xpath/ns.curl similarity index 70% rename from Backend-libXML/sample/xpath/ns.conf rename to Backend-libXML/sample/xpath/ns.curl index 6f098cc..f439c0e 100644 --- a/Backend-libXML/sample/xpath/ns.conf +++ b/Backend-libXML/sample/xpath/ns.curl @@ -2,4 +2,3 @@ url = "localhost:5000/xpath" request = "POST" data = "@dataNS.json" -header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xsd/xsd.curl b/Backend-libXML/sample/xsd/xsd.curl index b9e65d1..2481c02 100644 --- a/Backend-libXML/sample/xsd/xsd.curl +++ b/Backend-libXML/sample/xsd/xsd.curl @@ -1,5 +1,4 @@ #url = "http://localhost:8082/xsd" url = "http://localhost:5000/xsd" data = "@xsd.json" -header = "Content-Type: application/json" request = POST diff --git a/Backend-libXML/sample/xslt/xslt.curl b/Backend-libXML/sample/xslt/xslt.curl index b5099ff..d50edd1 100644 --- a/Backend-libXML/sample/xslt/xslt.curl +++ b/Backend-libXML/sample/xslt/xslt.curl @@ -1,4 +1,3 @@ url = "http://localhost:5000/xslt" data = "@xslt.json" -header = "Content-Type: application/json" request = POST From 9ce0e6fcd3eecdb16bd77cb5835780551c406a93 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 10:34:16 +0100 Subject: [PATCH 11/37] Updated endpoint paths to match Java backend --- Backend-libXML/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 50a5c09..a38376c 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -50,15 +50,15 @@ def process_xml(request: request, type: str) -> str: return json.dumps(response) -@app.route("/xpath", methods=["POST"]) +@app.route("/xpathpost", methods=["POST"]) def xpath(): return process_xml(request, "xpath") -@app.route("/xsd", methods=["POST"]) +@app.route("/xsdpost", methods=["POST"]) def xsd(): return process_xml(request, "xsd") -@app.route("/xslt", methods=["POST"]) +@app.route("/xsltpost", methods=["POST"]) def xslt(): return process_xml(request, "xslt") From b5018dfecec4510318a0de2b84a067a0b5eac7c1 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 3 Feb 2023 12:12:17 +0100 Subject: [PATCH 12/37] Implemented dynamic host finding --- .../{tools => common}/jquery-3.6.0.slim.min.js | 0 Frontend/assets/scripts/dyn_host.js | 8 ++++++++ Frontend/assets/scripts/tools/scripts.js | 2 +- Frontend/index.html | 14 +++++++++++--- 4 files changed, 20 insertions(+), 4 deletions(-) rename Frontend/assets/scripts/{tools => common}/jquery-3.6.0.slim.min.js (100%) create mode 100644 Frontend/assets/scripts/dyn_host.js diff --git a/Frontend/assets/scripts/tools/jquery-3.6.0.slim.min.js b/Frontend/assets/scripts/common/jquery-3.6.0.slim.min.js similarity index 100% rename from Frontend/assets/scripts/tools/jquery-3.6.0.slim.min.js rename to Frontend/assets/scripts/common/jquery-3.6.0.slim.min.js diff --git a/Frontend/assets/scripts/dyn_host.js b/Frontend/assets/scripts/dyn_host.js new file mode 100644 index 0000000..0a1110f --- /dev/null +++ b/Frontend/assets/scripts/dyn_host.js @@ -0,0 +1,8 @@ +$(document).ready( function() { + document.getElementsByName("iframe")[0].src = + window.location.protocol + "//" + window.location.hostname + ":8097"; + document.getElementById("rest-mock").href = + window.location.protocol + "//" + window.location.hostname + ":8097"; + console.log("DONE") +}); + \ No newline at end of file diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index f0ced97..23818b3 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -106,7 +106,7 @@ function performRequest(text, checkXML, checkTransform){ async function restRequest(text) { const escapeChar = "specialEscapeChar"; // const addr = "http://localhost:8081/" + text; - const addr = "http://tools.zipper.release11.com" + text; + const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; var xmlData = document.getElementById("xmlArea").value.trim(); var transformData = document.getElementById("transformArea").value.trim(); diff --git a/Frontend/index.html b/Frontend/index.html index 0bb9ddf..a5647f6 100644 --- a/Frontend/index.html +++ b/Frontend/index.html @@ -4,8 +4,12 @@ + + + - + + @@ -16,16 +20,20 @@ + + From 07ab4f83a1bb2140942e43a98ee13911a5bae1ab Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 3 Feb 2023 13:32:36 +0100 Subject: [PATCH 13/37] Updated .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index ab3e096..4a86338 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ .vscode nbactions.xml target/ +__pycache__ +venv From f68217f83a2ab7b168a56c2f3fe10e110397f544 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 3 Feb 2023 14:45:39 +0100 Subject: [PATCH 14/37] Implemented dynamic host for links in mock.html --- .../src/main/resources/static/html/mock.html | 1 + .../src/main/resources/static/js/dyn_host.js | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Backend/mocked-services/src/main/resources/static/js/dyn_host.js diff --git a/Backend/mocked-services/src/main/resources/static/html/mock.html b/Backend/mocked-services/src/main/resources/static/html/mock.html index 79f52b4..f597720 100644 --- a/Backend/mocked-services/src/main/resources/static/html/mock.html +++ b/Backend/mocked-services/src/main/resources/static/html/mock.html @@ -8,6 +8,7 @@ +
diff --git a/Backend/mocked-services/src/main/resources/static/js/dyn_host.js b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js new file mode 100644 index 0000000..14f19ae --- /dev/null +++ b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js @@ -0,0 +1,25 @@ +// $(document).ready( function() { +// console.log("Here") +// let links = document.getElementsByTagName("link") +// for (let e in links) { +// let oldStr = links[e].href.split("/") +// console.log(oldStr) +// let endpoint = oldStr.slice(3).join() +// console.log(endpoint) +// e.href = window.location.protocol + "//" + window.location.hostname + "/" + endpoint +// } +// }); + +$(document).ready( function() { + console.log("Here") + let links = document.getElementsByTagName("link") + for (let i = 0; i < links.length; i++) { + let oldStr = links[i].href.split("/") + console.log(oldStr) + let endpoint = oldStr.slice(3).join("/") + console.log(endpoint) + links[i].href = window.location.protocol + "//" + window.location.hostname + ":8086/" + endpoint + } + +}); + From 06458cfd10f530ef81ef72dba2adbda00a0c0a28 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 3 Feb 2023 14:57:46 +0100 Subject: [PATCH 15/37] Removed unused code --- .../src/main/resources/static/js/dyn_host.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Backend/mocked-services/src/main/resources/static/js/dyn_host.js b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js index 14f19ae..b13a6e1 100644 --- a/Backend/mocked-services/src/main/resources/static/js/dyn_host.js +++ b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js @@ -1,23 +1,9 @@ -// $(document).ready( function() { -// console.log("Here") -// let links = document.getElementsByTagName("link") -// for (let e in links) { -// let oldStr = links[e].href.split("/") -// console.log(oldStr) -// let endpoint = oldStr.slice(3).join() -// console.log(endpoint) -// e.href = window.location.protocol + "//" + window.location.hostname + "/" + endpoint -// } -// }); - $(document).ready( function() { console.log("Here") let links = document.getElementsByTagName("link") for (let i = 0; i < links.length; i++) { let oldStr = links[i].href.split("/") - console.log(oldStr) let endpoint = oldStr.slice(3).join("/") - console.log(endpoint) links[i].href = window.location.protocol + "//" + window.location.hostname + ":8086/" + endpoint } From 7dbf3add28edb0c521cdccd8b025eb2d5bf29334 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 12:38:58 +0100 Subject: [PATCH 16/37] Added option for libXML --- Frontend/tools/xpath.html | 2 +- Frontend/tools/xsd.html | 2 +- Frontend/tools/xslt.html | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Frontend/tools/xpath.html b/Frontend/tools/xpath.html index 3d0a6b3..1d4a84d 100644 --- a/Frontend/tools/xpath.html +++ b/Frontend/tools/xpath.html @@ -24,7 +24,7 @@ - +
diff --git a/Frontend/tools/xslt.html b/Frontend/tools/xslt.html index cc77f34..f1656e9 100644 --- a/Frontend/tools/xslt.html +++ b/Frontend/tools/xslt.html @@ -19,6 +19,7 @@ procInfo

From e408840f6d7b54f482a3ebf9b9b6be9139c73380 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 12:49:36 +0100 Subject: [PATCH 17/37] Added service selection depending on selected processor --- Frontend/assets/scripts/tools/scripts.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index 23818b3..cbe6539 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -106,6 +106,10 @@ function performRequest(text, checkXML, checkTransform){ async function restRequest(text) { const escapeChar = "specialEscapeChar"; // const addr = "http://localhost:8081/" + text; + var port = ":8081/" + if (getProcessor == "libxml") { + var port = ":8085/" + } const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; var xmlData = document.getElementById("xmlArea").value.trim(); @@ -114,7 +118,7 @@ async function restRequest(text) { if(defaultStrings.includes(xmlData)){ xmlData = ""; } - + console.log(getProcessor()); // var data = xmlData.concat(escapeChar, transformData); // const url = addr.concat("?escapechar=", escapeChar, "&processor=", getProcInfo()); From c0a54291ae1c2b6df3a715e7ac530420e6206d44 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 13:14:31 +0100 Subject: [PATCH 18/37] Added service selection depending on selected processor --- Frontend/assets/scripts/tools/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index cbe6539..fcd4280 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -107,7 +107,7 @@ async function restRequest(text) { const escapeChar = "specialEscapeChar"; // const addr = "http://localhost:8081/" + text; var port = ":8081/" - if (getProcessor == "libxml") { + if (getProcessor() == "libxml") { var port = ":8085/" } const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; From 9384011377d11bbe4c57361c39821c32acb548dc Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 13:15:02 +0100 Subject: [PATCH 19/37] Added service selection depending on selected processor --- Frontend/assets/scripts/tools/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index fcd4280..b487ba8 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -108,7 +108,7 @@ async function restRequest(text) { // const addr = "http://localhost:8081/" + text; var port = ":8081/" if (getProcessor() == "libxml") { - var port = ":8085/" + port = ":8085/" } const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; From 0c5a83d3b6cffcb6fce9a5482eb52459c144c0f2 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 14:01:19 +0100 Subject: [PATCH 20/37] Added libXML backend container to docker-compose.yml --- docker-compose.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 559be61..6524db5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,13 @@ services: ports: - 8081:8081 + xmltools-libxml-backend: + build: ./Backend-libXML + container_name: xmltools-libxml-backend + image: xmltools-libxml-backend + ports: + - 8082:80 + xmltools-mocked-services: build: context: ./Backend/mocked-services From 07f2adcc1f52d45a979e0134d80570dba803eb8c Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 14:03:08 +0100 Subject: [PATCH 21/37] Corrected libxml backend port --- Frontend/assets/scripts/tools/scripts.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index b487ba8..b804784 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -108,10 +108,11 @@ async function restRequest(text) { // const addr = "http://localhost:8081/" + text; var port = ":8081/" if (getProcessor() == "libxml") { - port = ":8085/" + port = ":8082/" } - const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; - + const addr = window.location.protocol + "//" + window.location.hostname + port + text; + console.log(addr) + var xmlData = document.getElementById("xmlArea").value.trim(); var transformData = document.getElementById("transformArea").value.trim(); From 96f80e4589e93d77b04c03a8251e8d0605a46e11 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 14:28:11 +0100 Subject: [PATCH 22/37] Implemented 400 response code on error --- Backend-libXML/main.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index a38376c..a18f4e3 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -21,33 +21,35 @@ def process_xml(request: request, type: str) -> str: :rtype: str """ start = time.time_ns() - - response = dict() + code = 200 + response_json = dict() try: request_data = json.loads(request.get_data(as_text=True)) data = request_data['data'] process = request_data['process'] if (type == "xsd"): - response['result'] = Parser.xsd(data, process) + response_json['result'] = Parser.xsd(data, process) elif (type == "xslt"): - response['result'] = Parser.xslt(data, process) + response_json['result'] = Parser.xslt(data, process) elif (type == "xpath"): - response['result'] = Parser.xpath(data, process) + response_json['result'] = Parser.xpath(data, process) else: raise ValueError("Valid operation types are: xsd, xslt, xpath") - response['status'] = "OK" + response_json['status'] = "OK" except KeyError as e: - response['result'] = "Missing key: " + str(e) - response['status'] = "ERR" + response_json['result'] = "Missing key: " + str(e) + response_json['status'] = "ERR" + code = 400 except Exception as e: - response['result'] = str(e) - response['status'] = "ERR" + response_json['result'] = str(e) + response_json['status'] = "ERR" + code = 400 finally: exec_time = (time.time_ns() - start) / 10**6 - response['time'] = f"{exec_time:.03f}" - response['processor'] = "libxml2 over lxml" - return json.dumps(response) + response_json['time'] = f"{exec_time:.03f}" + response_json['processor'] = "libxml2 over lxml" + return json.dumps(response_json), code @app.route("/xpathpost", methods=["POST"]) From d2e5586792be99646ba6964a4a1ad7d636f03fe6 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Wed, 8 Feb 2023 14:31:49 +0100 Subject: [PATCH 23/37] Updated docs --- Backend-libXML/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index a18f4e3..78fc6cf 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -17,8 +17,8 @@ def process_xml(request: request, type: str) -> str: :param type: Type of needed processing: xsd, xslt or xpath :type type: str :raises ValueError: is raised when type is different than those provided above - :return: response JSON converted to string - :rtype: str + :return: response JSON converted to string and response code + :rtype: str, int """ start = time.time_ns() code = 200 From 5a2164b83954325f3a1aaf4d5c81619604cdbfba Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:21:18 +0100 Subject: [PATCH 24/37] Added Xalan option in XPath tool --- Frontend/tools/xpath.html | 1 + 1 file changed, 1 insertion(+) diff --git a/Frontend/tools/xpath.html b/Frontend/tools/xpath.html index 1d4a84d..d10a60b 100644 --- a/Frontend/tools/xpath.html +++ b/Frontend/tools/xpath.html @@ -24,6 +24,7 @@ From 45a7e60ae46461cc820a4dcdc9d611ec58088bf6 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:22:33 +0100 Subject: [PATCH 25/37] Replaced xpath handling implementation --- .../com/r11/tools/xslt/processors/Xalan.java | 74 ++++++++++++++++--- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java index 42db619..c0fb631 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java +++ b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java @@ -1,8 +1,12 @@ package com.r11.tools.xslt.processors; +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; +import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.InputSource; import javax.xml.XMLConstants; @@ -19,8 +23,7 @@ import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; -import java.io.StringReader; -import java.io.StringWriter; +import java.io.*; /** * Handler for Xalan engine @@ -53,6 +56,13 @@ public class Xalan { return sw.toString(); } + private static boolean isTextNode(Node n) { + if (n == null) + return false; + short nodeType = n.getNodeType(); + return nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.TEXT_NODE; + } + /** * Process xpath and return either node or wrapped atomic value * @deprecated @@ -62,16 +72,60 @@ public class Xalan { * @return xml processed using given xpath * @throws Exception thrown on node building errors or invalid xpath */ - public static String processXPath(String data, String transform) throws Exception{ - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); + public static String processXPath(String data, String transform) throws Exception { +// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); +// DocumentBuilder builder = factory.newDocumentBuilder(); +// +// XPath xpath = XPathFactory.newInstance().newXPath(); +// +// xpath.setNamespaceContext(new XalanNamespaceResolver(builder.parse(new InputSource(new StringReader(data))), true)); +// XPathExpression exp = xpath.compile(transform); +// exp.evaluate(new InputSource(new StringReader(data)), XPathConstants.NODESET); +// return exp.evaluate(new InputSource(new StringReader(data))); - XPath xpath = XPathFactory.newInstance().newXPath(); + //data = "/home/adam/Programowanie/Java/XML Tools/release11-tools-web/SampleData/book.xml"; + //transform = "/books/book[name = 'Hamlet']"; - xpath.setNamespaceContext(new XalanNamespaceResolver(builder.parse(new InputSource(new StringReader(data))), true)); - XPathExpression exp = xpath.compile(transform); - exp.evaluate(new InputSource(new StringReader(data)), XPathConstants.NODESET); - return exp.evaluate(new InputSource(new StringReader(data))); + + // Set up a DOM tree to query. + InputSource in = new InputSource(new StringReader(data)); + DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); + dfactory.setNamespaceAware(true); + Document doc = dfactory.newDocumentBuilder().parse(in); + + // Set up an identity transformer to use as serializer. + Transformer serializer = TransformerFactory.newInstance().newTransformer(); + serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + + // Use the simple XPath API to select a nodeIterator. + NodeIterator nl = XPathAPI.selectNodeIterator(doc, transform); + + // Serialize the found nodes to result object. + StringBuilder result = new StringBuilder(); + Node n; + while ((n = nl.nextNode())!= null) { + StringBuilder sb; + if (isTextNode(n)) { + // DOM may have more than one node corresponding to a + // single XPath text node. Coalesce all contiguous text nodes + // at this level + sb = new StringBuilder(n.getNodeValue()); + for ( + Node nn = n.getNextSibling(); + isTextNode(nn); + nn = nn.getNextSibling() + ) { + result.append(nn.getNodeValue()); + } + } else { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream))); + result.append(outputStream); + + } + result.append("\n"); + } + return result.toString(); } /** From 4b241978e053f7b94152946ee02bac4549e5cc97 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:24:28 +0100 Subject: [PATCH 26/37] Removed unused code --- .../com/r11/tools/xslt/processors/Xalan.java | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java index c0fb631..85fb7e7 100644 --- a/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java +++ b/Backend/xslt-rest/src/main/java/com/r11/tools/xslt/processors/Xalan.java @@ -65,27 +65,12 @@ public class Xalan { /** * Process xpath and return either node or wrapped atomic value - * @deprecated - * Xalan needs assumption of the outcome, which is not implemented. Therefore method is deprecated * @param data xml * @param transform xpath * @return xml processed using given xpath * @throws Exception thrown on node building errors or invalid xpath */ public static String processXPath(String data, String transform) throws Exception { -// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); -// DocumentBuilder builder = factory.newDocumentBuilder(); -// -// XPath xpath = XPathFactory.newInstance().newXPath(); -// -// xpath.setNamespaceContext(new XalanNamespaceResolver(builder.parse(new InputSource(new StringReader(data))), true)); -// XPathExpression exp = xpath.compile(transform); -// exp.evaluate(new InputSource(new StringReader(data)), XPathConstants.NODESET); -// return exp.evaluate(new InputSource(new StringReader(data))); - - //data = "/home/adam/Programowanie/Java/XML Tools/release11-tools-web/SampleData/book.xml"; - //transform = "/books/book[name = 'Hamlet']"; - // Set up a DOM tree to query. InputSource in = new InputSource(new StringReader(data)); @@ -109,19 +94,13 @@ public class Xalan { // DOM may have more than one node corresponding to a // single XPath text node. Coalesce all contiguous text nodes // at this level - sb = new StringBuilder(n.getNodeValue()); - for ( - Node nn = n.getNextSibling(); - isTextNode(nn); - nn = nn.getNextSibling() - ) { + for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) { result.append(nn.getNodeValue()); } } else { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream))); result.append(outputStream); - } result.append("\n"); } From f8d5934998d823da0238408f27de61046a5b88b9 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:33:00 +0100 Subject: [PATCH 27/37] Resolved merge conflict --- Frontend/assets/scripts/tools/scripts.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index b804784..23818b3 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -106,20 +106,15 @@ function performRequest(text, checkXML, checkTransform){ async function restRequest(text) { const escapeChar = "specialEscapeChar"; // const addr = "http://localhost:8081/" + text; - var port = ":8081/" - if (getProcessor() == "libxml") { - port = ":8082/" - } - const addr = window.location.protocol + "//" + window.location.hostname + port + text; - console.log(addr) - + const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; + var xmlData = document.getElementById("xmlArea").value.trim(); var transformData = document.getElementById("transformArea").value.trim(); if(defaultStrings.includes(xmlData)){ xmlData = ""; } - console.log(getProcessor()); + // var data = xmlData.concat(escapeChar, transformData); // const url = addr.concat("?escapechar=", escapeChar, "&processor=", getProcInfo()); From 45e46de8f50ba0ade5a39b4d188b723ac541f0b9 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:56:42 +0100 Subject: [PATCH 28/37] Fixed scripts.js --- Frontend/assets/scripts/tools/scripts.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index 23818b3..e93910f 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -106,7 +106,11 @@ function performRequest(text, checkXML, checkTransform){ async function restRequest(text) { const escapeChar = "specialEscapeChar"; // const addr = "http://localhost:8081/" + text; - const addr = window.location.protocol + "//" + window.location.hostname + ":8081/" + text; + var port = ":8081/" + if (getProcessor() == "libxml") { + port = ":8082/" + } + const addr = window.location.protocol + "//" + window.location.hostname + port + text; var xmlData = document.getElementById("xmlArea").value.trim(); var transformData = document.getElementById("transformArea").value.trim(); From c537bed4a17eb2a77f03c8624a2aaf025e086490 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 13:57:20 +0100 Subject: [PATCH 29/37] Fixed scripts.js --- Frontend/assets/scripts/tools/scripts.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Frontend/assets/scripts/tools/scripts.js b/Frontend/assets/scripts/tools/scripts.js index e93910f..085cd1a 100644 --- a/Frontend/assets/scripts/tools/scripts.js +++ b/Frontend/assets/scripts/tools/scripts.js @@ -105,7 +105,6 @@ function performRequest(text, checkXML, checkTransform){ //Form REST request, send, receive and display in resultArea async function restRequest(text) { const escapeChar = "specialEscapeChar"; - // const addr = "http://localhost:8081/" + text; var port = ":8081/" if (getProcessor() == "libxml") { port = ":8082/" From fa1a03f6e3db40b5698b9d5b01b098cf88ab2b85 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 9 Feb 2023 15:23:21 +0100 Subject: [PATCH 30/37] Fixed #21 --- Backend-libXML/main.py | 8 +++++++- Backend-libXML/requirements.txt | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py index 78fc6cf..0869a00 100644 --- a/Backend-libXML/main.py +++ b/Backend-libXML/main.py @@ -1,4 +1,5 @@ from flask import Flask +from flask_cors import CORS from flask import request from lxml import etree import json @@ -7,7 +8,12 @@ import Parser app = Flask(__name__) - +CORS(app) +cors = CORS(app, resource={ + r"/*":{ + "origins":"*" + } +}) def process_xml(request: request, type: str) -> str: """Function to process diff --git a/Backend-libXML/requirements.txt b/Backend-libXML/requirements.txt index d176ffe..7c41ff0 100644 --- a/Backend-libXML/requirements.txt +++ b/Backend-libXML/requirements.txt @@ -1,2 +1,3 @@ lxml flask +flask_cors \ No newline at end of file From c14cfe8a52e45f432f85e4cbe4fc6c2df21fcc9a Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 10 Feb 2023 11:34:09 +0100 Subject: [PATCH 31/37] Xalan now returns message when something goes wrong --- .../src/main/java/com/r11/tools/xslt/SparkInitializer.java | 1 - 1 file changed, 1 deletion(-) 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 index e17ad41..9e1d389 100644 --- 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 @@ -158,7 +158,6 @@ public class SparkInitializer { duration = System.currentTimeMillis() - timeStart; LOG.info("Request: " + body + " processed in " + duration + " ms."); responseMap.put("processor", Xalan.getVersion()); - responseMap.put("result", tmp); responseMap.put("time", Long.toString(duration)); resp.body(mapper.writeValueAsString(responseMap)); return resp; From 6a0e49546ccac1ca1643e9651b4afc3bb2964ccc Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 10 Feb 2023 11:55:12 +0100 Subject: [PATCH 32/37] Improved faulty JSON error handling --- .../com/r11/tools/xslt/SparkInitializer.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) 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 index 9e1d389..99a6133 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -65,8 +66,15 @@ public class SparkInitializer { Map responseMap = new HashMap<>(); try { requestMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException ex) { - ex.printStackTrace(); + } 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"); @@ -103,8 +111,15 @@ public class SparkInitializer { Map responseMap = new HashMap<>(); try { requestMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException ex) { - LOG.error("JSON mapping error. " + ex); + } 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"); @@ -173,17 +188,24 @@ public class SparkInitializer { private static final Route xsltHandler = (Request req, Response resp) -> { String body = req.body(); ObjectMapper mapper = new ObjectMapper(); - Map jsonMap = new HashMap<>(); + Map requestMap = new HashMap<>(); Map responseMap = new HashMap<>(); try { - jsonMap = mapper.readValue(body, Map.class); - } catch (JsonMappingException ex) { - LOG.error("JSON mapping error. " + ex); + 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 = jsonMap.get("data"); - String query = jsonMap.get("process"); - String processor = jsonMap.get("processor"); - String version = jsonMap.get("version"); + 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"; From 9a6e8c543eda18d3021c4e55cfe701347d4c1a33 Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 10 Feb 2023 14:18:48 +0100 Subject: [PATCH 33/37] Removed 'here' console log --- Backend/mocked-services/src/main/resources/static/js/dyn_host.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Backend/mocked-services/src/main/resources/static/js/dyn_host.js b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js index b13a6e1..189e5ac 100644 --- a/Backend/mocked-services/src/main/resources/static/js/dyn_host.js +++ b/Backend/mocked-services/src/main/resources/static/js/dyn_host.js @@ -1,5 +1,4 @@ $(document).ready( function() { - console.log("Here") let links = document.getElementsByTagName("link") for (let i = 0; i < links.length; i++) { let oldStr = links[i].href.split("/") From d35103422baf6429f276ca9a0ae388f44bda4afb Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Fri, 10 Feb 2023 14:47:36 +0100 Subject: [PATCH 34/37] Resolved #25 --- Frontend/tools/xpath.html | 39 ++++++++++++++++++++++++++++++++++++--- Frontend/tools/xslt.html | 2 +- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Frontend/tools/xpath.html b/Frontend/tools/xpath.html index d10a60b..c7ed0a9 100644 --- a/Frontend/tools/xpath.html +++ b/Frontend/tools/xpath.html @@ -29,9 +29,10 @@