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


Reply via email to