You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2008/11/20 23:32:31 UTC
svn commit: r719409 [2/2] - in /ode/trunk: ./
bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/
bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/xpath10/
bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/xpath20/
bpel-co...
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");