Implemented showing returned type (#112) #148
| @@ -54,12 +54,12 @@ def xpath(source: str, xpath: str) -> str: | |||||||
|     # root.xpath can return 4 types: float, string, bool and list. |     # root.xpath can return 4 types: float, string, bool and list. | ||||||
|     # List is the only one that can't be simply converted to str |     # List is the only one that can't be simply converted to str | ||||||
|     if type(result) is not list: |     if type(result) is not list: | ||||||
|         return str(result) |         return str(result), type(result).__name__ | ||||||
|     else: |     else: | ||||||
|         result_string = "" |         result_string = "" | ||||||
|         for e in result: |         for e in result: | ||||||
|             result_string += etree.tostring(e, pretty_print=True).decode() + "\n" |             result_string += etree.tostring(e, pretty_print=True).decode() + "\n" | ||||||
|         return result_string |         return result_string, "node" | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ def process_xml(request: request, type: str) -> str: | |||||||
|         elif (type == "xslt"): |         elif (type == "xslt"): | ||||||
|             response_json['result'] = Parser.xslt(data, process) |             response_json['result'] = Parser.xslt(data, process) | ||||||
|         elif (type == "xpath"): |         elif (type == "xpath"): | ||||||
|             response_json['result'] = Parser.xpath(data, process) |             response_json['result'], response_json['type'] = Parser.xpath(data, process) | ||||||
|         elif (type == "prettify"): |         elif (type == "prettify"): | ||||||
|             response_json['result'] = Parser.formatXML(data, True) |             response_json['result'] = Parser.formatXML(data, True) | ||||||
|         elif (type == "minimize"): |         elif (type == "minimize"): | ||||||
|   | |||||||
| @@ -2,10 +2,7 @@ package com.r11.tools.controller; | |||||||
|  |  | ||||||
| import com.google.gson.Gson; | import com.google.gson.Gson; | ||||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||||
| import com.r11.tools.controller.internal.GlobalControllerManifest; | import com.r11.tools.controller.internal.*; | ||||||
| import com.r11.tools.controller.internal.HandlerType; |  | ||||||
| import com.r11.tools.controller.internal.RestController; |  | ||||||
| import com.r11.tools.controller.internal.ScopedControllerManifest; |  | ||||||
| import com.r11.tools.xml.Saxon; | import com.r11.tools.xml.Saxon; | ||||||
| import com.r11.tools.xml.Xalan; | import com.r11.tools.xml.Xalan; | ||||||
| import org.apache.logging.log4j.Logger; | import org.apache.logging.log4j.Logger; | ||||||
| @@ -63,7 +60,7 @@ public class XPathController implements RestController { | |||||||
|                 timeStart = System.currentTimeMillis(); |                 timeStart = System.currentTimeMillis(); | ||||||
|  |  | ||||||
|                 try { |                 try { | ||||||
|                     tmp = Saxon.processXPath(data, query, version).trim(); |                     tmp = Saxon.processXPath(data, query, version).getData().trim(); | ||||||
|  |  | ||||||
|                     response.status(200); |                     response.status(200); | ||||||
|  |  | ||||||
| @@ -92,12 +89,13 @@ public class XPathController implements RestController { | |||||||
|                 timeStart = System.currentTimeMillis(); |                 timeStart = System.currentTimeMillis(); | ||||||
|  |  | ||||||
|                 try { |                 try { | ||||||
|                     tmp = Xalan.processXPath(data, query).trim(); |                     XPathQueryResult xPathQueryResult = Xalan.processXPath(data, query); | ||||||
|  |  | ||||||
|                     response.status(200); |                     response.status(200); | ||||||
|  |  | ||||||
|                     responseJson.addProperty("result", tmp); |                     responseJson.addProperty("result", xPathQueryResult.getData().trim()); | ||||||
|                     responseJson.addProperty("status", "OK"); |                     responseJson.addProperty("status", "OK"); | ||||||
|  |                     responseJson.addProperty("type", xPathQueryResult.getType()); | ||||||
|                 } catch (Exception ex) { |                 } catch (Exception ex) { | ||||||
|                     this.logger.error("Error on processing XPath using Xalan. " + ex); |                     this.logger.error("Error on processing XPath using Xalan. " + ex); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | package com.r11.tools.controller.internal; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Class used to store data received from parser and type of that data (node, string, etc.) | ||||||
|  |  */ | ||||||
|  | public class XPathQueryResult { | ||||||
|  |     private String data; | ||||||
|  |     private String type; | ||||||
|  |  | ||||||
|  |     public XPathQueryResult(String data, String type) { | ||||||
|  |         this.data = data; | ||||||
|  |         this.type = type; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getData() { | ||||||
|  |         return data; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getType() { | ||||||
|  |         return type; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,5 +1,6 @@ | |||||||
| package com.r11.tools.xml; | package com.r11.tools.xml; | ||||||
|  |  | ||||||
|  | import com.r11.tools.controller.internal.XPathQueryResult; | ||||||
| import net.sf.saxon.s9api.*; | import net.sf.saxon.s9api.*; | ||||||
|  |  | ||||||
| import javax.xml.transform.stream.StreamSource; | import javax.xml.transform.stream.StreamSource; | ||||||
| @@ -41,7 +42,7 @@ public class Saxon { | |||||||
|      * @return string xml representation of the node |      * @return string xml representation of the node | ||||||
|      * @throws Exception thrown on node building errors or invalid xpath |      * @throws Exception thrown on node building errors or invalid xpath | ||||||
|      */ |      */ | ||||||
|     public static String processXPath(String data, String query, String version) throws Exception { |     public static XPathQueryResult processXPath(String data, String query, String version) throws Exception { | ||||||
|         Processor p = new Processor(false); |         Processor p = new Processor(false); | ||||||
|         XPathCompiler compiler = p.newXPathCompiler(); |         XPathCompiler compiler = p.newXPathCompiler(); | ||||||
|         DocumentBuilder builder = p.newDocumentBuilder(); |         DocumentBuilder builder = p.newDocumentBuilder(); | ||||||
| @@ -61,7 +62,7 @@ public class Saxon { | |||||||
|             sb.append(xdmItem); |             sb.append(xdmItem); | ||||||
|             sb.append('\n'); |             sb.append('\n'); | ||||||
|         } |         } | ||||||
|         return sb.toString(); |         return new XPathQueryResult(sb.toString(), "N/A"); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package com.r11.tools.xml; | package com.r11.tools.xml; | ||||||
|  |  | ||||||
|  | import com.r11.tools.controller.internal.XPathQueryResult; | ||||||
| import org.apache.xpath.XPathAPI; | import org.apache.xpath.XPathAPI; | ||||||
| import org.apache.xpath.objects.XObject; | import org.apache.xpath.objects.XObject; | ||||||
| import org.w3c.dom.Document; | import org.w3c.dom.Document; | ||||||
| @@ -64,7 +65,7 @@ public class Xalan { | |||||||
|      * @return xml processed using given xpath |      * @return xml processed using given xpath | ||||||
|      * @throws Exception thrown on node building errors or invalid xpath |      * @throws Exception thrown on node building errors or invalid xpath | ||||||
|      */ |      */ | ||||||
|     public static String processXPath(String data, String transform) throws Exception { |     public static XPathQueryResult processXPath(String data, String transform) throws Exception { | ||||||
|  |  | ||||||
|         // Set up a DOM tree to query. |         // Set up a DOM tree to query. | ||||||
|         InputSource in = new InputSource(new StringReader(data)); |         InputSource in = new InputSource(new StringReader(data)); | ||||||
| @@ -81,7 +82,7 @@ public class Xalan { | |||||||
|             NodeIterator nl = XPathAPI.selectNodeIterator(doc, transform); |             NodeIterator nl = XPathAPI.selectNodeIterator(doc, transform); | ||||||
|  |  | ||||||
|             // Serialize the found nodes to result object. |             // Serialize the found nodes to result object. | ||||||
|             StringBuilder result = new StringBuilder(); |             StringBuilder resultString = new StringBuilder(); | ||||||
|             Node n; |             Node n; | ||||||
|             while ((n = nl.nextNode())!= null) { |             while ((n = nl.nextNode())!= null) { | ||||||
|                 StringBuilder sb; |                 StringBuilder sb; | ||||||
| @@ -90,18 +91,19 @@ public class Xalan { | |||||||
|                     // single XPath text node.  Coalesce all contiguous text nodes |                     // single XPath text node.  Coalesce all contiguous text nodes | ||||||
|                     // at this level |                     // at this level | ||||||
|                     for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) { |                     for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) { | ||||||
|                         result.append(nn.getNodeValue()); |                         resultString.append(nn.getNodeValue()); | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |                     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); | ||||||
|                     serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream))); |                     serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream))); | ||||||
|                     result.append(outputStream); |                     resultString.append(outputStream); | ||||||
|                 } |                 } | ||||||
|                 result.append("\n"); |                 resultString.append("\n"); | ||||||
|             } |             } | ||||||
|             return result.toString(); |             return new XPathQueryResult(resultString.toString(), "node"); | ||||||
|         } catch (TransformerException e) { |         } catch (TransformerException e) { | ||||||
|             return XPathAPI.eval(doc, transform).toString(); |             String returnData = XPathAPI.eval(doc, transform).toString(); | ||||||
|  |             return new XPathQueryResult(data, "string"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -244,9 +244,12 @@ function performRequest(endpoint, checkXML, checkTransform) { | |||||||
|     if (!empty) { |     if (!empty) { | ||||||
|         restRequest(port, endpoint, xmlData, transformData).then(function (result) { |         restRequest(port, endpoint, xmlData, transformData).then(function (result) { | ||||||
|             document.getElementById("resultArea").value = result.result; |             document.getElementById("resultArea").value = result.result; | ||||||
|             document.getElementById("procinfo").innerText = ' Computed using '.concat(" ", result.processor); |             document.getElementById("procinfo").innerText = ' Computed using ' + result.processor | ||||||
|  |             if (result.type) | ||||||
|  |                 document.getElementById("procinfo").innerText += ". Returned: " + result.type; | ||||||
|  |                  | ||||||
|             if (result.status = "OK") { |             if (result.status = "OK") { | ||||||
|                 document.getElementById("procinfo").innerText = document.getElementById("procinfo").innerText.concat(" in ", result.time, "ms"); |                 document.getElementById("procinfo").innerText += " in " + result.time + "ms"; | ||||||
|                 procinfo.style.color = "#30aa58"; |                 procinfo.style.color = "#30aa58"; | ||||||
|             } else { |             } else { | ||||||
|                 procinfo.style.color = "#aa3030"; |                 procinfo.style.color = "#aa3030"; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user