You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by va...@apache.org on 2015/02/02 19:54:55 UTC

[3/3] ode git commit: ODE-1027: Properly cast numbers in XPath 1.0 expressions.

ODE-1027: Properly cast numbers in XPath 1.0 expressions.


Project: http://git-wip-us.apache.org/repos/asf/ode/repo
Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/28dcae93
Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/28dcae93
Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/28dcae93

Branch: refs/heads/master
Commit: 28dcae93d007ede3b93b7e9df53584d021452e45
Parents: f17a322
Author: Tammo van Lessen <tv...@gmail.com>
Authored: Mon Feb 2 19:54:36 2015 +0100
Committer: Tammo van Lessen <tv...@gmail.com>
Committed: Mon Feb 2 19:54:36 2015 +0100

----------------------------------------------------------------------
 .../elang/xpath10/runtime/JaxenContexts.java    | 35 +++++++++++++++++---
 1 file changed, 31 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/28dcae93/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath10/runtime/JaxenContexts.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath10/runtime/JaxenContexts.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath10/runtime/JaxenContexts.java
index 90643e4..7cc32c8 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath10/runtime/JaxenContexts.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath10/runtime/JaxenContexts.java
@@ -69,6 +69,18 @@ class JaxenContexts implements FunctionContext, VariableContext {
     private static final FunctionContext __defaultXPathFunctions = XPathFunctionContext.getInstance();
     
     private static final QName BOOLEAN = new QName("http://www.w3.org/2001/XMLSchema", "boolean");
+    private static final QName BYTE = new QName("http://www.w3.org/2001/XMLSchema", "byte");
+    private static final QName INT = new QName("http://www.w3.org/2001/XMLSchema", "int");
+    private static final QName INTEGER = new QName("http://www.w3.org/2001/XMLSchema", "integer");
+    private static final QName LONG = new QName("http://www.w3.org/2001/XMLSchema", "long");
+    private static final QName SHORT = new QName("http://www.w3.org/2001/XMLSchema", "short");
+    private static final QName UNSIGNED_INT = new QName("http://www.w3.org/2001/XMLSchema", "unsignedInt");
+    private static final QName UNSIGNED_SHORT = new QName("http://www.w3.org/2001/XMLSchema", "unsignedShort");
+    private static final QName UNSIGNED_BYTE = new QName("http://www.w3.org/2001/XMLSchema", "unsignedByte");
+    private static final QName DECIMAL = new QName("http://www.w3.org/2001/XMLSchema", "decimal");
+    private static final QName FLOAT = new QName("http://www.w3.org/2001/XMLSchema", "float");
+    private static final QName DOUBLE = new QName("http://www.w3.org/2001/XMLSchema", "double");
+
 
     private OXPath10Expression _oxpath;
     private EvaluationContext _xpathEvalCtx;
@@ -189,10 +201,25 @@ class JaxenContexts implements FunctionContext, VariableContext {
                 if (_xpathEvalCtx.narrowTypes() && type instanceof OXsdTypeVarType && ((OXsdTypeVarType)type).simple) {
                 	String value = variableNode.getTextContent();
                 	OXsdTypeVarType theType = (OXsdTypeVarType)type;
-                	
-                	if (BOOLEAN.equals(theType.xsdType)) {
-                		return new Boolean(value) ;
-                	}
+
+                    // cast booleans to boolean
+                    if (BOOLEAN.equals(theType.xsdType)) {
+                        return new Boolean(value) ;
+                    }
+
+                    // and numbers to numbers (XPath only understands Double, so Double it shall be.
+                    if (INT.equals(theType.xsdType) || UNSIGNED_SHORT.equals(theType.xsdType) ||
+                            INTEGER.equals(theType.xsdType) ||
+                            LONG.equals(theType.xsdType) || UNSIGNED_INT.equals(theType.xsdType) ||
+                            SHORT.equals(theType.xsdType) || UNSIGNED_BYTE.equals(theType.xsdType) ||
+                            BYTE.equals(theType.xsdType) ||
+                            DECIMAL.equals(theType.xsdType) ||
+                            FLOAT.equals(theType.xsdType) ||
+                            DOUBLE.equals(theType.xsdType)
+                            ) {
+                        return new Double(value);
+                    }
+
                     return value;
                 } else {
                     return variableNode;