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;
}
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);
}
Aggregations