Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java (original) +++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java Thu Nov 20 14:32:30 2008 @@ -18,29 +18,45 @@ */ package org.apache.ode.bpel.rtrep.v1.xpath20; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; +import javax.xml.transform.TransformerFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import net.sf.saxon.om.NamespaceConstant; import net.sf.saxon.trans.DynamicError; import net.sf.saxon.value.DurationValue; -import net.sf.saxon.xpath.XPathEvaluator; +import net.sf.saxon.xpath.XPathFactoryImpl; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.common.FaultException; -import org.apache.ode.bpel.rtrep.v1.OExpression; +import org.apache.ode.bpel.rtrep.common.ConfigurationException; import org.apache.ode.bpel.rtrep.v1.EvaluationContext; import org.apache.ode.bpel.rtrep.v1.ExpressionLanguageRuntime; +import org.apache.ode.bpel.rtrep.v1.OExpression; import org.apache.ode.bpel.rtrep.v1.xpath10.OXPath10Expression; -import org.apache.ode.bpel.rtrep.common.ConfigurationException; +import org.apache.ode.bpel.rtrep.v2.xpath20.WrappedFaultException; +import org.apache.ode.bpel.rtrep.v2.xpath20.XPath20ExpressionModifier; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.ISO8601DateParser; import org.apache.ode.utils.xsd.Duration; import org.apache.ode.utils.xsl.XslTransformHandler; -import org.w3c.dom.*; - -import javax.xml.namespace.QName; -import javax.xml.transform.TransformerFactory; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import java.util.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; /** * XPath 2.0 Expression Language run-time subsytem. @@ -86,9 +102,15 @@ /** * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluate(org.apache.ode.bpel.rtrep.v1.OExpression, org.apache.ode.bpel.explang.EvaluationContext) */ - public List evaluate(OExpression cexp, EvaluationContext ctx) throws FaultException { + @SuppressWarnings("unchecked") + public List evaluate(OExpression cexp, EvaluationContext ctx) throws FaultException { List result; - Object someRes = evaluate(cexp, ctx, XPathConstants.NODESET); + Object someRes = null; + try { + someRes = evaluate(cexp, ctx, XPathConstants.NODESET); + } catch (Exception e) { + someRes = evaluate(cexp, ctx, XPathConstants.STRING); + } if (someRes instanceof List) { result = (List) someRes; __log.debug("Returned list of size " + result.size()); @@ -97,20 +119,21 @@ Object simpleType = result.get(0); // Dates get a separate treatment as we don't want to call toString on them String textVal; - if (simpleType instanceof Date) + if (simpleType instanceof Date) { textVal = ISO8601DateParser.format((Date) simpleType); - else if (simpleType instanceof DurationValue) + } else if (simpleType instanceof DurationValue) { textVal = ((DurationValue)simpleType).getStringValue(); - else + } else { textVal = simpleType.toString(); + } // Wrapping in a document - Document d = DOMUtils.newDocument(); + Document document = DOMUtils.newDocument(); // Giving our node a parent just in case it's an LValue expression - Element wrapper = d.createElement("wrapper"); - Text text = d.createTextNode(textVal); + Element wrapper = document.createElement("wrapper"); + Text text = document.createTextNode(textVal); wrapper.appendChild(text); - d.appendChild(wrapper); + document.appendChild(wrapper); result = Collections.singletonList(text); } } else if (someRes instanceof NodeList) { @@ -119,9 +142,19 @@ result = new ArrayList(retVal.getLength()); for(int m = 0; m < retVal.getLength(); ++m) { Node val = retVal.item(m); - if (val.getNodeType() == Node.DOCUMENT_NODE) val = ((Document)val).getDocumentElement(); + if (val.getNodeType() == Node.DOCUMENT_NODE) { + val = ((Document)val).getDocumentElement(); + } result.add(val); } + } else if (someRes instanceof String) { + // Wrapping in a document + Document document = DOMUtils.newDocument(); + Element wrapper = document.createElement("wrapper"); + Text text = document.createTextNode((String) someRes); + wrapper.appendChild(text); + document.appendChild(wrapper); + result = Collections.singletonList(text); } else { result = null; } @@ -139,7 +172,7 @@ } public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context) throws FaultException { - List literal = DOMUtils.toList(evaluate(cexp, context, XPathConstants.NODESET)); + List literal = DOMUtils.toList(evaluate(cexp, context)); if (literal.size() == 0) throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "No results for expression: " + cexp); if (literal.size() > 1) @@ -152,7 +185,13 @@ cal.setTime((Date) date); return cal; } - if (date instanceof Element) date = ((Element)date).getTextContent(); + if (date instanceof Element) { + date = ((Element) date).getTextContent(); + } + + if (date instanceof Text) { + date = ((Text) date).getTextContent(); + } try { return ISO8601DateParser.parseCal(date.toString()); @@ -176,17 +215,29 @@ private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type) throws FaultException { try { - net.sf.saxon.xpath.XPathFactoryImpl xpf = new net.sf.saxon.xpath.XPathFactoryImpl(); - OXPath20ExpressionBPEL20 oxpath20 = ((OXPath20ExpressionBPEL20) cexp); - xpf.setXPathFunctionResolver(new JaxpFunctionResolver(ctx, oxpath20)); - xpf.setXPathVariableResolver(new JaxpVariableResolver(ctx, oxpath20)); - XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath(); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+XPathConstants.DOM_OBJECT_MODEL, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_JDOM, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_XOM, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_DOM4J, + "net.sf.saxon.xpath.XPathFactoryImpl"); + + XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + JaxpFunctionResolver funcResolver = new JaxpFunctionResolver( + ctx, oxpath20); + JaxpVariableResolver varResolver = new JaxpVariableResolver(ctx, oxpath20, ((XPathFactoryImpl) xpf).getConfiguration()); + xpf.setXPathFunctionResolver(funcResolver); + xpf.setXPathVariableResolver(varResolver); + XPath xpe = xpf.newXPath(); xpe.setNamespaceContext(oxpath20.namespaceCtx); - // Just checking that the expression is valid XPathExpression expr = xpe.compile(((OXPath10Expression)cexp).xpath); - - Object evalResult = expr.evaluate(ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode(), type); + Node contextNode = ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode(); + Object evalResult = expr.evaluate(contextNode, type); if (evalResult != null && __log.isDebugEnabled()) { __log.debug("Expression " + cexp.toString() + " generated result " + evalResult + " - type=" + evalResult.getClass().getName()); @@ -212,7 +263,6 @@ __log.debug("Could not evaluate expression because of ", t); throw new FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, t.getMessage(), t); } - } }
Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath10/OXPath10Expression.java URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath10/OXPath10Expression.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath10/OXPath10Expression.java (original) +++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath10/OXPath10Expression.java Thu Nov 20 14:32:30 2008 @@ -18,14 +18,22 @@ */ package org.apache.ode.bpel.rtrep.v2.xpath10; -import org.apache.ode.utils.NSContext; -import org.apache.ode.bpel.rtrep.v2.*; - -import javax.xml.namespace.QName; import java.io.Serializable; import java.net.URI; import java.util.HashMap; +import javax.xml.namespace.QName; + +import org.apache.ode.bpel.rtrep.v2.OBase; +import org.apache.ode.bpel.rtrep.v2.OExpression; +import org.apache.ode.bpel.rtrep.v2.OLValueExpression; +import org.apache.ode.bpel.rtrep.v2.OLink; +import org.apache.ode.bpel.rtrep.v2.OMessageVarType; +import org.apache.ode.bpel.rtrep.v2.OProcess; +import org.apache.ode.bpel.rtrep.v2.OScope; +import org.apache.ode.bpel.rtrep.v2.OXslSheet; +import org.apache.ode.utils.NSContext; + /** * Jaxen-based compiled-xpath representation for XPATH 1.0 expression language. Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpFunctionResolver.java URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpFunctionResolver.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpFunctionResolver.java (original) +++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpFunctionResolver.java Thu Nov 20 14:32:30 2008 @@ -19,8 +19,6 @@ package org.apache.ode.bpel.rtrep.v2.xpath20; -import java.io.IOException; -import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -33,12 +31,12 @@ import javax.xml.namespace.QName; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPathFunction; import javax.xml.xpath.XPathFunctionException; import javax.xml.xpath.XPathFunctionResolver; import net.sf.saxon.dom.NodeWrapper; +import net.sf.saxon.trans.XPathException; import net.sf.saxon.value.IntegerValue; import net.sf.saxon.value.QNameValue; @@ -63,7 +61,6 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; -import org.xml.sax.SAXException; /** * @author mriou <mriou at apache dot org> @@ -89,7 +86,7 @@ String localName = functionName.getLocalPart(); if (Constants.EXT_FUNCTION_GETVARIABLEDATA.equals(localName)) { return new GetVariableData(); - } else if (Constants.EXT_FUNCTION_GETVARIABLEPROPRTY.equals(localName)) { + } else if (Constants.EXT_FUNCTION_GETVARIABLEPROPERTY.equals(localName)) { return new GetVariableProperty(); } else if (Constants.EXT_FUNCTION_GETLINKSTATUS.equals(localName)) { return new GetLinkStatus(); @@ -473,11 +470,16 @@ } } else { try { - List elmts = (List) args.get(1); - Element elt = (Element) elmts.get(0); + Element elt = null; + if (args.get(1) instanceof List) { + List elmts = (List) args.get(1); + elt = (Element) elmts.get(0); + } else if (args.get(1) instanceof Element) { + elt = (Element) args.get(1); + } pairs = Helper.extractNameValueMap(elt); } catch (ClassCastException e) { - throw new XPathFunctionException(new FaultException(faultQName, "Expected an element similar too: <foo><name1>value1</name1>name2>value2</name2>...</foo>")); + throw new XPathFunctionException(new FaultException(faultQName, "Expected an element similar too: <foo><name1>value1</name1><name2>value2</name2>...</foo>")); } } @@ -975,6 +977,11 @@ } else { localName = qName; } + } else if (args.get(1) instanceof QName) { + QName qName = (QName) args.get(1); + namespaceUri = qName.getNamespaceURI(); + localName = qName.getLocalPart(); + prefix = qName.getPrefix(); } else { throw new XPathFunctionException("Unexpected argument type: "+args.get(1).getClass()); } @@ -1126,10 +1133,13 @@ try { return Integer.parseInt(extractString(arg)); } catch (ClassCastException cce) { - if (arg instanceof IntegerValue) { - return (int) ((IntegerValue) arg).getDoubleValue(); - } - throw new IllegalArgumentException("Parameter MUST point to an integer, single element or text node.", cce); + try { + return (int) ((IntegerValue) arg).longValue(); + } catch (XPathException xpe) { + throw new IllegalArgumentException("Parameter MUST point to an integer, single element or text node.", xpe); + } catch (ClassCastException ccce) { + throw new IllegalArgumentException("Parameter MUST point to an integer, single element or text node.", ccce); + } } catch (NumberFormatException nfe) { throw new IllegalArgumentException("Parameter MUST point to an integer, single element or text node.", nfe); } Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpVariableResolver.java URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpVariableResolver.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpVariableResolver.java (original) +++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/JaxpVariableResolver.java Thu Nov 20 14:32:30 2008 @@ -19,20 +19,27 @@ package org.apache.ode.bpel.rtrep.v2.xpath20; -import net.sf.saxon.value.DateTimeValue; +import java.util.ArrayList; +import java.util.Calendar; + +import javax.xml.namespace.QName; +import javax.xml.xpath.XPathVariableResolver; + +import net.sf.saxon.Configuration; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.common.FaultException; +import org.apache.ode.bpel.rtrep.v2.EvaluationContext; +import org.apache.ode.bpel.rtrep.v2.OLink; +import org.apache.ode.bpel.rtrep.v2.OMessageVarType; +import org.apache.ode.bpel.rtrep.v2.OScope; +import org.apache.ode.bpel.rtrep.v2.OXsdTypeVarType; import org.apache.ode.bpel.rtrep.v2.xpath10.OXPath10ExpressionBPEL20; -import org.apache.ode.bpel.rtrep.v2.*; import org.apache.ode.utils.Namespaces; import org.apache.ode.utils.xsd.XSTypes; +import org.w3c.dom.Document; import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.namespace.QName; -import javax.xml.xpath.XPathVariableResolver; -import java.util.Calendar; /** * @author mriou <mriou at apache dot org> @@ -43,10 +50,12 @@ private EvaluationContext _ectx; private OXPath10ExpressionBPEL20 _oxpath; + private Configuration _config; - public JaxpVariableResolver(EvaluationContext ectx, OXPath10ExpressionBPEL20 oxpath) { + public JaxpVariableResolver(EvaluationContext ectx, OXPath10ExpressionBPEL20 oxpath, Configuration config) { _ectx = ectx; _oxpath = oxpath; + _config = config; } public Object resolveVariable(QName variableName) { @@ -86,7 +95,7 @@ OMessageVarType.Part part = partName == null ? null : ((OMessageVarType)variable.type).parts.get(partName); try{ - Node variableNode = _ectx.readVariable(variable, part); + final Node variableNode = _ectx.readVariable(variable, part); if (variableNode == null) throw new FaultException(variable.getOwner().constants.qnSelectionFailure, "Unknown variable " + variableName.getLocalPart()); @@ -99,8 +108,10 @@ // Saxon expects a node list, this nodelist should contain exactly one item, the attribute // value - return new SingletonNodeList(variableNode); + // return new SingletonNodeList(variableNode); + // Saxon used to expect a node list, but now a regular node will suffice. + return variableNode; } catch(FaultException e){ throw new WrappedFaultException(e); } @@ -108,43 +119,45 @@ } private Object getSimpleContent(Node simpleNode, QName type) { - String text = simpleNode.getTextContent(); - try { - Object jobj = XSTypes.toJavaObject(type,text); - // Saxon wants its own dateTime type and doesn't like Calendar or Date - if (jobj instanceof Calendar) return new DateTimeValue((Calendar) jobj, true); - else return jobj; - } catch (Exception e) { } - // Elegant way failed, trying brute force - try { - return Integer.valueOf(text); - } catch (NumberFormatException e) { } - try { - return Double.valueOf(text); - } catch (NumberFormatException e) { } - // Remember: always a node set - if (simpleNode.getParentNode() != null) - return simpleNode.getParentNode().getChildNodes(); - else return text; - } - - - private static class SingletonNodeList implements NodeList { - private Node _node; - - SingletonNodeList(Node node) { - _node = node; - } - - public Node item(int index) { - if (index != 0) - throw new IndexOutOfBoundsException(""+index); - return _node; - } - - public int getLength() { - return 1; - } - - } + Document doc = (simpleNode instanceof Document) ? ((Document) simpleNode) : simpleNode + .getOwnerDocument(); + String text = simpleNode.getTextContent(); + try { + Object jobj = XSTypes.toJavaObject(type,text); + // Saxon wants its own dateTime type and doesn't like Calendar or Date + if (jobj instanceof Calendar) { + return ((Calendar) jobj).getTime(); + } else if (jobj instanceof Long) { + try { + return Long.valueOf(text); + } catch (NumberFormatException e) { } + } else if (jobj instanceof Double) { + try { + return Double.valueOf(text); + } catch (NumberFormatException e) { } + } else if (jobj instanceof Integer) { + try { + return Integer.valueOf(text); + } catch (NumberFormatException e) { } + } else { + // return the value wrapped in a text node + return doc.createTextNode(jobj.toString()); + } + } catch (Exception e) { } + // Elegant way failed, trying brute force + // Actually, we don't want to return simple types, so no more brute force + try { + return Integer.valueOf(text); + } catch (NumberFormatException e) { } + try { + return Double.valueOf(text); + } catch (NumberFormatException e) { } + + // Remember: always a node set + if (simpleNode.getParentNode() != null) + return simpleNode.getParentNode().getChildNodes(); + else { + return doc.createTextNode(text); + } + } } Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/XPath20ExpressionRuntime.java URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/XPath20ExpressionRuntime.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/XPath20ExpressionRuntime.java (original) +++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xpath20/XPath20ExpressionRuntime.java Thu Nov 20 14:32:30 2008 @@ -18,31 +18,43 @@ */ package org.apache.ode.bpel.rtrep.v2.xpath20; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; +import javax.xml.transform.TransformerFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import net.sf.saxon.om.NamespaceConstant; import net.sf.saxon.trans.DynamicError; import net.sf.saxon.value.DurationValue; -import net.sf.saxon.xpath.XPathEvaluator; import net.sf.saxon.xpath.XPathFactoryImpl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.common.FaultException; -import org.apache.ode.bpel.rtrep.v2.OExpression; +import org.apache.ode.bpel.rtrep.common.ConfigurationException; import org.apache.ode.bpel.rtrep.v2.EvaluationContext; import org.apache.ode.bpel.rtrep.v2.ExpressionLanguageRuntime; +import org.apache.ode.bpel.rtrep.v2.OExpression; import org.apache.ode.bpel.rtrep.v2.xpath10.OXPath10Expression; -import org.apache.ode.bpel.rtrep.common.ConfigurationException; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.ISO8601DateParser; import org.apache.ode.utils.xsd.Duration; import org.apache.ode.utils.xsl.XslTransformHandler; -import org.w3c.dom.*; - -import javax.xml.namespace.QName; -import javax.xml.transform.TransformerFactory; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import java.util.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; /** * XPath 2.0 Expression Language run-time subsytem. @@ -79,9 +91,15 @@ return (Number) evaluate(cexp, ctx, XPathConstants.NUMBER); } - public List evaluate(OExpression cexp, EvaluationContext ctx) throws FaultException { + @SuppressWarnings("unchecked") + public List evaluate(OExpression cexp, EvaluationContext ctx) throws FaultException { List result; - Object someRes = evaluate(cexp, ctx, XPathConstants.NODESET); + Object someRes = null; + try { + someRes = evaluate(cexp, ctx, XPathConstants.NODESET); + } catch (Exception e) { + someRes = evaluate(cexp, ctx, XPathConstants.STRING); + } if (someRes instanceof List) { result = (List) someRes; __log.debug("Returned list of size " + result.size()); @@ -90,20 +108,21 @@ Object simpleType = result.get(0); // Dates get a separate treatment as we don't want to call toString on them String textVal; - if (simpleType instanceof Date) + if (simpleType instanceof Date) { textVal = ISO8601DateParser.format((Date) simpleType); - else if (simpleType instanceof DurationValue) + } else if (simpleType instanceof DurationValue) { textVal = ((DurationValue)simpleType).getStringValue(); - else + } else { textVal = simpleType.toString(); + } // Wrapping in a document - Document d = DOMUtils.newDocument(); + Document document = DOMUtils.newDocument(); // Giving our node a parent just in case it's an LValue expression - Element wrapper = d.createElement("wrapper"); - Text text = d.createTextNode(textVal); + Element wrapper = document.createElement("wrapper"); + Text text = document.createTextNode(textVal); wrapper.appendChild(text); - d.appendChild(wrapper); + document.appendChild(wrapper); result = Collections.singletonList(text); } } else if (someRes instanceof NodeList) { @@ -112,9 +131,19 @@ result = new ArrayList(retVal.getLength()); for(int m = 0; m < retVal.getLength(); ++m) { Node val = retVal.item(m); - if (val.getNodeType() == Node.DOCUMENT_NODE) val = ((Document)val).getDocumentElement(); + if (val.getNodeType() == Node.DOCUMENT_NODE) { + val = ((Document)val).getDocumentElement(); + } result.add(val); } + } else if (someRes instanceof String) { + // Wrapping in a document + Document document = DOMUtils.newDocument(); + Element wrapper = document.createElement("wrapper"); + Text text = document.createTextNode((String) someRes); + wrapper.appendChild(text); + document.appendChild(wrapper); + result = Collections.singletonList(text); } else { result = null; } @@ -132,7 +161,7 @@ } public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context) throws FaultException { - List literal = DOMUtils.toList(evaluate(cexp, context, XPathConstants.NODESET)); + List literal = DOMUtils.toList(evaluate(cexp, context)); if (literal.size() == 0) throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "No results for expression: " + cexp); if (literal.size() > 1) @@ -145,7 +174,13 @@ cal.setTime((Date) date); return cal; } - if (date instanceof Element) date = ((Element)date).getTextContent(); + if (date instanceof Element) { + date = ((Element) date).getTextContent(); + } + + if (date instanceof Text) { + date = ((Text) date).getTextContent(); + } try { return ISO8601DateParser.parseCal(date.toString()); @@ -169,23 +204,35 @@ private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type) throws FaultException { try { - net.sf.saxon.xpath.XPathFactoryImpl xpf = new net.sf.saxon.xpath.XPathFactoryImpl(); - OXPath20ExpressionBPEL20 oxpath20 = ((OXPath20ExpressionBPEL20) cexp); - xpf.setXPathFunctionResolver(new JaxpFunctionResolver(ctx, oxpath20)); - xpf.setXPathVariableResolver(new JaxpVariableResolver(ctx, oxpath20)); - XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath(); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+XPathConstants.DOM_OBJECT_MODEL, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_JDOM, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_XOM, + "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_DOM4J, + "net.sf.saxon.xpath.XPathFactoryImpl"); + + XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + JaxpFunctionResolver funcResolver = new JaxpFunctionResolver( + ctx, oxpath20); + JaxpVariableResolver varResolver = new JaxpVariableResolver(ctx, oxpath20, ((XPathFactoryImpl) xpf).getConfiguration()); + xpf.setXPathFunctionResolver(funcResolver); + xpf.setXPathVariableResolver(varResolver); + XPath xpe = xpf.newXPath(); xpe.setNamespaceContext(oxpath20.namespaceCtx); - // Just checking that the expression is valid XPathExpression expr = xpe.compile(((OXPath10Expression)cexp).xpath); Node contextNode = ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode(); // Create step nodes in XPath in case it is incompletely instantiated if (oxpath20.insertMissingData) { - XPath20ExpressionModifier modifier = new XPath20ExpressionModifier(oxpath20.namespaceCtx, xpe.getStaticContext().getNamePool()); + XPath20ExpressionModifier modifier = new XPath20ExpressionModifier(oxpath20.namespaceCtx, ((XPathFactoryImpl) xpf).getConfiguration().getNamePool()); modifier.insertMissingData(expr, ctx.getRootNode()); } - Object evalResult = expr.evaluate(ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode(), type); + Object evalResult = expr.evaluate(contextNode, type); if (evalResult != null && __log.isDebugEnabled()) { __log.debug("Expression " + cexp.toString() + " generated result " + evalResult + " - type=" + evalResult.getClass().getName()); Modified: ode/trunk/utils/src/main/java/org/apache/ode/utils/DOMUtils.java URL: http://svn.apache.org/viewvc/ode/trunk/utils/src/main/java/org/apache/ode/utils/DOMUtils.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/utils/src/main/java/org/apache/ode/utils/DOMUtils.java (original) +++ ode/trunk/utils/src/main/java/org/apache/ode/utils/DOMUtils.java Thu Nov 20 14:32:30 2008 @@ -1044,6 +1044,15 @@ return ret; } + public static QName getNodeQName(String qualifiedName) { + int index = qualifiedName.indexOf(":"); + if (index >= 0) { + return new QName(qualifiedName.substring(0, index), qualifiedName.substring(index + 1)); + } else { + return new QName(qualifiedName); + } + } + public static Document getDocument(Node contextNode) { return (contextNode == null) ? DOMUtils.newDocument() : contextNode.getOwnerDocument(); } @@ -1052,4 +1061,4 @@ String prefix = qName.getPrefix(), localPart = qName.getLocalPart(); return (prefix == null || "".equals(prefix)) ? localPart : (prefix + ":" + localPart); } -} \ No newline at end of file +} Modified: ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java URL: http://svn.apache.org/viewvc/ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java?rev=719409&r1=719408&r2=719409&view=diff ============================================================================== --- ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java (original) +++ ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java Thu Nov 20 14:32:30 2008 @@ -50,6 +50,7 @@ public static final String WSDL_20 = "http://www.w3.org/2006/01/wsdl"; public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; public static final String XML_INSTANCE = "http://www.w3. org/2001/XMLSchema-instance"; + public static final String XPATH_FUNCTIONS = "http://www.w3.org/2005/xpath-functions"; public static final String JBI_END_POINT_REFERENCE = "http://java.sun.com/jbi/end-point-reference"; public static final QName WS_ADDRESSING_ENDPOINT = new QName(WS_ADDRESSING_NS, "EndpointReference"); public static final QName WS_ADDRESSING_USINGADDRESSING = new QName(WS_ADDRESSING_WSDL_NS, "UsingAddressing");
