diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java index cc68603..a3d0ca2 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/XPathController.java @@ -2,10 +2,7 @@ package com.r11.tools.controller; import com.google.gson.Gson; import com.google.gson.JsonObject; -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.*; import com.r11.tools.xml.Saxon; import com.r11.tools.xml.Xalan; import org.apache.logging.log4j.Logger; @@ -63,7 +60,7 @@ public class XPathController implements RestController { timeStart = System.currentTimeMillis(); try { - tmp = Saxon.processXPath(data, query, version).trim(); + tmp = Saxon.processXPath(data, query, version).getData().trim(); response.status(200); @@ -92,12 +89,13 @@ public class XPathController implements RestController { timeStart = System.currentTimeMillis(); try { - tmp = Xalan.processXPath(data, query).trim(); + XPathQueryResult xPathQueryResult = Xalan.processXPath(data, query); response.status(200); - responseJson.addProperty("result", tmp); + responseJson.addProperty("result", xPathQueryResult.getData().trim()); responseJson.addProperty("status", "OK"); + responseJson.addProperty("type", xPathQueryResult.getType()); } catch (Exception ex) { this.logger.error("Error on processing XPath using Xalan. " + ex); diff --git a/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/XPathQueryResult.java b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/XPathQueryResult.java new file mode 100644 index 0000000..8bb8a00 --- /dev/null +++ b/Backend/tools-services/src/main/java/com/r11/tools/controller/internal/XPathQueryResult.java @@ -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; + } +} diff --git a/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java index 567c889..4cb2835 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/Saxon.java @@ -1,5 +1,6 @@ package com.r11.tools.xml; +import com.r11.tools.controller.internal.XPathQueryResult; import net.sf.saxon.s9api.*; import javax.xml.transform.stream.StreamSource; @@ -41,7 +42,7 @@ public class Saxon { * @return string xml representation of the node * @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); XPathCompiler compiler = p.newXPathCompiler(); DocumentBuilder builder = p.newDocumentBuilder(); @@ -61,7 +62,7 @@ public class Saxon { sb.append(xdmItem); sb.append('\n'); } - return sb.toString(); + return new XPathQueryResult(sb.toString(), "N/A"); } diff --git a/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java b/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java index 829b62b..1caad08 100644 --- a/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java +++ b/Backend/tools-services/src/main/java/com/r11/tools/xml/Xalan.java @@ -1,5 +1,6 @@ package com.r11.tools.xml; +import com.r11.tools.controller.internal.XPathQueryResult; import org.apache.xpath.XPathAPI; import org.apache.xpath.objects.XObject; import org.w3c.dom.Document; @@ -64,7 +65,7 @@ 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 { + public static XPathQueryResult processXPath(String data, String transform) throws Exception { // Set up a DOM tree to query. InputSource in = new InputSource(new StringReader(data)); @@ -81,7 +82,7 @@ public class Xalan { NodeIterator nl = XPathAPI.selectNodeIterator(doc, transform); // Serialize the found nodes to result object. - StringBuilder result = new StringBuilder(); + StringBuilder resultString = new StringBuilder(); Node n; while ((n = nl.nextNode())!= null) { StringBuilder sb; @@ -90,18 +91,19 @@ public class Xalan { // single XPath text node. Coalesce all contiguous text nodes // at this level for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) { - result.append(nn.getNodeValue()); + resultString.append(nn.getNodeValue()); } } else { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 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) { - return XPathAPI.eval(doc, transform).toString(); + String returnData = XPathAPI.eval(doc, transform).toString(); + return new XPathQueryResult(data, "string"); } }