Search in sources :

Example 1 with XPathExecutable

use of net.sf.saxon.s9api.XPathExecutable in project jmeter by apache.

the class XPathUtil method computeAssertionResultUsingSaxon.

/**
 * @param result The result of xpath2 assertion
 * @param xmlFile XML data
 * @param xPathQuery XPath Query
 * @param namespaces Space separated set of prefix=namespace
 * @param isNegated invert result
 * @throws SaxonApiException when the parser has problems with the given xml or xpath query
 * @throws FactoryConfigurationError when the parser can not be instantiated
 */
public static void computeAssertionResultUsingSaxon(AssertionResult result, String xmlFile, String xPathQuery, String namespaces, Boolean isNegated) throws SaxonApiException, FactoryConfigurationError {
    // generating the cache key
    final ImmutablePair<String, String> key = ImmutablePair.of(xPathQuery, namespaces);
    // check the cache
    XPathExecutable xPathExecutable;
    if (StringUtils.isNotEmpty(xPathQuery)) {
        xPathExecutable = XPATH_CACHE.get(key);
    } else {
        log.warn("Error : {}", JMeterUtils.getResString("xpath2_extractor_empty_query"));
        return;
    }
    try (StringReader reader = new StringReader(xmlFile)) {
        // We could instantiate it once but might trigger issues in the future
        // Sharing of a DocumentBuilder across multiple threads is not recommended.
        // However, in the current implementation sharing a DocumentBuilder (once
        // initialized)
        // will only cause problems if a SchemaValidator is used.
        net.sf.saxon.s9api.DocumentBuilder builder = PROCESSOR.newDocumentBuilder();
        XdmNode xdmNode = builder.build(new SAXSource(new InputSource(reader)));
        if (xPathExecutable != null) {
            XPathSelector selector = null;
            try {
                Document doc;
                doc = XPathUtil.makeDocumentBuilder(false, false, false, false).newDocument();
                XObject xObject = XPathAPI.eval(doc, xPathQuery, getPrefixResolverForXPath2(doc, namespaces));
                selector = xPathExecutable.load();
                selector.setContextItem(xdmNode);
                XdmValue nodes = selector.evaluate();
                boolean resultOfEval = true;
                int length = nodes.size();
                // In case we need to extract everything
                if (length == 0) {
                    resultOfEval = false;
                } else if (xObject.getType() == XObject.CLASS_BOOLEAN) {
                    resultOfEval = Boolean.parseBoolean(nodes.itemAt(0).getStringValue());
                }
                result.setFailure(isNegated ? resultOfEval : !resultOfEval);
                result.setFailureMessage(isNegated ? "Nodes Matched for " + xPathQuery : "No Nodes Matched for " + xPathQuery);
            } catch (ParserConfigurationException | TransformerException e) {
                // NOSONAR Exception handled by return
                result.setError(true);
                result.setFailureMessage("Exception: " + e.getMessage() + " for:" + xPathQuery);
            } finally {
                if (selector != null) {
                    try {
                        selector.getUnderlyingXPathContext().setContextItem(null);
                    } catch (Exception e) {
                        // NOSONAR Ignored on purpose
                        result.setError(true);
                        result.setFailureMessage("Exception: " + e.getMessage() + " for:" + xPathQuery);
                    }
                }
            }
        }
    }
}
Also used : InputSource(org.xml.sax.InputSource) Document(org.w3c.dom.Document) XdmNode(net.sf.saxon.s9api.XdmNode) XMLStreamException(javax.xml.stream.XMLStreamException) SAXException(org.xml.sax.SAXException) TransformerException(javax.xml.transform.TransformerException) SaxonApiException(net.sf.saxon.s9api.SaxonApiException) IOException(java.io.IOException) SAXParseException(org.xml.sax.SAXParseException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) XdmValue(net.sf.saxon.s9api.XdmValue) SAXSource(javax.xml.transform.sax.SAXSource) XPathSelector(net.sf.saxon.s9api.XPathSelector) StringReader(java.io.StringReader) XPathExecutable(net.sf.saxon.s9api.XPathExecutable) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) XObject(org.apache.xpath.objects.XObject) TransformerException(javax.xml.transform.TransformerException)

Example 2 with XPathExecutable

use of net.sf.saxon.s9api.XPathExecutable in project jmeter by apache.

the class XPathUtilTest method testBug63033.

@Test
public void testBug63033() throws SaxonApiException {
    Processor p = new Processor(false);
    XPathCompiler c = p.newXPathCompiler();
    c.declareNamespace("age", "http://www.w3.org/2003/01/geo/wgs84_pos#");
    String xPathQuery = "//Employees/Employee[1]/age:ag";
    XPathExecutable e = c.compile(xPathQuery);
    XPathSelector selector = e.load();
    selector.setContextItem(p.newDocumentBuilder().build(new StreamSource(new StringReader(xmlDoc))));
    XdmValue nodes = selector.evaluate();
    XdmItem item = nodes.itemAt(0);
    assertEquals("<age:ag xmlns:age=\"http://www.w3.org/2003/01/geo/wgs84_pos#\">29</age:ag>", item.toString());
}
Also used : XdmValue(net.sf.saxon.s9api.XdmValue) Processor(net.sf.saxon.s9api.Processor) XPathCompiler(net.sf.saxon.s9api.XPathCompiler) XPathSelector(net.sf.saxon.s9api.XPathSelector) StreamSource(javax.xml.transform.stream.StreamSource) StringReader(java.io.StringReader) XPathExecutable(net.sf.saxon.s9api.XPathExecutable) XdmItem(net.sf.saxon.s9api.XdmItem) Test(org.junit.jupiter.api.Test)

