| /** |
| * 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.camel.component.cxf; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.xml.transform.Source; |
| import javax.xml.transform.dom.DOMSource; |
| |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Text; |
| |
| import org.apache.camel.Exchange; |
| import org.apache.camel.Processor; |
| import org.apache.camel.builder.RouteBuilder; |
| import org.apache.camel.builder.xml.XPathBuilder; |
| import org.apache.camel.converter.jaxp.XmlConverter; |
| import org.apache.camel.test.junit4.CamelTestSupport; |
| import org.apache.commons.lang.StringUtils; |
| import org.apache.cxf.BusFactory; |
| import org.apache.cxf.binding.soap.SoapHeader; |
| import org.apache.cxf.frontend.ClientFactoryBean; |
| import org.apache.cxf.frontend.ClientProxyFactoryBean; |
| import org.junit.Test; |
| |
| |
| |
| public class CxfConsumerPayloadXPathClientServerTest extends CamelTestSupport { |
| private static final String ECHO_RESPONSE = "<ns1:echoResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">" |
| + "<return xmlns=\"http://cxf.component.camel.apache.org/\">echo Hello World!</return>" |
| + "</ns1:echoResponse>"; |
| |
| |
| protected final String simpleEndpointAddress = "http://localhost:" |
| + CXFTestSupport.getPort1() + "/" + getClass().getSimpleName() + "/test"; |
| protected final String simpleEndpointURI = "cxf://" + simpleEndpointAddress |
| + "?serviceClass=org.apache.camel.component.cxf.HelloService"; |
| |
| private String testMessage; |
| private String receivedMessageCxfPayloadApplyingXPath; |
| private String receivedMessageByDom; |
| private String receivedMessageStringApplyingXPath; |
| |
| @Override |
| protected RouteBuilder createRouteBuilder() { |
| return new RouteBuilder() { |
| @Override |
| public void configure() { |
| from(simpleEndpointURI + "&dataFormat=PAYLOAD").to("log:info").process(new Processor() { |
| @SuppressWarnings("unchecked") |
| @Override |
| public void process(final Exchange exchange) throws Exception { |
| Object request = exchange.getIn().getBody(); |
| assertIsInstanceOf(CxfPayload.class, request); |
| |
| //attempt 1) applying XPath to exchange.getIn().getBody() |
| receivedMessageCxfPayloadApplyingXPath = XPathBuilder.xpath("//*[name()='arg0']/text()").evaluate(context, request, String.class); |
| |
| //attempt 2) in stead of XPATH, browse the DOM-tree |
| CxfPayload<SoapHeader> payload = (CxfPayload<SoapHeader>) request; |
| Element el = payload.getBody().get(0); |
| Element el2 = (Element) el.getFirstChild(); |
| Text textnode = (Text) el2.getFirstChild(); |
| receivedMessageByDom = textnode.getNodeValue(); |
| |
| textnode = (Text) textnode.getNextSibling(); |
| while (textnode != null) { |
| //the textnode appears to have siblings! |
| receivedMessageByDom = receivedMessageByDom + textnode.getNodeValue(); |
| textnode = (Text) textnode.getNextSibling(); |
| } |
| |
| //attempt 3) apply XPATH after converting CxfPayload to String |
| request = exchange.getIn().getBody(String.class); |
| assertIsInstanceOf(String.class, request); |
| receivedMessageStringApplyingXPath = XPathBuilder.xpath("//*[name()='arg0']/text()").evaluate(context, request, String.class); |
| |
| //build some dummy response |
| XmlConverter converter = new XmlConverter(); |
| Document outDocument = converter.toDOMDocument(ECHO_RESPONSE, exchange); |
| List<Source> outElements = new ArrayList<Source>(); |
| outElements.add(new DOMSource(outDocument.getDocumentElement())); |
| // set the payload header with null |
| CxfPayload<SoapHeader> responsePayload = new CxfPayload<SoapHeader>(null, outElements, null); |
| exchange.getOut().setBody(responsePayload); |
| } |
| }); |
| } |
| }; |
| } |
| |
| private void buildTestMessage(int size) { |
| testMessage = StringUtils.repeat("x", size); |
| } |
| |
| @Test |
| public void testMessageWithIncreasingSize() throws Exception { |
| |
| execTest(1); |
| execTest(10); |
| execTest(100); |
| execTest(1000); |
| execTest(10000); |
| execTest(100000); |
| |
| } |
| |
| private void execTest(int size) throws Exception { |
| buildTestMessage(size); |
| |
| ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean(); |
| ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean(); |
| clientBean.setAddress(simpleEndpointAddress); |
| clientBean.setServiceClass(HelloService.class); |
| clientBean.setBus(BusFactory.getDefaultBus()); |
| |
| HelloService client = (HelloService) proxyFactory.create(); |
| |
| String result = client.echo(testMessage); |
| assertEquals("We should get the echo string result from router", "echo Hello World!", result); |
| |
| //check received requests |
| assertEquals("Lengths of testMessage and receiveMessage should be equal (conversion body to String),", testMessage.length(), receivedMessageStringApplyingXPath.length()); |
| assertEquals("Lengths of receivedMessageByDom and receivedMessageCxfPayloadApplyingXPath should be equal", receivedMessageCxfPayloadApplyingXPath.length(), receivedMessageByDom.length()); |
| assertEquals("Lengths of testMessage and receiveMessage should be equal (body is CxfPayload),", testMessage.length(), receivedMessageCxfPayloadApplyingXPath.length()); |
| } |
| } |