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");