| /* Copyright 2006 The Apache Software Foundation | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package xmlcursor.xquery.detailed; | |
| import common.Common; | |
| import org.apache.xmlbeans.XmlCursor; | |
| import org.apache.xmlbeans.XmlObject; | |
| import org.apache.xmlbeans.XmlOptions; | |
| import org.junit.Test; | |
| import java.io.File; | |
| import java.util.HashMap; | |
| import java.util.Map; | |
| import static org.junit.Assert.*; | |
| /** This class tests the use of XmlOptions in binding XQuery variables */ | |
| public class XQueryVariableBindingTest extends Common | |
| { | |
| public static final String XQUERY_CASE_DIR = | |
| XBEAN_CASE_ROOT + P + "xmlcursor" + P + "xquery"; | |
| public static File dir = new File(XQUERY_CASE_DIR); | |
| private XmlCursor _testDocCursor1() throws Exception { | |
| String xml = | |
| "<elem1>" + | |
| "<elem11 id=\"123\">text11</elem11>" + | |
| "<elem21 id=\"456\">text11</elem21>" + | |
| "<elem12 idRef=\"123\"/>" + | |
| "<elem13 idRef=\"456\"/>" + | |
| "<elem14 idRef=\"123\"/>" + | |
| "<elem15 idRef=\"456\"/>" + | |
| "<elem16 idRef=\"123\"/>" + | |
| "<elem17 idRef=\"789\"/>" + | |
| "</elem1>"; | |
| XmlObject doc = XmlObject.Factory.parse(xml); | |
| XmlCursor xc = doc.newCursor(); | |
| return xc; | |
| } | |
| private void _verifySelection(XmlCursor xc) { | |
| assertEquals(3, xc.getSelectionCount()); | |
| assertTrue(xc.toNextSelection()); | |
| assertEquals("<elem12 idRef=\"123\"/>", xc.xmlText()); | |
| assertTrue(xc.toNextSelection()); | |
| assertEquals("<elem14 idRef=\"123\"/>", xc.xmlText()); | |
| assertTrue(xc.toNextSelection()); | |
| assertEquals("<elem16 idRef=\"123\"/>", xc.xmlText()); | |
| } | |
| /** test the automatic binding of $this to the current node: selectPath() */ | |
| @Test | |
| public void testThisVariable1() throws Exception { | |
| XmlCursor xc = _testDocCursor1(); | |
| xc.toFirstChild(); //<elem1> | |
| xc.toFirstChild(); //<elem11> | |
| xc.selectPath("//*[@idRef=$this/@id]"); | |
| _verifySelection(xc); | |
| xc.clearSelections(); | |
| xc.dispose(); | |
| } | |
| // this fails: see JIRA issue XMLBEANS-276 | |
| /** test the binding of a variable to the current node: selectPath() */ | |
| @Test | |
| public void testCurrentNodeVariable1() throws Exception { | |
| XmlCursor xc = _testDocCursor1(); | |
| xc.toFirstChild(); | |
| xc.toFirstChild(); | |
| XmlOptions opts = new XmlOptions(); | |
| opts.setXqueryCurrentNodeVar("cur"); | |
| //String varDecl = "declare variable $cur external; "; | |
| //xc.selectPath(varDecl + "//*[@idRef=$cur/@id]", opts); | |
| xc.selectPath("//*[@idRef=$cur/@id]", opts); | |
| _verifySelection(xc); | |
| xc.clearSelections(); | |
| xc.dispose(); | |
| } | |
| private XmlCursor _testDocCursor2() throws Exception { | |
| File f = new File(dir, "employees.xml"); | |
| XmlObject doc = XmlObject.Factory.parse(f); | |
| return doc.newCursor(); | |
| } | |
| public void _verifyQueryResult(XmlCursor qc) { | |
| System.out.println(qc.xmlText()); | |
| assertTrue(qc.toFirstChild()); | |
| assertEquals("<phone location=\"work\">(425)555-5665</phone>", qc.xmlText()); | |
| assertTrue(qc.toNextSibling()); | |
| assertEquals("<phone location=\"work\">(425)555-6897</phone>", qc.xmlText()); | |
| assertFalse(qc.toNextSibling()); | |
| } | |
| /** test the automatic binding of $this to the current node: execQuery() */ | |
| @Test | |
| public void testThisVariable2() throws Exception | |
| { | |
| XmlCursor xc = _testDocCursor2(); | |
| // xc.toNextToken(); | |
| String q = | |
| "for $e in $this/employees/employee " + | |
| "let $s := $e/address/state " + | |
| "where $s = 'WA' " + | |
| "return $e//phone[@location='work']"; | |
| XmlCursor qc = xc.execQuery(q); | |
| _verifyQueryResult(qc); | |
| xc.dispose(); | |
| qc.dispose(); | |
| } | |
| /** test the binding of a variable to the current node: execQuery() */ | |
| @Test | |
| public void testCurrentNodeVariable2() throws Exception { | |
| XmlCursor xc = _testDocCursor2(); | |
| // xc.toNextToken(); | |
| String q = | |
| "for $e in $cur/employees/employee " + | |
| "let $s := $e/address/state " + | |
| "where $s = 'WA' " + | |
| "return $e//phone[@location='work']"; | |
| XmlOptions opts = new XmlOptions(); | |
| opts.setXqueryCurrentNodeVar("cur"); | |
| //String varDecl = "declare variable $cur external; "; | |
| //XmlCursor qc = xc.execQuery(varDecl + q, opts); | |
| XmlCursor qc = xc.execQuery(q, opts); | |
| _verifyQueryResult(qc); | |
| xc.dispose(); | |
| qc.dispose(); | |
| } | |
| private XmlObject[] _execute(XmlObject xo, Map m, String q) { | |
| XmlOptions opts = new XmlOptions(); | |
| opts.setXqueryVariables(m); | |
| return xo.execQuery(q, opts); | |
| } | |
| /** test the binding of a variable to an XmlTokenSource using a map */ | |
| @Test | |
| public void testOneVariable() throws Exception { | |
| File f = new File(dir, "bookstore.xml"); | |
| XmlObject doc = XmlObject.Factory.parse(f); | |
| String q = | |
| "declare variable $rt external; " + | |
| "for $x in $rt/book " + | |
| "where $x/price > 30 " + | |
| "return $x/title"; | |
| Map<String,Object> m = new HashMap<>(); | |
| m.put("rt", doc.selectChildren("", "bookstore")[0]); | |
| XmlObject[] results = _execute(doc, m, q); | |
| assertNotNull(results); | |
| assertEquals(2, results.length); | |
| assertEquals("<title lang=\"en\">XQuery Kick Start</title>", results[0].xmlText()); | |
| assertEquals("<title lang=\"en\">Learning XML</title>", results[1].xmlText()); | |
| } | |
| /** test the binding of multiple variables using a map; | |
| at the same time, test the binding of a variable to a String | |
| */ | |
| @Test | |
| public void testMultipleVariables() throws Exception { | |
| File f = new File(dir, "bookstore.xml"); | |
| XmlObject doc = XmlObject.Factory.parse(f); | |
| String q = | |
| "declare variable $rt external; " + | |
| "declare variable $c external; " + | |
| "for $x in $rt/book " + | |
| "where $x[@category=$c] " + | |
| "return $x/title"; | |
| Map<String,Object> m = new HashMap<>(); | |
| m.put("rt", doc.selectChildren("", "bookstore")[0]); | |
| m.put("c", "CHILDREN"); | |
| XmlObject[] results = _execute(doc, m, q); | |
| assertNotNull(results); | |
| assertEquals(1, results.length); | |
| assertEquals("<title lang=\"en\">Harry Potter</title>", results[0].xmlText()); | |
| } | |
| } |