/** * Emulate the Spring WS MessageDispatcherServlet by calling the gateway * with a DOMSource object representing the payload of the original SOAP * 'echoRequest' message. Expect an 'echoResponse' DOMSource object * to be returned in synchronous fashion, which the MessageDispatcherServlet * would in turn wrap in a SOAP envelope and return to the client. */ @Test public void testSendAndReceive() throws Exception { String xml = "<echoRequest xmlns=\"http://www.springframework.org/spring-ws/samples/echo\">hello</echoRequest>"; DomPoxMessageFactory messageFactory = new DomPoxMessageFactory(); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse(new InputSource(new StringReader(xml))); Transformer transformer = TransformerFactory.newInstance().newTransformer(); DomPoxMessage request = new DomPoxMessage(document, transformer, "text/xml"); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); gateway.invoke(messageContext); Object reply = messageContext.getResponse().getPayloadSource(); assertThat(reply, is(instanceOf(DOMSource.class))); DOMSource replySource = (DOMSource) reply; Element element = (Element) replySource.getNode().getFirstChild(); assertThat(element.getTagName(), equalTo("echoResponse")); } }
@Override public Object doExtractData(WebServiceMessage message) throws IOException, TransformerException { if (!SimpleWebServiceOutboundGateway.this.extractPayload) { return message; } else { Source payloadSource = message.getPayloadSource(); if (payloadSource != null && this.result != null) { this.transform(payloadSource, this.result); if (this.result instanceof StringResult) { return this.result.toString(); } else if (this.result instanceof DOMResult) { return ((DOMResult) this.result).getNode(); } else { return this.result; } } return payloadSource; } }
@Override public void doWithMessageInternal(WebServiceMessage message, Object payload) throws IOException, TransformerException { Source source = this.extractSource(payload); transform(source, message.getPayloadResult()); if (message instanceof MimeMessage && payload instanceof MimeMessage) { copyAttachments((MimeMessage) payload, (MimeMessage) message); } }
@Test public void sendString() throws Exception { when(context.getResponse()).thenReturn(response); when(context.getRequest()).thenReturn(request); when(request.getPayloadSource()).thenReturn(stringSource); when(response.getPayloadResult()).thenReturn(stringResult); gateway.invoke(context); assertTrue(output.toString().endsWith(input)); }
template.setMessageFactory(new DomPoxMessageFactory()); Mockito.when(messageSender.createConnection(Mockito.any(URI.class))).thenReturn(wsConnection); Mockito.when(messageSender.supports(Mockito.any(URI.class))).thenReturn(true); SoapHeader soapHeader = ((SoapMessage) wsMessage).getSoapHeader(); assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foo"))); assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foobar"))); assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("abaz"))); assertNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("bar"))); .send(Mockito.any(WebServiceMessage.class)); : responseNonSoapMessage; WebServiceMessage wsMessage = factory .createWebServiceMessage(new ByteArrayInputStream(responseMessage.getBytes())); if (soap) { ((SoapMessage) wsMessage).getSoapHeader().addAttribute(QNameUtils.parseQNameString("bar"), "bar"); ((SoapMessage) wsMessage).getSoapHeader().addAttribute(QNameUtils.parseQNameString("baz"), "baz"); }).when(wsConnection).receive(Mockito.any(WebServiceMessageFactory.class));
@Before public void setup() { gateway.setRequestChannel(requestChannel); gateway.setReplyChannel(replyChannel); gateway.setBeanFactory(mock(BeanFactory.class)); gateway.start(); when(context.getResponse()).thenReturn(response); when(response.getPayloadResult()).thenReturn(payloadResult); when(context.getRequest()).thenReturn(request); }
WebServiceMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance()); MimeMessage webServiceMessage = (MimeMessage) messageFactory.createWebServiceMessage(); transformer.transform(new StringSource(request), webServiceMessage.getPayloadResult()); webServiceMessage.addAttachment("myAttachment", new ByteArrayResource("my_data".getBytes()), "text/plain"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); StringResult stringResult = new StringResult(); transformer.transform(requestMessage.getPayloadSource(), stringResult); Attachment myAttachment = ((MimeMessage) requestMessage).getAttachment("myAttachment"); assertEquals("text/plain", myAttachment.getContentType()); assertEquals("my_data", FileCopyUtils.copyToString(new InputStreamReader(myAttachment.getInputStream())));
public static WebServiceMessageSender createMockMessageSender(final String mockResponseMessage) throws Exception { WebServiceMessageSender messageSender = Mockito.mock(WebServiceMessageSender.class); WebServiceConnection wsConnection = Mockito.mock(WebServiceConnection.class); Mockito.when(messageSender.createConnection(Mockito.any(URI.class))).thenReturn(wsConnection); Mockito.when(messageSender.supports(Mockito.any(URI.class))).thenReturn(true); Mockito.doAnswer(invocation -> { Object[] args = invocation.getArguments(); WebServiceMessageFactory factory = (WebServiceMessageFactory) args[0]; return factory.createWebServiceMessage(new ByteArrayInputStream(mockResponseMessage.getBytes())); }).when(wsConnection).receive(Mockito.any(WebServiceMessageFactory.class)); return messageSender; }
private Source extractSource(Object requestPayload) throws IOException, TransformerException { Source source = null; if (requestPayload instanceof Source) { source = (Source) requestPayload; Object o = SimpleWebServiceOutboundGateway.this.sourceExtractor.extractData(source); Assert.isInstanceOf(Source.class, o); source = (Source) o; } else if (requestPayload instanceof String) { source = new StringSource((String) requestPayload); } else if (requestPayload instanceof Document) { source = new DOMSource((Document) requestPayload); } else if (requestPayload instanceof WebServiceMessage) { source = ((WebServiceMessage) requestPayload).getPayloadSource(); } else { throw new MessagingException("Unsupported payload type '" + requestPayload.getClass() + "'. " + this.getClass().getName() + " only supports 'java.lang.String', '" + Source.class.getName() + "', '" + Document.class.getName() + "' and '" + WebServiceMessage.class.getName() + "'. " + "Consider either using the '" + MarshallingWebServiceOutboundGateway.class.getName() + "' or a Message Transformer."); } return source; }
gateway.setMessageFactory(new DomPoxMessageFactory()); gateway.afterPropertiesSet(); transformer.transform(requestMessage.getPayloadSource(), stringResult);
@Override public WebServiceMessage getResponse() { if (response == null) { response = messageFactory.createWebServiceMessage(); } return response; }
/** * Create a new instance of the {@code WebServiceFaultException} class. * * @param faultMessage the fault message */ public WebServiceFaultException(FaultAwareWebServiceMessage faultMessage) { super(faultMessage.getFaultReason()); this.faultMessage = faultMessage; }
@Override protected void doInvoke(MessageContext messageContext) throws Exception { WebServiceMessage request = messageContext.getRequest(); Assert.notNull(request, "Invalid message context: request was null."); (this.extractPayload) ? request.getPayloadSource() : request); messageContext.setResponse((WebServiceMessage) replyPayload); "The actual type was [" + replyPayload.getClass().getName() + "]"); WebServiceMessage response = messageContext.getResponse(); this.transformerSupportDelegate.transformSourceToResult(responseSource, response.getPayloadResult());
public WebServiceMessage createWebServiceMessage() { WebServiceMessage message = mock(WebServiceMessage.class); Source source = mock(Source.class); when(message.getPayloadSource()).thenReturn(source); return message; }
/** Returns the payload source of the given message. */ @Override protected Source getValidationResponseSource(WebServiceMessage response) { return response.getPayloadSource(); } }
/** * Returns the part of the request message that is to be validated. Default * * @param request the request message * @return the part of the message that is to validated, or {@code null} not to validate anything */ @Override protected Source getValidationRequestSource(WebServiceMessage request) { return request.getPayloadSource(); }
/** * Returns the part of the response message that is to be validated. * * @param response the response message * @return the part of the message that is to validated, or {@code null} not to validate anything */ @Override protected Source getValidationResponseSource(WebServiceMessage response) { return response.getPayloadSource(); } }
/** Returns the payload source of the given message. */ @Override protected Source getValidationRequestSource(WebServiceMessage request) { return request.getPayloadSource(); }
@Test(expected = MessageDeliveryException.class) public void invokePoxSourceTimeout() throws Exception { gateway.setRequestTimeout(10); gateway.setReplyTimeout(10); when(requestChannel.send(isA(Message.class), anyLong())).thenReturn(false); when(request.getPayloadSource()).thenReturn(payloadSource); gateway.invoke(context); }
@Test public void invokePoxSourceWithReply() throws Exception { when(requestChannel.send(isA(Message.class), eq(1000L))).thenAnswer( withReplyTo(replyChannel)); when(request.getPayloadSource()).thenReturn(payloadSource); gateway.start(); gateway.invoke(context); verify(requestChannel).send(messageWithPayload(payloadSource), eq(1000L)); assertTrue(output.toString().endsWith(input)); }