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/06/11 12:24:53 UTC

[2/2] ode git commit: fixes ODE-991. Thanks to Ciaran Jessup for the patch.

fixes ODE-991. Thanks to Ciaran Jessup for the patch.


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

Branch: refs/heads/master
Commit: 768cb6dcee7f97a2d606ea7ae60f35a79e03238d
Parents: e9a4f89
Author: Tammo van Lessen <tv...@gmail.com>
Authored: Thu Jun 11 12:18:09 2015 +0200
Committer: Tammo van Lessen <tv...@gmail.com>
Committed: Thu Jun 11 12:24:33 2015 +0200

----------------------------------------------------------------------
 .../xpath20/runtime/JaxpFunctionResolver.java   | 22 +++++++++++++++++++-
 .../runtime/XPath20ExpressionRuntimeTest.java   | 13 +++++++++++-
 .../src/test/resources/xpath20/variables.xml    | 10 +++++++++
 3 files changed, 43 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/768cb6dc/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
index aa29367..3bceb21 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
@@ -35,11 +35,13 @@ import javax.xml.xpath.XPathFunction;
 import javax.xml.xpath.XPathFunctionException;
 import javax.xml.xpath.XPathFunctionResolver;
 
+import net.sf.saxon.dom.DOMNodeList;
 import net.sf.saxon.dom.NodeWrapper;
 import net.sf.saxon.trans.XPathException;
 import net.sf.saxon.value.DayTimeDurationValue;
 import net.sf.saxon.value.IntegerValue;
 import net.sf.saxon.value.QNameValue;
+import net.sf.saxon.value.SequenceExtent;
 import net.sf.saxon.value.YearMonthDurationValue;
 
 import org.apache.commons.httpclient.URIException;
@@ -885,6 +887,15 @@ public class JaxpFunctionResolver implements XPathFunctionResolver {
                     targetNodes.add((Element) ((NodeWrapper) delete).getUnderlyingNode());
                 } else if (delete instanceof Element) {
                     targetNodes.add((Element) delete);
+                } else if (delete instanceof SequenceExtent) {
+                    try {
+                        DOMNodeList nodeList= DOMNodeList.checkAndMake((SequenceExtent)delete);
+                        for (int i=0;i<nodeList.getLength();i++){
+                            targetNodes.add(nodeList.item(i));
+                        }
+                    } catch (XPathException e) {
+                        throw new XPathFunctionException(e);
+                    }
                 } else {
                     throw new XPathFunctionException("Unexpected argument type: " + delete.getClass());
                 }
@@ -918,12 +929,21 @@ public class JaxpFunctionResolver implements XPathFunctionResolver {
                     }
                 }
             }
+            // 2xLoops as previously the contents of the 'children' list appeared to
+            // be being changed by the clonedElmt.removeChild call, meaning the position
+            // offset was incorrect, a possibly better approach would be to sort the position
+            // indices and iterate *backwards* but for my needs this approach suffices.
+            List<Node> clonedChildrenToRemove = new ArrayList<Node>();
             final Element clonedElmt = (Element) parentElmt.cloneNode(true);
             children = clonedElmt.getChildNodes();
             for (int target = 0; target < positions.length; target++) {
-                Element deleteElmt = (Element) children.item(positions[target]);
+	            Element deleteElmt = (Element) children.item(positions[target]);
+	            clonedChildrenToRemove.add(deleteElmt);
+            }
+            for (Node deleteElmt : clonedChildrenToRemove) {
                 clonedElmt.removeChild(deleteElmt);
             }
+
             // Saxon doesn't like clones with no children, so I'll oblige
             if (clonedElmt.getChildNodes().getLength() == 0) {
                 try {

http://git-wip-us.apache.org/repos/asf/ode/blob/768cb6dc/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java b/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
index 3968b05..137a848 100644
--- a/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
+++ b/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntimeTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.ode.bpel.elang.xpath20.runtime;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import java.net.URI;
@@ -44,6 +44,7 @@ import org.apache.ode.bpel.o.OMessageVarType.Part;
 import org.apache.ode.bpel.o.OProcess.OProperty;
 import org.apache.ode.bpel.o.OScope.Variable;
 import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.Namespaces;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -230,6 +231,14 @@ public class XPath20ExpressionRuntimeTest implements EvaluationContext {
         	fail("Missing '"+insertElementName+"' element has not been inserted");
         }
     }
+    
+    public void testODE911() throws Exception {
+        OXPath20ExpressionBPEL20 exp = compile("ode:delete($ODE991var/tns:empty)");
+        Element retVal = (Element)_runtime.evaluateNode(exp, this);
+        assertNotNull(retVal);
+        assertEquals(3, retVal.getElementsByTagNameNS("http://foobar", "notempty").getLength());
+        assertEquals(0, retVal.getElementsByTagNameNS("http://foobar", "empty").getLength());
+    }
 
     public Node readVariable(Variable variable, Part part) throws FaultException {
         return _vars.get(variable.name);
@@ -274,6 +283,8 @@ public class XPath20ExpressionRuntimeTest implements EvaluationContext {
         doc.appendChild(e);
         e.appendChild(doc.createTextNode(xpath));
         Expression exp = new Expression(e);
+        exp.getNamespaceContext().register("tns", "http://foobar");
+        exp.getNamespaceContext().register("ode", Namespaces.ODE_EXTENSION_NS);
         return (OXPath20ExpressionBPEL20)_compiler.compileLValue(exp);
     }
 

http://git-wip-us.apache.org/repos/asf/ode/blob/768cb6dc/bpel-runtime/src/test/resources/xpath20/variables.xml
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/test/resources/xpath20/variables.xml b/bpel-runtime/src/test/resources/xpath20/variables.xml
index 919cbc3..38c5996 100644
--- a/bpel-runtime/src/test/resources/xpath20/variables.xml
+++ b/bpel-runtime/src/test/resources/xpath20/variables.xml
@@ -71,4 +71,14 @@
 		</tns:ExampleMessage>
 	</messageTypeVar>
 
+	<elementVar name="ODE991var"  xmlns:tns="http://foobar" >
+					<tns:ApplicationData>
+						<tns:empty/>
+						<tns:notempty/>
+						<tns:empty/>
+						<tns:notempty/>
+						<tns:empty/>
+						<tns:notempty/>
+                    </tns:ApplicationData>
+	</elementVar>
 </variables>
\ No newline at end of file