/*
* Copyright 2002-2017 the original author or authors.
*
* 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 org.springframework.integration.ws;
import static org.hamcrest.Matchers.instanceOf;
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.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.junit.Test;
import org.w3c.dom.NodeList;
import org.springframework.messaging.MessageHeaders;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.xml.namespace.QNameUtils;
import org.springframework.xml.transform.StringSource;
/**
* @author Gary Russell
* @author Mauro Molinari
* @since 2.1
*
*/
public class DefaultSoapHeaderMapperTests {
@Test
public void testNullSoapHeader() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
SoapMessage soapMessage = mock(SoapMessage.class);
Map<String, Object> headers = mapper.toHeadersFromReply(soapMessage);
assertEquals(0, headers.size());
}
@Test
public void testCustomSoapHeader() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
mapper.setReplyHeaderNames("x:attr", "x:elem");
SoapMessage soapMessage = mock(SoapMessage.class);
SoapHeader soapHeader = mock(SoapHeader.class);
@SuppressWarnings("unchecked")
Iterator<QName> attrIterator = mock(Iterator.class);
QName attribute = new QName("http://x", "attr", "x");
@SuppressWarnings("unchecked")
Iterator<SoapHeaderElement> elementIterator = mock(Iterator.class);
SoapHeaderElement soapHeaderElement = mock(SoapHeaderElement.class);
QName element = new QName("http://x", "elem", "x");
when(soapMessage.getSoapHeader()).thenReturn(soapHeader);
when(soapHeader.getAllAttributes()).thenReturn(attrIterator);
when(attrIterator.hasNext()).thenReturn(true).thenReturn(false);
when(attrIterator.next()).thenReturn(attribute);
when(soapHeader.getAttributeValue(attribute)).thenReturn("attrValue");
when(soapHeader.examineAllHeaderElements()).thenReturn(elementIterator);
when(elementIterator.hasNext()).thenReturn(true).thenReturn(false);
when(elementIterator.next()).thenReturn(soapHeaderElement);
when(soapHeaderElement.getName()).thenReturn(element);
Map<String, Object> headers = mapper.toHeadersFromReply(soapMessage);
assertEquals(2, headers.size());
assertEquals("attrValue", headers.get("x:attr"));
assertSame(soapHeaderElement, headers.get("x:elem"));
}
@Test
public void testRealSoapHeader() throws Exception {
String soap =
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soapenv:Header>"
+ "<auth>"
+ "<username>user</username>"
+ "<password>pass</password>"
+ "</auth>"
+ "<bar>BAR</bar>"
+ "<baz>BAZ</baz>"
+ "<qux>qux</qux>"
+ "</soapenv:Header>"
+ "<soapenv:Body>"
+ "<foo>foo</foo>"
+ "</soapenv:Body>"
+ "</soapenv:Envelope>";
SOAPMessage message = MessageFactory.newInstance()
.createMessage(new MimeHeaders(), new ByteArrayInputStream(soap.getBytes("UTF-8")));
SoapMessage soapMessage = new SaajSoapMessage(message);
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
String authHeader = "auth";
mapper.setRequestHeaderNames(authHeader, "ba*");
Map<String, Object> headers = mapper.toHeadersFromRequest(soapMessage);
assertNotNull(headers.get(authHeader));
assertThat(headers.get(authHeader), instanceOf(SoapHeaderElement.class));
SoapHeaderElement header = (SoapHeaderElement) headers.get(authHeader);
DOMSource source = (DOMSource) header.getSource();
NodeList nodeList = source.getNode().getChildNodes();
assertEquals("username", nodeList.item(0).getNodeName());
assertEquals("user", nodeList.item(0).getFirstChild().getNodeValue());
assertEquals("password", nodeList.item(1).getNodeName());
assertEquals("pass", nodeList.item(1).getFirstChild().getNodeValue());
header = (SoapHeaderElement) headers.get("bar");
assertNotNull(header);
source = (DOMSource) header.getSource();
nodeList = source.getNode().getChildNodes();
assertEquals("BAR", nodeList.item(0).getNodeValue());
header = (SoapHeaderElement) headers.get("baz");
assertNotNull(header);
source = (DOMSource) header.getSource();
nodeList = source.getNode().getChildNodes();
assertEquals("BAZ", nodeList.item(0).getNodeValue());
assertNull(headers.get("qux"));
}
@Test
public void testExtractStandardHeadersNullSoapAction() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
SoapMessage soapMessage = mock(SoapMessage.class);
when(soapMessage.getSoapAction()).thenReturn(null);
assertTrue(mapper.extractStandardHeaders(soapMessage).isEmpty());
}
@Test
public void testExtractStandardHeadersEmptySoapAction() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
SoapMessage soapMessage = mock(SoapMessage.class);
when(soapMessage.getSoapAction()).thenReturn("");
assertTrue(mapper.extractStandardHeaders(soapMessage).isEmpty());
}
@Test
public void testExtractStandardHeadersNonEmptySoapAction() {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
SoapMessage soapMessage = mock(SoapMessage.class);
when(soapMessage.getSoapAction()).thenReturn("foo");
Map<String, Object> standardHeaders = mapper.toHeadersFromRequest(soapMessage);
assertEquals(1, standardHeaders.size());
assertTrue(standardHeaders.containsKey(WebServiceHeaders.SOAP_ACTION));
assertEquals("foo", standardHeaders.get(WebServiceHeaders.SOAP_ACTION));
}
@Test
public void testFromHeadersToRequest() throws SOAPException, TransformerException {
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper();
mapper.setReplyHeaderNames("foo", "auth", "myHeader");
Map<String, Object> headers = new HashMap<>();
headers.put("foo", "bar");
String docString =
"<auth xmlns='http://test.auth.org'>"
+ "<username>user</username>"
+ "<password>pass</password>"
+ "</auth>";
Source source = new StringSource(docString);
headers.put("auth", source);
headers.put("myHeader", new StringSource("<test xmlns='http://test.org'>TEST</test>"));
SaajSoapMessage message = new SaajSoapMessage(MessageFactory.newInstance().createMessage());
mapper.fromHeadersToReply(new MessageHeaders(headers), message);
SoapHeader soapHeader = message.getSoapHeader();
assertEquals("bar", soapHeader.getAttributeValue(QNameUtils.parseQNameString("foo")));
Iterator<SoapHeaderElement> authIterator =
soapHeader.examineHeaderElements(QNameUtils.parseQNameString("{http://test.auth.org}auth"));
assertTrue(authIterator.hasNext());
SoapHeaderElement auth = authIterator.next();
DOMSource authSource = (DOMSource) auth.getSource();
NodeList nodeList = authSource.getNode().getChildNodes();
assertEquals("username", nodeList.item(0).getNodeName());
assertEquals("user", nodeList.item(0).getFirstChild().getNodeValue());
assertEquals("password", nodeList.item(1).getNodeName());
assertEquals("pass", nodeList.item(1).getFirstChild().getNodeValue());
Iterator<SoapHeaderElement> testIterator =
soapHeader.examineHeaderElements(QNameUtils.parseQNameString("{http://test.org}test"));
assertTrue(testIterator.hasNext());
/*StringResult stringResult = new StringResult();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(message.getEnvelope().getSource(), stringResult);
System. out. println(stringResult.toString());*/
}
}