Search in sources :

Example 1 with StreamingXPATHException

use of org.apache.synapse.util.streaming_xpath.exception.StreamingXPATHException in project wso2-synapse by wso2.

the class SynapseXPath method stringValueOf.

/**
 * <P>Evaluates the XPath expression against the MessageContext of the current message and
 * returns a String representation of the result</p>
 *
 * @param synCtx the source message which holds the MessageContext against full context
 * @return a String representation of the result of evaluation
 */
public String stringValueOf(MessageContext synCtx) {
    try {
        if (forceFailoverEvaluation) {
            if (log.isDebugEnabled()) {
                log.debug("Forced evaluation of the expression with the DOM parser by bypassing the Jaxen: " + getExpression());
            }
            throw new UnresolvableException("Forced to evaluate with DOM parser bypassing Jaxen");
        }
        InputStream inputStream = null;
        Object result = null;
        org.apache.axis2.context.MessageContext axis2MC = null;
        if (!forceDisableStreamXpath && "true".equals(enableStreamingXpath) && streamingXPATH != null && (((Axis2MessageContext) synCtx).getEnvelope() == null || ((Axis2MessageContext) synCtx).getEnvelope().getBody().getFirstElement() == null)) {
            try {
                axis2MC = ((Axis2MessageContext) synCtx).getAxis2MessageContext();
                String contentType = (String) axis2MC.getProperty(SynapseConstants.AXIS2_PROPERTY_CONTENT_TYPE);
                if (!isStreamingXpathSupportedContentType(contentType) && !Boolean.TRUE.equals(PassThroughConstants.MESSAGE_BUILDER_INVOKED)) {
                    RelayUtils.buildMessage(axis2MC);
                } else {
                    inputStream = getMessageInputStreamPT(axis2MC);
                }
            } catch (XMLStreamException e) {
                handleException("Error occurred while building the message from the message context", e);
            } catch (IOException e) {
                log.error("Error occurred while obtaining input stream from the message context", e);
            }
            if (inputStream != null) {
                try {
                    result = streamingXPATH.getStringValue(inputStream);
                } catch (XMLStreamException e) {
                    handleException("Error occurred while parsing the XPATH String", e);
                } catch (StreamingXPATHException e) {
                    handleException("Error occurred while parsing the XPATH String", e);
                }
            } else {
                try {
                    result = streamingXPATH.getStringValue(synCtx.getEnvelope());
                } catch (XMLStreamException e) {
                    handleException("Error occurred while parsing the XPATH String", e);
                } catch (StreamingXPATHException e) {
                    handleException("Error occurred while parsing the XPATH String", e);
                }
            }
        } else {
            result = evaluate(synCtx);
        }
        if (result == null) {
            return null;
        }
        StringBuffer textValue = new StringBuffer();
        if (result instanceof List) {
            List list = (List) result;
            for (Object o : list) {
                if (o == null && list.size() == 1) {
                    return null;
                }
                if (o instanceof OMTextImpl) {
                    textValue.append(((OMTextImpl) o).getText());
                } else if (o instanceof OMElementImpl) {
                    String s = ((OMElementImpl) o).getText();
                    // We use StringUtils.trim as String.trim does not remove U+00A0 (int 160) (No-break space)
                    if (s.replace(String.valueOf((char) 160), " ").trim().length() == 0) {
                        s = o.toString();
                    }
                    textValue.append(s);
                } else if (o instanceof OMDocumentImpl) {
                    textValue.append(((OMDocumentImpl) o).getOMDocumentElement().toString());
                } else if (o instanceof OMAttribute) {
                    textValue.append(((OMAttribute) o).getAttributeValue());
                } else if (o instanceof SynapseXPath) {
                    textValue.append(((SynapseXPath) o).stringValueOf(synCtx));
                }
            }
        } else if ("true".equals(enableStreamingXpath) && streamingXPATH != null) {
            if (!"".equals((String) result)) {
                OMElement re = AXIOMUtil.stringToOM((String) result);
                if (re != null) {
                    textValue.append(re.getText());
                } else {
                    textValue.append(result.toString());
                }
            }
        } else {
            textValue.append(result.toString());
        }
        return textValue.toString();
    } catch (UnresolvableException ex) {
        // xpath processing in DOM fashion which can support XPATH2.0 with supported XAPTH engine like SAXON
        if ("true".equals(domXpathConfig)) {
            if (log.isDebugEnabled()) {
                log.debug("AXIOM xpath evaluation failed with UnresolvableException, " + "trying to perform DOM based XPATH", ex);
            }
            try {
                return evaluateDOMXPath(synCtx);
            } catch (Exception e) {
                handleException("Evaluation of the XPath expression " + this.toString() + " resulted in an error", e);
            }
        } else {
            handleException("Evaluation of the XPath expression " + this.toString() + " resulted in an error", ex);
        }
    } catch (JaxenException je) {
        handleException("Evaluation of the XPath expression " + this.toString() + " resulted in an error", je);
    } catch (XMLStreamException e) {
        handleException("Evaluation of the XPath expression " + this.toString() + " resulted in an error", e);
    }
    return null;
}
Also used : StreamingXPATHException(org.apache.synapse.util.streaming_xpath.exception.StreamingXPATHException) InputStream(java.io.InputStream) OMDocumentImpl(org.apache.axiom.om.impl.llom.OMDocumentImpl) OMTextImpl(org.apache.axiom.om.impl.llom.OMTextImpl) OMElement(org.apache.axiom.om.OMElement) IOException(java.io.IOException) JaxenException(org.jaxen.JaxenException) XPathExpressionException(javax.xml.xpath.XPathExpressionException) UnresolvableException(org.jaxen.UnresolvableException) XMLStreamException(javax.xml.stream.XMLStreamException) IOException(java.io.IOException) StreamingXPATHException(org.apache.synapse.util.streaming_xpath.exception.StreamingXPATHException) StreamingXPATHCompilerException(org.apache.synapse.util.streaming_xpath.compiler.exception.StreamingXPATHCompilerException) OMElementImpl(org.apache.axiom.om.impl.llom.OMElementImpl) XMLStreamException(javax.xml.stream.XMLStreamException) JaxenException(org.jaxen.JaxenException) SingletonList(org.jaxen.util.SingletonList) List(java.util.List) UnresolvableException(org.jaxen.UnresolvableException) OMAttribute(org.apache.axiom.om.OMAttribute) Axis2MessageContext(org.apache.synapse.core.axis2.Axis2MessageContext)

Aggregations

IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 List (java.util.List)1 XMLStreamException (javax.xml.stream.XMLStreamException)1 XPathExpressionException (javax.xml.xpath.XPathExpressionException)1 OMAttribute (org.apache.axiom.om.OMAttribute)1 OMElement (org.apache.axiom.om.OMElement)1 OMDocumentImpl (org.apache.axiom.om.impl.llom.OMDocumentImpl)1 OMElementImpl (org.apache.axiom.om.impl.llom.OMElementImpl)1 OMTextImpl (org.apache.axiom.om.impl.llom.OMTextImpl)1 Axis2MessageContext (org.apache.synapse.core.axis2.Axis2MessageContext)1 StreamingXPATHCompilerException (org.apache.synapse.util.streaming_xpath.compiler.exception.StreamingXPATHCompilerException)1 StreamingXPATHException (org.apache.synapse.util.streaming_xpath.exception.StreamingXPATHException)1 JaxenException (org.jaxen.JaxenException)1 UnresolvableException (org.jaxen.UnresolvableException)1 SingletonList (org.jaxen.util.SingletonList)1