Search in sources :

Example 1 with UnresolvableException

use of org.jaxen.UnresolvableException 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)

Example 2 with UnresolvableException

use of org.jaxen.UnresolvableException in project wso2-synapse by wso2.

the class SynapseXPathVariableContext method getVariableValue.

/**
 * Gets the variable values resolved from the context. This includes the
 * <dl>
 *   <dt><tt>body</tt></dt>
 *   <dd>The SOAP 1.1 or 1.2 body element.</dd>
 *   <dt><tt>header</tt></dt>
 *   <dd>The SOAP 1.1 or 1.2 header element.</dd>
 * </dl>
 * and the following variable prefixes
 * <dl>
 *   <dt><tt>ctx</tt></dt>
 *   <dd>Prefix for Synapse MessageContext properties</dd>
 *   <dt><tt>axis2</tt></dt>
 *   <dd>Prefix for Axis2 MessageContext properties</dd>
 *   <dt><tt>trp</tt></dt>
 *   <dd>Prefix for the transport headers</dd>
 * </dl>
 * If the variable is unknown, this method attempts to resolve it using
 * the parent variable context.
 *
 * @param namespaceURI namespaces for the variable resolution
 * @param prefix string prefix for the variable resolution
 * @param localName string local name for the variable resolution
 * @return Resolved variable value
 * @throws UnresolvableException if the variable specified does not found
 */
public Object getVariableValue(String namespaceURI, String prefix, String localName) throws UnresolvableException {
    if (namespaceURI == null) {
        if (env != null) {
            if (SynapseXPathConstants.SOAP_BODY_VARIABLE.equals(localName)) {
                return env.getBody();
            } else if (SynapseXPathConstants.SOAP_HEADER_VARIABLE.equals(localName)) {
                return env.getHeader();
            } else if (SynapseXPathConstants.SOAP_ENVELOPE_VARIABLE.equals(localName)) {
                return env;
            }
        }
        if (prefix != null && !"".equals(prefix) && synCtx != null) {
            if (SynapseXPathConstants.MESSAGE_CONTEXT_VARIABLE_PREFIX.equals(prefix)) {
                return synCtx.getProperty(localName);
            } else if (SynapseXPathConstants.AXIS2_CONTEXT_VARIABLE_PREFIX.equals(prefix)) {
                return ((Axis2MessageContext) synCtx).getAxis2MessageContext().getProperty(localName);
            } else if (SynapseXPathConstants.FUNC_CONTEXT_VARIABLE_PREFIX.equals(prefix)) {
                Stack<TemplateContext> functionStack = (Stack) synCtx.getProperty(SynapseConstants.SYNAPSE__FUNCTION__STACK);
                TemplateContext topCtxt = functionStack.peek();
                if (topCtxt != null) {
                    Object result = topCtxt.getParameterValue(localName);
                    if (result != null && result instanceof SynapseXPath && env != null) {
                        SynapseXPath expression = (SynapseXPath) topCtxt.getParameterValue(localName);
                        try {
                            return expression.evaluate(env);
                        } catch (JaxenException e) {
                            return null;
                        }
                    } else {
                        return result;
                    }
                }
            } else if (SynapseXPathConstants.TRANSPORT_VARIABLE_PREFIX.equals(prefix)) {
                org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) synCtx).getAxis2MessageContext();
                Object headers = axis2MessageContext.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
                if (headers != null && headers instanceof Map) {
                    Map headersMap = (Map) headers;
                    return headersMap.get(localName);
                } else {
                    return null;
                }
            } else if (SynapseXPathConstants.URL_VARIABLE_PREFIX.equals(prefix)) {
                EndpointReference toEPR = synCtx.getTo();
                if (toEPR != null) {
                    String completeURL = toEPR.getAddress();
                    AxisBindingOperation axisBindingOperation = (AxisBindingOperation) ((Axis2MessageContext) synCtx).getAxis2MessageContext().getProperty(Constants.AXIS_BINDING_OPERATION);
                    String queryParameterSeparator = null;
                    if (axisBindingOperation != null) {
                        queryParameterSeparator = (String) axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR);
                    }
                    if (queryParameterSeparator == null) {
                        queryParameterSeparator = WSDL20DefaultValueHolder.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR_DEFAULT;
                    }
                    int i = completeURL.indexOf("?");
                    if (i > -1) {
                        String queryString = completeURL.substring(i + 1);
                        if (queryString != null && !queryString.equals("")) {
                            String[] params = queryString.split(queryParameterSeparator);
                            if (params == null || params.length == 0) {
                                return "";
                            }
                            for (String param : params) {
                                String[] temp = param.split("=");
                                if (temp != null && temp.length >= 1) {
                                    if (temp[0].equalsIgnoreCase(localName)) {
                                        try {
                                            return temp.length > 1 ? URIEncoderDecoder.decode(temp[1]) : "";
                                        } catch (UnsupportedEncodingException e) {
                                            String msg = "Couldn't decode the URL parameter " + "value " + temp[1] + " with name " + localName;
                                            log.error(msg, e);
                                            throw new UnresolvableException(msg + e.getMessage());
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                return "";
            } else if (SynapseXPathConstants.OPERATION_SCOPE_VARIABLE_PREFIX.equals(prefix)) {
                Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
                return axis2smc.getAxis2MessageContext().getOperationContext().getProperty(localName);
            } else if (SynapseXPathConstants.SYSTEM_SCOPE_VARIABLE_PREFIX.equals(prefix)) {
                String propVal = System.getProperty(localName);
                if (propVal != null) {
                    return propVal;
                } else {
                    return "";
                }
            } else {
                Object o = synCtx.getProperty(prefix);
                if (o instanceof Map) {
                    Object valueObject = ((Map) o).get(localName);
                    if (valueObject != null) {
                        return valueObject.toString();
                    }
                }
            }
        }
    }
    // try resolving using available custom extensions
    Object obj = XpathExtensionUtil.resolveVariableContext(synCtx, namespaceURI, prefix, localName);
    if (obj != null) {
        return obj;
    }
    return parent.getVariableValue(namespaceURI, prefix, localName);
}
Also used : UnsupportedEncodingException(java.io.UnsupportedEncodingException) AxisBindingOperation(org.apache.axis2.description.AxisBindingOperation) TemplateContext(org.apache.synapse.mediators.template.TemplateContext) Stack(java.util.Stack) EndpointReference(org.apache.axis2.addressing.EndpointReference) JaxenException(org.jaxen.JaxenException) MessageContext(org.apache.synapse.MessageContext) Axis2MessageContext(org.apache.synapse.core.axis2.Axis2MessageContext) UnresolvableException(org.jaxen.UnresolvableException) Map(java.util.Map) Axis2MessageContext(org.apache.synapse.core.axis2.Axis2MessageContext)

Aggregations

Axis2MessageContext (org.apache.synapse.core.axis2.Axis2MessageContext)2 JaxenException (org.jaxen.JaxenException)2 UnresolvableException (org.jaxen.UnresolvableException)2 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 List (java.util.List)1 Map (java.util.Map)1 Stack (java.util.Stack)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 EndpointReference (org.apache.axis2.addressing.EndpointReference)1 AxisBindingOperation (org.apache.axis2.description.AxisBindingOperation)1 MessageContext (org.apache.synapse.MessageContext)1 TemplateContext (org.apache.synapse.mediators.template.TemplateContext)1