/* | |
* 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.axis2.jaxws.provider; | |
import junit.framework.Test; | |
import junit.framework.TestSuite; | |
import org.apache.axis2.Constants; | |
import org.apache.axis2.jaxws.TestLogger; | |
import org.apache.axis2.jaxws.provider.soapmsg.SoapMessageProvider; | |
import javax.xml.namespace.QName; | |
import javax.xml.soap.AttachmentPart; | |
import javax.xml.soap.DetailEntry; | |
import javax.xml.soap.MessageFactory; | |
import javax.xml.soap.Node; | |
import javax.xml.soap.SOAPBody; | |
import javax.xml.soap.SOAPConstants; | |
import javax.xml.soap.SOAPElement; | |
import javax.xml.soap.SOAPFactory; | |
import javax.xml.soap.SOAPFault; | |
import javax.xml.soap.SOAPMessage; | |
import javax.xml.transform.stream.StreamSource; | |
import javax.xml.ws.Binding; | |
import javax.xml.ws.Dispatch; | |
import javax.xml.ws.Service; | |
import javax.xml.ws.soap.SOAPFaultException; | |
import java.io.ByteArrayInputStream; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.Iterator; | |
import java.util.List; | |
import java.util.Map; | |
/** | |
* Tests Dispatch<SOAPMessage> client and a Provider<SOAPMessage> service. | |
* The client and service interaction tests various xml and attachment scenarios | |
* | |
*/ | |
public class SoapMessageProviderTests extends ProviderTestCase { | |
private String endpointUrl = "http://localhost:6060/axis2/services/SoapMessageProviderService.SoapMessageProviderPort"; | |
private QName serviceName = new QName("http://ws.apache.org/axis2", "SoapMessageProviderService"); | |
private String reqMsgStart = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + | |
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"; | |
; | |
private String reqMsgEnd = "</soap:Body></soap:Envelope>"; | |
private String XML_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
private String EMPTYBODY_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_EMPTYBODY_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
private String CHECKHEADERS_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_CHECKHEADERS_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
private String ATTACHMENT_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_ATTACHMENT_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
private String MTOM_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_MTOM_REQUEST + | |
"</invoke_str>" + | |
SoapMessageProvider.MTOM_REF + | |
"</ns2:invokeOp>"; | |
private String SWAREF_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_SWAREF_REQUEST + | |
"</invoke_str>" + | |
SoapMessageProvider.SWAREF_REF + | |
"</ns2:invokeOp>"; | |
private String XML_FAULT_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_FAULT_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
private String XML_WSE_INVOKE = "<ns2:invokeOp xmlns:ns2=\"http://org.test.soapmessage\"><invoke_str>" + | |
SoapMessageProvider.XML_WSE_REQUEST + | |
"</invoke_str></ns2:invokeOp>"; | |
public static Test suite() { | |
return getTestSetup(new TestSuite(SoapMessageProviderTests.class)); | |
} | |
/** | |
* Sends an SOAPMessage containing only xml data to the web service. | |
* Receives a response containing just xml data. | |
*/ | |
public void testProviderSOAPMessageXMLOnly(){ | |
try{ | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + XML_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Test the transport headers by sending a content description | |
request.setContentDescription(SoapMessageProvider.XML_REQUEST); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
// Check for valid content description | |
assertNotNull(response.getContentDescription()); | |
assertEquals(SoapMessageProvider.XML_RESPONSE, response.getContentDescription()); | |
// Check assertions and get the data element | |
SOAPElement dataElement = assertResponseXML(response, SoapMessageProvider.XML_RESPONSE); | |
assertTrue(countAttachments(response) == 0); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check for valid content description | |
assertNotNull(response.getContentDescription()); | |
assertEquals(SoapMessageProvider.XML_RESPONSE, response.getContentDescription()); | |
// Check assertions and get the data element | |
dataElement = assertResponseXML(response, SoapMessageProvider.XML_RESPONSE); | |
assertTrue(countAttachments(response) == 0); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing only xml data to the web service. | |
* Receives a response containing an empty body | |
*/ | |
public void testProviderSOAPMessageXMLEmptyBody(){ | |
try{ | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + EMPTYBODY_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Test the transport headers by sending a content description | |
request.setContentDescription(SoapMessageProvider.XML_EMPTYBODY_REQUEST); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
// Check assertions | |
assertTrue(response !=null); | |
assertTrue(response.getSOAPBody() != null); | |
assertTrue(response.getSOAPBody().getFirstChild() == null); // There should be nothing in the body | |
assertTrue(countAttachments(response) == 0); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions | |
assertTrue(response !=null); | |
assertTrue(response.getSOAPBody() != null); | |
assertTrue(response.getSOAPBody().getFirstChild() == null); // There should be nothing in the body | |
assertTrue(countAttachments(response) == 0); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing only xml data | |
* Provider will throw a Fault | |
*/ | |
public void testProviderSOAPMessageSOAPFault() throws Exception { | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + XML_FAULT_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Test the transport headers by sending a content description | |
request.setContentDescription(SoapMessageProvider.XML_FAULT_REQUEST); | |
try { | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
assertTrue("Expected failure", false); | |
} catch (SOAPFaultException e) { | |
// Okay | |
SOAPFault fault = e.getFault(); | |
assertTrue(fault != null); | |
assertTrue(fault.getFaultString().equals("sample fault")); | |
QName expectedFaultCode = new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Client"); | |
assertTrue(fault.getFaultCodeAsQName().equals(expectedFaultCode)); | |
assertTrue(fault.getDetail() != null); | |
DetailEntry de = (DetailEntry) fault.getDetail().getDetailEntries().next(); | |
assertTrue(de != null); | |
assertTrue(de.getLocalName().equals("detailEntry")); | |
assertTrue(de.getValue().equals("sample detail")); | |
assertTrue(fault.getFaultActor().equals("sample actor")); | |
} | |
// Try a second time | |
try { | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
assertTrue("Expected failure", false); | |
} catch (SOAPFaultException e) { | |
// Okay | |
SOAPFault fault = e.getFault(); | |
assertTrue(fault != null); | |
assertTrue(fault.getFaultString().equals("sample fault")); | |
QName expectedFaultCode = new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Client"); | |
assertTrue(fault.getFaultCodeAsQName().equals(expectedFaultCode)); | |
assertTrue(fault.getDetail() != null); | |
DetailEntry de = (DetailEntry) fault.getDetail().getDetailEntries().next(); | |
assertTrue(de != null); | |
assertTrue(de.getLocalName().equals("detailEntry")); | |
assertTrue(de.getValue().equals("sample detail")); | |
assertTrue(fault.getFaultActor().equals("sample actor")); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing only xml data | |
* Provider will throw a generic WebServicesException | |
*/ | |
public void testProviderSOAPMessageWebServiceException() throws Exception { | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + XML_WSE_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Test the transport headers by sending a content description | |
request.setContentDescription(SoapMessageProvider.XML_WSE_REQUEST); | |
try { | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
assertTrue("Expected failure", false); | |
} catch (SOAPFaultException e) { | |
// Okay...SOAPFaultException should be thrown | |
SOAPFault fault = e.getFault(); | |
assertTrue(fault != null); | |
assertTrue(fault.getFaultString().equals("A WSE was thrown")); | |
} | |
// Try a second time | |
try { | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
assertTrue("Expected failure", false); | |
} catch (SOAPFaultException e) { | |
// Okay...SOAPFaultException should be thrown | |
SOAPFault fault = e.getFault(); | |
assertTrue(fault != null); | |
assertTrue(fault.getFaultString().equals("A WSE was thrown")); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing xml data and raw attachments to the web service. | |
* Receives a response containing xml data and the same raw attachments. | |
*/ | |
public void testProviderSOAPMessageRawAttachment(){ | |
// Raw Attachments are attachments that are not referenced in the xml with MTOM or SWARef. | |
// Currently there is no support in Axis 2 for these kinds of attachments. | |
// The belief is that most customers will use MTOM. Some legacy customers will use SWARef. | |
// Raw Attachments may be so old that no customers need this behavior. | |
try{ | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + ATTACHMENT_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Add the Attachment | |
AttachmentPart ap = request.createAttachmentPart(SoapMessageProvider.TEXT_XML_ATTACHMENT, "text/xml"); | |
ap.setContentId(SoapMessageProvider.ID); | |
request.addAttachmentPart(ap); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
SOAPElement dataElement = assertResponseXML(response, SoapMessageProvider.XML_ATTACHMENT_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
AttachmentPart attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
StreamSource contentSS = (StreamSource) attachmentPart.getContent(); | |
String content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
dataElement = assertResponseXML(response, SoapMessageProvider.XML_ATTACHMENT_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
contentSS = (StreamSource) attachmentPart.getContent(); | |
content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing xml data and mtom attachment. | |
* Receives a response containing xml data and the mtom attachment. | |
*/ | |
public void testProviderSOAPMessageMTOM(){ | |
try{ | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// MTOM should be automatically detected. There is no need to set it | |
//Binding binding = dispatch.getBinding(); | |
//SOAPBinding soapBinding = (SOAPBinding) binding; | |
//soapBinding.setMTOMEnabled(true); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + MTOM_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Add the Attachment | |
AttachmentPart ap = request.createAttachmentPart(SoapMessageProvider.TEXT_XML_ATTACHMENT, "text/xml"); | |
ap.setContentId(SoapMessageProvider.ID); | |
request.addAttachmentPart(ap); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
SOAPElement dataElement = assertResponseXML(response, SoapMessageProvider.XML_MTOM_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
AttachmentPart attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
StreamSource contentSS = (StreamSource) attachmentPart.getContent(); | |
String content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
dataElement = assertResponseXML(response, SoapMessageProvider.XML_MTOM_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
contentSS = (StreamSource) attachmentPart.getContent(); | |
content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* Sends an SOAPMessage containing xml data and a swaref attachment to the web service. | |
* Receives a response containing xml data and the swaref attachment attachment. | |
*/ | |
public void testProviderSOAPMessageSWARef(){ | |
try{ | |
// Create the dispatch | |
Dispatch<SOAPMessage> dispatch = createDispatch(); | |
// Create the SOAPMessage | |
String msg = reqMsgStart + SWAREF_INVOKE + reqMsgEnd; | |
MessageFactory factory = MessageFactory.newInstance(); | |
SOAPMessage request = factory.createMessage(null, | |
new ByteArrayInputStream(msg.getBytes())); | |
// Add the Attachment | |
AttachmentPart ap = request.createAttachmentPart(SoapMessageProvider.TEXT_XML_ATTACHMENT, "text/xml"); | |
ap.setContentId(SoapMessageProvider.ID); | |
request.addAttachmentPart(ap); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
SOAPMessage response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
SOAPElement dataElement = assertResponseXML(response, SoapMessageProvider.XML_SWAREF_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
AttachmentPart attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
StreamSource contentSS = (StreamSource) attachmentPart.getContent(); | |
String content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
assertEquals(SoapMessageProvider.ID, attachmentPart.getContentId()); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
dataElement = assertResponseXML(response, SoapMessageProvider.XML_SWAREF_RESPONSE); | |
assertTrue(countAttachments(response) == 1); | |
// Get the Attachment | |
attachmentPart = (AttachmentPart) response.getAttachments().next(); | |
// Check the attachment | |
contentSS = (StreamSource) attachmentPart.getContent(); | |
content = SoapMessageProvider.getAsString(contentSS); | |
assertTrue(content != null); | |
assertTrue(content.contains(SoapMessageProvider.TEXT_XML_ATTACHMENT)); | |
assertEquals(SoapMessageProvider.ID, attachmentPart.getContentId()); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response.toString() + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* This is a negative test to insure that we don't allow creation of a dispatch with | |
* type Soap using Payload mode | |
*/ | |
public void testInvalidTypeWithMode(){ | |
try{ | |
Service svc = Service.create(serviceName); | |
svc.addPort(portName, null, endpointUrl); | |
Dispatch<SOAPMessage> dispatch = | |
svc.createDispatch(portName, SOAPMessage.class, Service.Mode.PAYLOAD); | |
fail("Did not catch exception for invalid Dispatch with Payload Mode"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* Sends an String payload containing only xml data to the Provider<SOAPMessage> | |
* The header information is sent using a jaxws.request.soap.header Map | |
* Receives a response containing xml data | |
*/ | |
public void testProviderSOAPMessage_RequestHeaders(){ | |
try{ | |
// Create the dispatch | |
Dispatch<String> dispatch = createStringDispatch(); | |
// Create the String Payload | |
String request = CHECKHEADERS_INVOKE; | |
MessageFactory factory = MessageFactory.newInstance(); | |
// Create the request headers | |
Map<String, Object> requestContext = dispatch.getRequestContext(); | |
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>(); | |
SOAPFactory sf = SOAPFactory.newInstance(); | |
SOAPElement e = sf.createElement(SoapMessageProvider.FOO_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.FOO_HEADER_CONTENT); | |
String fooHeader = e.toString(); | |
TestLogger.logger.debug("Foo Header:" + fooHeader); | |
List<String> list = new ArrayList<String>(); | |
list.add(fooHeader); | |
requestHeaders.put(SoapMessageProvider.FOO_HEADER_QNAME, list); | |
list = new ArrayList<String>(); | |
e = sf.createElement(SoapMessageProvider.BAR_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.BAR_HEADER_CONTENT1); | |
String barHeader = e.toString(); | |
TestLogger.logger.debug("Bar Header:" + barHeader); | |
list.add(barHeader); | |
e = sf.createElement(SoapMessageProvider.BAR_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.BAR_HEADER_CONTENT2); | |
barHeader = e.toString(); | |
TestLogger.logger.debug("Bar Header:" + barHeader); | |
list.add(barHeader); | |
requestHeaders.put(SoapMessageProvider.BAR_HEADER_QNAME, list); | |
requestContext.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
String response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
assertTrue(response.contains(SoapMessageProvider.XML_CHECKHEADERS_RESPONSE)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
assertTrue(response.contains(SoapMessageProvider.XML_CHECKHEADERS_RESPONSE)); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* Sends an String payload containing only xml data to the Provider<SOAPMessage> | |
* The header information is sent using a jaxws.request.soap.header Map | |
* Receives a response containing xml data | |
*/ | |
public void testProviderSOAPMessage_RequestAndResponseHeaders(){ | |
try{ | |
// Create the dispatch | |
Dispatch<String> dispatch = createStringDispatch(); | |
// Create the String Payload | |
String request = CHECKHEADERS_INVOKE; | |
MessageFactory factory = MessageFactory.newInstance(); | |
// Create the request headers | |
Map<String, Object> requestContext = dispatch.getRequestContext(); | |
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>(); | |
SOAPFactory sf = SOAPFactory.newInstance(); | |
SOAPElement e = sf.createElement(SoapMessageProvider.FOO_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.FOO_HEADER_CONTENT); | |
String fooHeader = e.toString(); | |
TestLogger.logger.debug("Foo Header:" + fooHeader); | |
List<String> list = new ArrayList<String>(); | |
list.add(fooHeader); | |
requestHeaders.put(SoapMessageProvider.FOO_HEADER_QNAME, list); | |
list = new ArrayList<String>(); | |
e = sf.createElement(SoapMessageProvider.BAR_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.BAR_HEADER_CONTENT1); | |
String barHeader = e.toString(); | |
TestLogger.logger.debug("Bar Header:" + barHeader); | |
list.add(barHeader); | |
e = sf.createElement(SoapMessageProvider.BAR_HEADER_QNAME); | |
e.addTextNode(SoapMessageProvider.BAR_HEADER_CONTENT2); | |
barHeader = e.toString(); | |
TestLogger.logger.debug("Bar Header:" + barHeader); | |
list.add(barHeader); | |
requestHeaders.put(SoapMessageProvider.BAR_HEADER_QNAME, list); | |
requestContext.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders); | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
String response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
assertTrue(response.contains(SoapMessageProvider.XML_CHECKHEADERS_RESPONSE)); | |
// Check outbound headers | |
Map<String, Object> responseContext = dispatch.getResponseContext(); | |
assertTrue(responseContext != null); | |
Map<QName, List<String>> responseHeaders = (Map<QName, List<String>>) | |
responseContext.get(Constants.JAXWS_INBOUND_SOAP_HEADERS); | |
assertTrue(responseHeaders != null); | |
assertTrue(responseHeaders.size() >= 2); | |
List<String> batHeaders = responseHeaders.get(SoapMessageProvider.BAT_HEADER_QNAME); | |
assertTrue(batHeaders != null && batHeaders.size() == 1); | |
assertTrue(batHeaders.get(0).contains(SoapMessageProvider.BAT_HEADER_CONTENT)); | |
List<String> barHeaders =responseHeaders.get(SoapMessageProvider.BAR_HEADER_QNAME); | |
assertTrue(barHeaders != null && barHeaders.size() == 2); | |
assertTrue(barHeaders.get(0).contains(SoapMessageProvider.BAR_HEADER_CONTENT1)); | |
assertTrue(barHeaders.get(1).contains(SoapMessageProvider.BAR_HEADER_CONTENT2)); | |
// There should be no foo header in the response | |
List<String> fooHeaders = responseHeaders.get(SoapMessageProvider.FOO_HEADER_QNAME); | |
assertTrue(fooHeaders == null); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response + "]"); | |
// Try a second time | |
// Dispatch | |
TestLogger.logger.debug(">> Invoking SOAPMessageProviderDispatch"); | |
response = dispatch.invoke(request); | |
// Check assertions and get the data element | |
assertTrue(response.contains(SoapMessageProvider.XML_CHECKHEADERS_RESPONSE)); | |
// Check outbound headers | |
responseContext = dispatch.getResponseContext(); | |
assertTrue(responseContext != null); | |
responseHeaders = (Map<QName, List<String>>) | |
responseContext.get(Constants.JAXWS_INBOUND_SOAP_HEADERS); | |
assertTrue(responseHeaders != null); | |
assertTrue(responseHeaders.size() >= 2); | |
batHeaders = responseHeaders.get(SoapMessageProvider.BAT_HEADER_QNAME); | |
assertTrue(batHeaders != null && batHeaders.size() == 1); | |
assertTrue(batHeaders.get(0).contains(SoapMessageProvider.BAT_HEADER_CONTENT)); | |
barHeaders =responseHeaders.get(SoapMessageProvider.BAR_HEADER_QNAME); | |
assertTrue(barHeaders != null && barHeaders.size() == 2); | |
assertTrue(barHeaders.get(0).contains(SoapMessageProvider.BAR_HEADER_CONTENT1)); | |
assertTrue(barHeaders.get(1).contains(SoapMessageProvider.BAR_HEADER_CONTENT2)); | |
// There should be no foo header in the response | |
fooHeaders = responseHeaders.get(SoapMessageProvider.FOO_HEADER_QNAME); | |
assertTrue(fooHeaders == null); | |
// Print out the response | |
TestLogger.logger.debug(">> Response [" + response + "]"); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
fail("Caught exception " + e); | |
} | |
} | |
/** | |
* @return | |
* @throws Exception | |
*/ | |
private Dispatch<SOAPMessage> createDispatch() throws Exception { | |
Service svc = Service.create(serviceName); | |
svc.addPort(portName,null, endpointUrl); | |
Dispatch<SOAPMessage> dispatch = | |
svc.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); | |
return dispatch; | |
} | |
/** | |
* @return | |
* @throws Exception | |
*/ | |
private Dispatch<String> createStringDispatch() throws Exception { | |
Service svc = Service.create(serviceName); | |
svc.addPort(portName,null, endpointUrl); | |
Dispatch<String> dispatch = | |
svc.createDispatch(portName, String.class, Service.Mode.PAYLOAD); | |
return dispatch; | |
} | |
/** | |
* Common assertion checking of the response | |
* @param msg | |
* @param expectedText | |
* @return SOAPElement representing the data element | |
*/ | |
private SOAPElement assertResponseXML(SOAPMessage msg, String expectedText) throws Exception { | |
assertTrue(msg != null); | |
SOAPBody body = msg.getSOAPBody(); | |
assertTrue(body != null); | |
Node invokeElement = (Node) body.getFirstChild(); | |
assertTrue(invokeElement instanceof SOAPElement); | |
assertEquals(SoapMessageProvider.RESPONSE_NAME, invokeElement.getLocalName()); | |
Node dataElement = (Node) invokeElement.getFirstChild(); | |
assertTrue(dataElement instanceof SOAPElement); | |
assertEquals(SoapMessageProvider.RESPONSE_DATA_NAME, dataElement.getLocalName()); | |
// TODO AXIS2 SAAJ should (but does not) support the getTextContent(); | |
// String text = dataElement.getTextContent(); | |
String text = dataElement.getValue(); | |
assertEquals("Found ("+ text + ") but expected (" + expectedText + ")", expectedText, text); | |
return (SOAPElement) dataElement; | |
} | |
/** | |
* Count Attachments | |
* @param msg | |
* @return | |
*/ | |
private int countAttachments(SOAPMessage msg) { | |
Iterator it = msg.getAttachments(); | |
int count = 0; | |
assertTrue(it != null); | |
while (it.hasNext()) { | |
it.next(); | |
count++; | |
} | |
return count; | |
} | |
} |