Example 3 with XPathExecutable

use of net.sf.saxon.s9api.XPathExecutable in project jmeter by apache.

the class XPathUtil method putValuesForXPathInListUsingSaxon.

public static void putValuesForXPathInListUsingSaxon(String xmlFile, String xPathQuery, List<String> matchStrings, boolean fragment, int matchNumber, String namespaces) throws SaxonApiException, FactoryConfigurationError {
    // generating the cache key
    final ImmutablePair<String, String> key = ImmutablePair.of(xPathQuery, namespaces);
    // check the cache
    XPathExecutable xPathExecutable;
    if (StringUtils.isNotEmpty(xPathQuery)) {
        xPathExecutable = XPATH_CACHE.get(key);
    } else {
        log.warn("Error : {}", JMeterUtils.getResString("xpath2_extractor_empty_query"));
        return;
    }
    try (StringReader reader = new StringReader(xmlFile)) {
        // We could instantiate it once but might trigger issues in the future
        // Sharing of a DocumentBuilder across multiple threads is not recommended.
        // However, in the current implementation sharing a DocumentBuilder (once initialized)
        // will only cause problems if a SchemaValidator is used.
        net.sf.saxon.s9api.DocumentBuilder builder = PROCESSOR.newDocumentBuilder();
        XdmNode xdmNode = builder.build(new SAXSource(new InputSource(reader)));
        if (xPathExecutable != null) {
            XPathSelector selector = null;
            try {
                selector = xPathExecutable.load();
                selector.setContextItem(xdmNode);
                XdmValue nodes = selector.evaluate();
                int length = nodes.size();
                int indexToMatch = matchNumber;
                // In case we need to extract everything
                if (matchNumber < 0) {
                    for (XdmItem item : nodes) {
                        if (fragment) {
                            matchStrings.add(item.toString());
                        } else {
                            matchStrings.add(item.getStringValue());
                        }
                    }
                } else {
                    if (indexToMatch <= length) {
                        if (matchNumber == 0 && length > 0) {
                            indexToMatch = JMeterUtils.getRandomInt(length) + 1;
                        }
                        XdmItem item = nodes.itemAt(indexToMatch - 1);
                        matchStrings.add(fragment ? item.toString() : item.getStringValue());
                    } else {
                        if (log.isWarnEnabled()) {
                            log.warn("Error : {}{}", JMeterUtils.getResString("xpath2_extractor_match_number_failure"), indexToMatch);
                        }
                    }
                }
            } finally {
                if (selector != null) {
                    try {
                        selector.getUnderlyingXPathContext().setContextItem(null);
                    } catch (Exception e) {
                    // NOSONAR Ignored on purpose
                    // NOOP
                    }
                }
            }
        }
    }
}
Also used : InputSource(org.xml.sax.InputSource) XdmNode(net.sf.saxon.s9api.XdmNode) XMLStreamException(javax.xml.stream.XMLStreamException) SAXException(org.xml.sax.SAXException) TransformerException(javax.xml.transform.TransformerException) SaxonApiException(net.sf.saxon.s9api.SaxonApiException) IOException(java.io.IOException) SAXParseException(org.xml.sax.SAXParseException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) XdmValue(net.sf.saxon.s9api.XdmValue) SAXSource(javax.xml.transform.sax.SAXSource) XPathSelector(net.sf.saxon.s9api.XPathSelector) StringReader(java.io.StringReader) XPathExecutable(net.sf.saxon.s9api.XPathExecutable) XdmItem(net.sf.saxon.s9api.XdmItem)

Aggregations

StringReader (java.io.StringReader)3 XPathExecutable (net.sf.saxon.s9api.XPathExecutable)3 XPathSelector (net.sf.saxon.s9api.XPathSelector)3 XdmValue (net.sf.saxon.s9api.XdmValue)3 IOException (java.io.IOException)2 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)2 XMLStreamException (javax.xml.stream.XMLStreamException)2 TransformerException (javax.xml.transform.TransformerException)2 SAXSource (javax.xml.transform.sax.SAXSource)2 SaxonApiException (net.sf.saxon.s9api.SaxonApiException)2 XdmItem (net.sf.saxon.s9api.XdmItem)2 XdmNode (net.sf.saxon.s9api.XdmNode)2 InputSource (org.xml.sax.InputSource)2 SAXException (org.xml.sax.SAXException)2 SAXParseException (org.xml.sax.SAXParseException)2 StreamSource (javax.xml.transform.stream.StreamSource)1 Processor (net.sf.saxon.s9api.Processor)1 XPathCompiler (net.sf.saxon.s9api.XPathCompiler)1 XObject (org.apache.xpath.objects.XObject)1 Test (org.junit.jupiter.api.Test)1