/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.synapse.mediators.xquery; import junit.framework.TestCase; import net.sf.saxon.s9api.ItemType; import net.sf.saxon.s9api.XdmNodeKind; import org.apache.synapse.MessageContext; import org.apache.synapse.config.SynapseConfigUtils; import org.apache.synapse.mediators.TestUtils; import javax.xml.namespace.QName; import java.util.List; import java.util.ArrayList; /** * */ public class XQueryMediatorTest extends TestCase { public final static String sampleXml = "<bookstore><book category=\"COOKING\"> " + "<title lang=\"en\">Everyday Italian</title>\n" + " <author>Giada De Laurentiis</author>\n" + " <year>2005</year>\n" + " <price>30.00</price>\n" + "\n" + "</book>\n" + "\n" + "<book category=\"CHILDREN\">\n" + " <title lang=\"en\">Harry Potter</title>\n" + " <author>J K. Rowling</author>\n" + " <year>2005</year>\n" + " <price>29.99</price>\n" + "</book>\n" + "\n" + "<book category=\"WEB\">\n" + " <title lang=\"en\">XQuery Kick Start</title>\n" + " <author>James McGovern</author>\n" + " <author>Per Bothner</author>\n" + " <author>Kurt Cagle</author>\n" + " <author>James Linn</author>\n" + " <author>Vaidyanathan Nagarajan</author>\n" + "\n" + " <year>2003</year>\n" + " <price>49.99</price>\n" + "</book>\n" + "\n" + "<book category=\"WEB\">\n" + " <title lang=\"en\">Learning XML</title>\n" + " <author>Erik T. Ray</author>\n" + " <year>2003</year>\n" + "\n" + " <price>39.95</price>\n" + "</book>\n" + "\n" + "</bookstore>"; public final static String sampleXml2 = "<m0:CheckPriceRequest" + " xmlns:m0=\"http://www.apache-synapse.org/test\">\n" + " <m0:Code>IBM</m0:Code>\n" + "</m0:CheckPriceRequest>"; public final static String sampleXml3 = "<m0:return xmlns:m0=\"http://services.samples/xsd\">\n" + "\t<m0:symbol>IBM</m0:symbol>\n" + "\t<m0:last>122222</m0:last>\n" + "</m0:return>"; public final static String externalXMl = "<commission>\n" + " <vendor symbol=\"IBM\">44444</vendor>\n" + " <vendor symbol=\"MSFT\">55555</vendor>\n" + " <vendor symbol=\"SUN\">66666</vendor>\n" + "</commission>"; public void testQueryWithAll() throws Exception { MessageContext mc = TestUtils.getTestContext("<foo/>", null); XQueryMediator mediator = new XQueryMediator(); mediator.setQuerySource("declare variable $intVar as xs:int external;" + "declare variable $boolVar as xs:boolean external;" + "declare variable $byteVar as xs:byte external;" + "declare variable $longVar as xs:long external;" + "declare variable $doubleVar as xs:double external;" + "declare variable $shortVar as xs:short external;" + "declare variable $floatVar as xs:float external;" + "declare variable $stringVar as xs:string external;" + "declare variable $integerVar as xs:integer external;" + "document { " + "<a xmlns='http://a/uri' z:in='out' xmlns:z='http://z/uri'>" + "<b>{$intVar+2}<e>{$boolVar}</e>" + "<all>" + "{$byteVar}," + "{$shortVar}," + "{$doubleVar}," + "{$longVar}," + "{$floatVar}," + "{$stringVar}," + "{$integerVar+xs:integer('5')}," + "</all></b></a> }"); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable intVariable = new MediatorBaseVariable(new QName("intVar")); intVariable.setType(ItemType.INT); intVariable.setValue(8); list.add(intVariable); MediatorVariable boolVariable = new MediatorBaseVariable(new QName("boolVar")); boolVariable.setType(ItemType.BOOLEAN); boolVariable.setValue(Boolean.TRUE); list.add(boolVariable); MediatorVariable doubleVariable = new MediatorBaseVariable(new QName("doubleVar")); doubleVariable.setType(ItemType.DOUBLE); doubleVariable.setValue(23.33); list.add(doubleVariable); MediatorVariable floatVariable = new MediatorBaseVariable(new QName("floatVar")); floatVariable.setType(ItemType.FLOAT); floatVariable.setValue(new Float(23.33)); list.add(floatVariable); MediatorVariable shortVariable = new MediatorBaseVariable(new QName("shortVar")); shortVariable.setType(ItemType.SHORT); shortVariable.setValue((short) 327); list.add(shortVariable); MediatorVariable byteVariable = new MediatorBaseVariable(new QName("byteVar")); byteVariable.setType(ItemType.BYTE); byteVariable.setValue((byte) 3); list.add(byteVariable); MediatorVariable longVariable = new MediatorBaseVariable(new QName("longVar")); longVariable.setType(ItemType.LONG); longVariable.setValue((long) 334); list.add(longVariable); MediatorVariable stringValue = new MediatorBaseVariable(new QName("stringVar")); stringValue.setType(ItemType.STRING); stringValue.setValue("synapse"); list.add(stringValue); MediatorVariable integerValue = new MediatorBaseVariable(new QName("integerVar")); integerValue.setType(ItemType.INTEGER); integerValue.setValue(5); list.add(integerValue); mediator.addAllVariables(list); assertTrue(mediator.mediate(mc)); assertEquals("10", mc.getEnvelope().getBody().getFirstElement(). getFirstElement().getText().trim()); assertEquals("true", mc.getEnvelope().getBody().getFirstElement(). getFirstElement().getFirstElement().getText()); } public void testQueryWithPayload() throws Exception { MessageContext mc = TestUtils.getTestContext(sampleXml, null); XQueryMediator mediator = new XQueryMediator(); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable variable = new MediatorCustomVariable(new QName("payload")); // variable.setType(ItemType.XQITEMKIND_DOCUMENT); variable.setNodeKind(XdmNodeKind.DOCUMENT); list.add(variable); mediator.addAllVariables(list); mediator.setQuerySource("declare variable $payload as document-node() external;" + "$payload//bookstore/book/title"); assertTrue(mediator.mediate(mc)); assertEquals("Everyday Italian", mc.getEnvelope().getBody().getFirstElement().getText()); } public void testQueryWithPayloadTwo() throws Exception { MessageContext mc = TestUtils.getTestContext(sampleXml2, null); XQueryMediator mediator = new XQueryMediator(); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable variable = new MediatorCustomVariable(new QName("payload")); //variable.setType(ItemType.XQITEMKIND_DOCUMENT); variable.setNodeKind(XdmNodeKind.DOCUMENT); list.add(variable); mediator.addAllVariables(list); mediator.setQuerySource("declare namespace m0=\"http://www.apache-synapse.org/test\"; " + "declare variable $payload as document-node() external;" + "<m:getQuote xmlns:m=\"http://services.samples/xsd\">\n" + "<m:request>" + " <m:symbol>{$payload//m0:CheckPriceRequest/m0:Code/child::text()}" + " </m:symbol><" + "/m:request>\n" + "</m:getQuote> "); assertTrue(mediator.mediate(mc)); assertEquals("IBM", mc.getEnvelope().getBody().getFirstElement(). getFirstElement().getFirstElement().getText()); } public void testQueryWithPayloadThree() throws Exception { try { MessageContext mc = TestUtils.getTestContext(sampleXml3, null); XQueryMediator mediator = new XQueryMediator(); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable variable = new MediatorCustomVariable(new QName("payload")); // variable.setType(ItemType.XQITEMKIND_DOCUMENT); variable.setNodeKind(XdmNodeKind.DOCUMENT); list.add(variable); mediator.addAllVariables(list); mediator.setQuerySource("declare namespace m0=\"http://services.samples/xsd\";" + " declare variable $payload as document-node() external;\n" + "<m:CheckPriceResponse xmlns:m=\"http://www.apache-synapse.org/test\">\n" + "\t<m:Code>{$payload//m0:return/m0:symbol/child::text()}</m:Code>\n" + "\t<m:Price>{$payload//m0:return/m0:last/child::text()}</m:Price>\n" + "</m:CheckPriceResponse>"); assertTrue(mediator.mediate(mc)); }catch (Exception e) { fail(e.getMessage()); } } public void testQueryWithPayloadFour() throws Exception { try { MessageContext mc = TestUtils.getTestContext(sampleXml3, null); XQueryMediator mediator = new XQueryMediator(); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable variable = new MediatorCustomVariable(new QName("payload")); //variable.setType(ItemType.XQITEMKIND_DOCUMENT); variable.setNodeKind(XdmNodeKind.DOCUMENT); list.add(variable); MediatorCustomVariable variableForXml = new MediatorCustomVariable(new QName("commission")); //variableForXml.setType(ItemType.XQITEMKIND_DOCUMENT); variableForXml.setNodeKind(XdmNodeKind.DOCUMENT); variableForXml.setRegKey("file:key"); variableForXml.setValue(SynapseConfigUtils.stringToOM(externalXMl)); list.add(variableForXml); mediator.addAllVariables(list); mediator.setQuerySource(" declare namespace m0=\"http://services.samples/xsd\";\n" + " declare variable $payload as document-node() external;\n" + " declare variable $commission as document-node() external;\n" + " <m0:return xmlns:m0=\"http://services.samples/xsd\">\n" + " \t<m0:symbol>{$payload//m0:return/m0:symbol/child::text()}" + " </m0:symbol>\n" + " \t<m0:last>{$payload//m0:return/m0:last/child::text()+ " + "$commission//commission/vendor[@symbol=$payload//m0:return/m0:symbol/child::text()]}" + "</m0:last>\n" + " </m0:return>"); assertTrue(mediator.mediate(mc)); }catch (Exception e) { fail(e.getMessage()); } } public void testQueryReturnInt() throws Exception { MessageContext mc = TestUtils.getTestContext("<foo/>", null); XQueryMediator mediator = new XQueryMediator(); mediator.setQuerySource("for $n in 1 to 10 return $n*$n"); assertTrue(mediator.mediate(mc)); assertEquals("1", mc.getEnvelope().getBody().getFirstElement().getText()); } public void testQueryReturnBoolean() throws Exception { MessageContext mc = TestUtils.getTestContext("<foo/>", null); XQueryMediator mediator = new XQueryMediator(); mediator.setQuerySource("declare variable $boolVar as xs:boolean external; $boolVar"); List<MediatorVariable> list = new ArrayList<MediatorVariable>(); MediatorVariable boolVariable = new MediatorBaseVariable(new QName("boolVar")); boolVariable.setType(ItemType.BOOLEAN); boolVariable.setValue(Boolean.TRUE); list.add(boolVariable); mediator.addAllVariables(list); assertTrue(mediator.mediate(mc)); assertEquals("true", mc.getEnvelope().getBody().getFirstElement().getText()); } }