/**
* 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.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.apache.camel.converter.IOConverter;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.DefaultHeaderFilterStrategy;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.util.IOHelper;
import org.apache.cxf.attachment.AttachmentImpl;
import org.apache.cxf.binding.Binding;
import org.apache.cxf.binding.soap.SoapBindingConstants;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.Assert;
import org.junit.Test;
/**
*
*/
public class DefaultCxfBindingTest extends Assert {
private static final String SOAP_MESSAGE_1 = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ " xmlns=\"http://www.mycompany.com/test/\" xmlns:ns1=\"http://www.mycompany.com/test/1/\">"
+ " <soap:Body> <request> <ns1:identifier>TEST</ns1:identifier> </request>"
+ " </soap:Body> </soap:Envelope>";
private static final String SOAP_MESSAGE_2 = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ " xmlns=\"http://www.mycompany.com/test/\" xmlns:ns1=\"http://www.mycompany.com/test/1/\">"
+ " <soap:Body> <ns1:identifier xmlns:ns1=\"http://www.mycompany.com/test/\" xmlns=\"http://www.mycompany.com/test/1/\">TEST</ns1:identifier>"
+ " </soap:Body> </soap:Envelope>";
private DefaultCamelContext context = new DefaultCamelContext();
@Test
public void testSetGetHeaderFilterStrategy() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
HeaderFilterStrategy hfs = new DefaultHeaderFilterStrategy();
cxfBinding.setHeaderFilterStrategy(hfs);
assertSame("The header filter strategy is set", hfs, cxfBinding.getHeaderFilterStrategy());
}
private Document getDocument(String soapMessage) throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(IOConverter.toInputStream(soapMessage, null));
document.getDocumentElement().normalize();
return document;
}
@Test
public void testPayloadBodyNamespace() throws Exception {
MessageImpl message = new MessageImpl();
Map<String, String> nsMap = new HashMap<String, String>();
Document document = getDocument(SOAP_MESSAGE_1);
message.setContent(Node.class, document);
DefaultCxfBinding.getPayloadBodyElements(message, nsMap);
assertEquals(2, nsMap.size());
assertEquals("http://www.mycompany.com/test/", nsMap.get("xmlns"));
Element element = document.createElement("tag");
DefaultCxfBinding.addNamespace(element, nsMap);
assertEquals("http://www.mycompany.com/test/", element.getAttribute("xmlns"));
assertEquals("http://www.mycompany.com/test/1/", element.getAttribute("xmlns:ns1"));
}
@Test
public void testOverridePayloadBodyNamespace() throws Exception {
MessageImpl message = new MessageImpl();
Map<String, String> nsMap = new HashMap<String, String>();
Document document = getDocument(SOAP_MESSAGE_2);
message.setContent(Node.class, document);
DefaultCxfBinding.getPayloadBodyElements(message, nsMap);
assertEquals(2, nsMap.size());
assertEquals("http://www.mycompany.com/test/", nsMap.get("xmlns"));
Element element = (Element)document.getElementsByTagName("ns1:identifier").item(0);
assertNotNull("We should get the element", element);
DefaultCxfBinding.addNamespace(element, nsMap);
assertEquals("http://www.mycompany.com/test/1/", element.getAttribute("xmlns"));
assertEquals("http://www.mycompany.com/test/", element.getAttribute("xmlns:ns1"));
}
@Test
public void testSetCharsetWithContentType() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "text/xml;charset=ISO-8859-1");
cxfBinding.setCharsetWithContentType(exchange);
String charset = IOHelper.getCharsetName(exchange);
assertEquals("Get a wrong charset", "ISO-8859-1", charset);
exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "text/xml");
cxfBinding.setCharsetWithContentType(exchange);
charset = IOHelper.getCharsetName(exchange);
assertEquals("Get a worng charset name", "UTF-8", charset);
}
@Test
public void testPopulateCxfRequestFromExchange() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
Map<String, Object> requestContext = new HashMap<String, Object>();
exchange.getIn().setHeader("soapAction", "urn:hello:world");
exchange.getIn().setHeader("MyFruitHeader", "peach");
exchange.getIn().setHeader("MyBrewHeader", Arrays.asList("cappuccino", "espresso"));
exchange.getIn().addAttachment("att-1", new DataHandler(new FileDataSource("pom.xml")));
exchange.getIn().getAttachmentObject("att-1").setHeader("attachment-header", "value 1");
cxfBinding.populateCxfRequestFromExchange(cxfExchange, exchange, requestContext);
// check the protocol headers
Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)requestContext.get(Message.PROTOCOL_HEADERS));
assertNotNull(headers);
assertEquals(3, headers.size());
verifyHeader(headers, "soapaction", "urn:hello:world");
verifyHeader(headers, "SoapAction", "urn:hello:world");
verifyHeader(headers, "SOAPAction", "urn:hello:world");
verifyHeader(headers, "myfruitheader", "peach");
verifyHeader(headers, "myFruitHeader", "peach");
verifyHeader(headers, "MYFRUITHEADER", "peach");
verifyHeader(headers, "MyBrewHeader", Arrays.asList("cappuccino", "espresso"));
Set<Attachment> attachments
= CastUtils.cast((Set<?>)requestContext.get(CxfConstants.CAMEL_CXF_ATTACHMENTS));
assertNotNull(attachments);
assertNotNull(attachments.size() == 1);
Attachment att = attachments.iterator().next();
assertEquals("att-1", att.getId());
assertEquals("value 1", att.getHeader("attachment-header"));
}
@Test
public void testPopulateCxfSoapHeaderRequestFromExchange() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
Map<String, Object> requestContext = new HashMap<>();
String expectedSoapActionHeader = "urn:hello:world";
exchange.getIn().setHeader("soapAction", expectedSoapActionHeader);
cxfBinding.populateCxfRequestFromExchange(cxfExchange, exchange, requestContext);
String actualSoapActionHeader = (String)requestContext.get(SoapBindingConstants.SOAP_ACTION);
assertEquals(expectedSoapActionHeader, actualSoapActionHeader);
}
@Test
public void testPopupalteExchangeFromCxfResponse() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
Map<String, Object> responseContext = new HashMap<String, Object>();
responseContext.put(org.apache.cxf.message.Message.RESPONSE_CODE, Integer.valueOf(200));
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
headers.put("content-type", Arrays.asList("text/xml;charset=UTF-8"));
headers.put("Content-Length", Arrays.asList("241"));
responseContext.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, headers);
org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl();
cxfExchange.setInMessage(cxfMessage);
Set<Attachment> attachments = new HashSet<Attachment>();
AttachmentImpl attachment = new AttachmentImpl("att-1", new DataHandler(new FileDataSource("pom.xml")));
attachment.setHeader("additional-header", "value 1");
attachments.add(attachment);
cxfMessage.setAttachments(attachments);
cxfBinding.populateExchangeFromCxfResponse(exchange, cxfExchange, responseContext);
Map<String, Object> camelHeaders = exchange.getOut().getHeaders();
assertNotNull(camelHeaders);
assertEquals(responseContext, camelHeaders.get(Client.RESPONSE_CONTEXT));
Map<String, org.apache.camel.Attachment> camelAttachments = exchange.getOut().getAttachmentObjects();
assertNotNull(camelAttachments);
assertNotNull(camelAttachments.get("att-1"));
assertEquals("value 1", camelAttachments.get("att-1").getHeader("additional-header"));
}
@Test
public void testPopupalteExchangeFromCxfResponseOfNullBody() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
Map<String, Object> responseContext = new HashMap<String, Object>();
responseContext.put(org.apache.cxf.message.Message.RESPONSE_CODE, Integer.valueOf(200));
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
responseContext.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, headers);
org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl();
cxfExchange.setInMessage(cxfMessage);
cxfBinding.populateExchangeFromCxfResponse(exchange, cxfExchange, responseContext);
CxfPayload<?> cxfPayload = exchange.getOut().getBody(CxfPayload.class);
assertNotNull(cxfPayload);
List<?> body = cxfPayload.getBody();
assertNotNull(body);
assertEquals(0, body.size());
}
@Test
public void testPopupalteCxfResponseFromExchange() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context, ExchangePattern.InOut);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
exchange.getOut().setHeader("soapAction", "urn:hello:world");
exchange.getOut().setHeader("MyFruitHeader", "peach");
exchange.getOut().addAttachment("att-1", new DataHandler(new FileDataSource("pom.xml")));
exchange.getOut().getAttachmentObject("att-1").setHeader("attachment-header", "value 1");
IMocksControl control = EasyMock.createNiceControl();
Endpoint endpoint = control.createMock(Endpoint.class);
Binding binding = control.createMock(Binding.class);
EasyMock.expect(endpoint.getBinding()).andReturn(binding);
org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl();
EasyMock.expect(binding.createMessage()).andReturn(cxfMessage);
cxfExchange.put(Endpoint.class, endpoint);
control.replay();
cxfBinding.populateCxfResponseFromExchange(exchange, cxfExchange);
cxfMessage = cxfExchange.getOutMessage();
assertNotNull(cxfMessage);
Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)cxfMessage.get(Message.PROTOCOL_HEADERS));
assertNotNull(headers);
assertTrue(headers.size() == 2);
verifyHeader(headers, "soapaction", "urn:hello:world");
verifyHeader(headers, "SoapAction", "urn:hello:world");
verifyHeader(headers, "SOAPAction", "urn:hello:world");
verifyHeader(headers, "myfruitheader", "peach");
verifyHeader(headers, "myFruitHeader", "peach");
verifyHeader(headers, "MYFRUITHEADER", "peach");
Collection<Attachment> attachments = cxfMessage.getAttachments();
assertNotNull(attachments);
assertNotNull(attachments.size() == 1);
Attachment att = attachments.iterator().next();
assertEquals("att-1", att.getId());
assertEquals("value 1", att.getHeader("attachment-header"));
}
@Test
public void testPopupalteExchangeFromCxfRequest() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl();
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
headers.put("content-type", Arrays.asList("text/xml;charset=UTF-8"));
headers.put("Content-Length", Arrays.asList("241"));
headers.put("soapAction", Arrays.asList("urn:hello:world"));
headers.put("myfruitheader", Arrays.asList("peach"));
headers.put("mybrewheader", Arrays.asList("cappuccino", "espresso"));
cxfMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, headers);
Set<Attachment> attachments = new HashSet<Attachment>();
AttachmentImpl attachment = new AttachmentImpl("att-1", new DataHandler(new FileDataSource("pom.xml")));
attachment.setHeader("attachment-header", "value 1");
attachments.add(attachment);
cxfMessage.setAttachments(attachments);
cxfExchange.setInMessage(cxfMessage);
cxfBinding.populateExchangeFromCxfRequest(cxfExchange, exchange);
Map<String, Object> camelHeaders = exchange.getIn().getHeaders();
assertNotNull(camelHeaders);
assertEquals("urn:hello:world", camelHeaders.get("soapaction"));
assertEquals("urn:hello:world", camelHeaders.get("SoapAction"));
assertEquals("text/xml;charset=UTF-8", camelHeaders.get("content-type"));
assertEquals("241", camelHeaders.get("content-length"));
assertEquals("peach", camelHeaders.get("MyFruitHeader"));
assertEquals(Arrays.asList("cappuccino", "espresso"), camelHeaders.get("MyBrewHeader"));
Map<String, org.apache.camel.Attachment> camelAttachments = exchange.getIn().getAttachmentObjects();
assertNotNull(camelAttachments);
assertNotNull(camelAttachments.get("att-1"));
assertEquals("value 1", camelAttachments.get("att-1").getHeader("attachment-header"));
}
@Test
public void testPopupalteExchangeFromCxfRequestWithHeaderMerged() {
DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());
Exchange exchange = new DefaultExchange(context);
exchange.setProperty(CxfConstants.CAMEL_CXF_PROTOCOL_HEADERS_MERGED, Boolean.TRUE);
org.apache.cxf.message.Exchange cxfExchange = new org.apache.cxf.message.ExchangeImpl();
exchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.PAYLOAD);
org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl();
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
headers.put("myfruitheader", Arrays.asList("peach"));
headers.put("mybrewheader", Arrays.asList("cappuccino", "espresso"));
cxfMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, headers);
cxfExchange.setInMessage(cxfMessage);
cxfBinding.populateExchangeFromCxfRequest(cxfExchange, exchange);
Map<String, Object> camelHeaders = exchange.getIn().getHeaders();
assertNotNull(camelHeaders);
assertEquals("peach", camelHeaders.get("MyFruitHeader"));
assertEquals("cappuccino, espresso", camelHeaders.get("MyBrewHeader"));
}
private void verifyHeader(Map<String, List<String>> headers, String name, List<String> value) {
List<String> values = headers.get(name);
assertTrue("The entry must be available", values != null && values.size() == ((List<?>)value).size());
assertEquals("The value must match", value, values);
}
private void verifyHeader(Map<String, List<String>> headers, String name, String value) {
List<String> values = headers.get(name);
assertTrue("The entry must be available", values != null && values.size() == 1);
assertEquals("The value must match", values.get(0), value);
}
}