/** * 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")); } }
/** * Creates {@link MessageContext}. * @param message * @return */ protected DefaultMessageContext createMessageContext(WebServiceMessage message) { return new DefaultMessageContext(message, messageFactory); }
/** * Creates {@link MessageContext}. Can be overriden. * @param message * @return */ protected DefaultMessageContext createMessageContext(WebServiceMessage message) { return new DefaultMessageContext(message, messageFactory ); }
@Test public void testMessageHistoryWithMarshallingGateway() throws Exception { MessageContext context = new DefaultMessageContext(new StubMessageFactory()); Unmarshaller unmarshaller = mock(Unmarshaller.class); when(unmarshaller.unmarshal(Mockito.any())).thenReturn("hello"); marshallingGateway.setUnmarshaller(unmarshaller); marshallingGateway.invoke(context); Message<?> message = requestsMarshalling.receive(100); MessageHistory history = MessageHistory.read(message); assertNotNull(history); Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "marshalling", 0); assertNotNull(componentHistoryRecord); assertEquals("ws:inbound-gateway", componentHistoryRecord.get("type")); }
@Test public void testMessageHistoryWithSimpleGateway() throws Exception { MessageContext context = new DefaultMessageContext(new StubMessageFactory()); payloadExtractingGateway.invoke(context); Message<?> message = requestsSimple.receive(100); MessageHistory history = MessageHistory.read(message); assertNotNull(history); Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "extractsPayload", 0); assertNotNull(componentHistoryRecord); assertEquals("ws:inbound-gateway", componentHistoryRecord.get("type")); }
/** * Creates validator based on the response. * @param response * @return */ public static ResponseActions validate(Object response) { DefaultMessageContext messageContext = new DefaultMessageContext(messageFactory); messageContext.setResponse(serialize(response)); return validate(messageContext); } /**
@SuppressWarnings("unchecked") public <T> T deserialize(WebServiceMessage message, Class<T> targetClass) throws Exception { Assert.notNull(message, "message can not be null"); Assert.notNull(targetClass, "targetClass can not be null"); MethodParameter parameter = new SmockMethodParameter(targetClass,0); MessageContext messageContext = new DefaultMessageContext(message, messageFactory); for (MethodArgumentResolver resolver: adapter.getMethodArgumentResolvers()) { if (resolver.supportsParameter(parameter)){ Object result = resolver.resolveArgument(messageContext, parameter); if (result != null) { return (T) result; } } } return null; }
/** * Sends a request message by using the given {@link RequestCreator}. Typically called by using the default request * creators provided by {@link RequestCreators}. * * @param requestCreator the request creator * @return the response actions * @see RequestCreators */ public ResponseActions sendRequest(RequestCreator requestCreator) { Assert.notNull(requestCreator, "'requestCreator' must not be null"); try { WebServiceMessage request = requestCreator.createRequest(messageFactory); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); messageReceiver.receive(messageContext); return new MockWebServiceClientResponseActions(messageContext); } catch (Exception ex) { logger.error("Could not send request", ex); fail(ex.getMessage()); return null; } }
/** * Sends a request message by using the given {@link RequestCreator}. Typically called by using the default request * creators provided by {@link RequestCreators}. * * @param requestCreator the request creator * @return the response actions * @see RequestCreators */ public ResponseActions sendRequest(RequestCreator requestCreator) { Assert.notNull(requestCreator, "'requestCreator' must not be null"); try { WebServiceMessage request = requestCreator.createRequest(messageFactory); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); messageReceiver.receive(messageContext); return new MockWebServiceClientResponseActions(messageContext); } catch (Exception ex) { logger.error("Could not send request", ex); fail(ex.getMessage()); return null; } }
/** * Sends a request message by using the given {@link RequestCreator}. Typically called by using the default request * creators provided by {@link RequestCreators}. * * @param requestCreator the request creator * @return the response actions * @see RequestCreators */ public ResponseActions sendRequest(RequestCreator requestCreator) { Assert.notNull(requestCreator, "'requestCreator' must not be null"); try { WebServiceMessage request = requestCreator.createRequest(messageFactory); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); messageReceiver.receive(messageContext); return new MockWebServiceClientResponseActions(messageContext); } catch (Exception ex) { logger.error("Could not send request", ex); fail(ex.getMessage()); return null; } }
/** * Creates validator based on the response and request. Use this method if your {@link ResponseMatcher}s need to read data from request. * @param response * @param request * @return */ public static ResponseActions validate(Object response, Object request) { DefaultMessageContext messageContext = new DefaultMessageContext(serialize(request), messageFactory); messageContext.setResponse(serialize(response)); return validate(messageContext); }
public ResponseActions sendRequestTo(String path, RequestCreator requestCreator) { try { WebServiceMessage requestMessage = requestCreator.createRequest(messageFactory); final MockHttpServletRequest request = createRequest(path, requestMessage); MessageContext messageContext = new DefaultMessageContext(requestMessage, messageFactory); interceptingTemplate.interceptRequest(messageContext, new WebServiceMessageReceiver() { public void receive(MessageContext messageContext) throws Exception { MockHttpServletResponse response = new ExtendedMockHttpServletResponse(); servlet.service(request, response); if (LOG.isDebugEnabled()) { LOG.debug("Received response:"+response.getContentAsString()); } messageContext.setResponse(messageFactory.createWebServiceMessage(new ByteArrayInputStream(response.getContentAsByteArray()))); } }); return new MockWebServiceClientResponseActions(messageContext); } catch (Exception e) { throw new IllegalStateException("Error when sending request",e); } }
public WebServiceMessage serialize(Object data) throws Exception { Assert.notNull(data, "data can not be null"); MethodParameter parameter = new SmockMethodParameter(getTargetClass(data),-1); MessageContext messageContext = new DefaultMessageContext(messageFactory); for (MethodReturnValueHandler methodReturnValueHandler : adapter.getMethodReturnValueHandlers()) { if (methodReturnValueHandler.supportsReturnType(parameter)) { methodReturnValueHandler.handleReturnValue(messageContext, parameter, data); return messageContext.getResponse(); } } return null; }
/** * Validates request written to outputStream and serializes response to this stream. * Applies interceptors on both request and response. * @return * @throws IOException */ public InputStream getInputStream() throws IOException { final WebServiceMessage request = crateRequest(); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); InterceptingTemplate interceptingTemplate = new InterceptingTemplate(EndpointInterceptorClientAdapter.wrapEndpointInterceptors(interceptors)); try { interceptingTemplate.interceptRequest(messageContext, new WebServiceMessageReceiver() { public void receive(MessageContext context) throws Exception { validate(request); context.setResponse(responseCreator.createResponse(uri, request, messageFactory)); } }); } catch (Exception e) { throw new IOException("Error when processing request.",e); } return new ByteArrayInputStream(serialize(getEnvelopeSource(messageContext.getResponse())).getBytes(UTF8)); }
/** * Calls all interceptors and {@link RequestProcessor}s. Returns first generated response or first thrown exception. */ public WebServiceMessage receive(WebServiceMessageFactory messageFactory) throws IOException { DefaultMessageContext messageContext = new DefaultMessageContext(request, messageFactory); boolean callRequestProcessors = handleRequest(messageContext); if (callRequestProcessors) { WebServiceMessage response = generateResponse(messageFactory); messageContext.setResponse(response); } handleResponse(messageContext); return messageContext.getResponse(); }
@Override public <T> T sendAndReceive(String uriString, WebServiceMessageCallback requestCallback, WebServiceMessageExtractor<T> responseExtractor) { Assert.notNull(responseExtractor, "'responseExtractor' must not be null"); Assert.hasLength(uriString, "'uri' must not be empty"); TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); WebServiceConnection connection = null; try { connection = createConnection(URI.create(uriString)); TransportContextHolder.setTransportContext(new DefaultTransportContext(connection)); MessageContext messageContext = new DefaultMessageContext(getMessageFactory()); return doSendAndReceive(messageContext, connection, requestCallback, responseExtractor); } catch (TransportException ex) { throw new WebServiceTransportException("Could not use transport: " + ex.getMessage(), ex); } catch (IOException ex) { throw new WebServiceIOException("I/O error: " + ex.getMessage(), ex); } finally { TransportUtils.closeConnection(connection); TransportContextHolder.setTransportContext(previousTransportContext); } }
/** * Validates request written to outputStream and serializes response generated by {@link ResponseCreator} to this stream. * Applies interceptors on both request and response. * @return * @throws IOException */ public InputStream getInputStream() throws IOException { final WebServiceMessage request = crateRequest(); MessageContext messageContext = new DefaultMessageContext(request, messageFactory); InterceptingTemplate interceptingTemplate = new InterceptingTemplate(EndpointInterceptorClientAdapter.wrapEndpointInterceptors(interceptors)); try { interceptingTemplate.interceptRequest(messageContext, new WebServiceMessageReceiver() { public void receive(MessageContext context) throws Exception { validate(request); context.setResponse(responseCreator.createResponse(uri, request, messageFactory)); } }); } catch (Exception e) { throw new IllegalStateException("Error when processing request.",e); } return new ByteArrayInputStream(stringToBytes(serialize(getEnvelopeSource(messageContext.getResponse())))); }
@Override public <T> T sendAndReceive(String uriString, WebServiceMessageCallback requestCallback, WebServiceMessageExtractor<T> responseExtractor) { Assert.notNull(responseExtractor, "'responseExtractor' must not be null"); Assert.hasLength(uriString, "'uri' must not be empty"); TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); WebServiceConnection connection = null; try { connection = createConnection(URI.create(uriString)); TransportContextHolder.setTransportContext(new DefaultTransportContext(connection)); MessageContext messageContext = new DefaultMessageContext(getMessageFactory()); return doSendAndReceive(messageContext, connection, requestCallback, responseExtractor); } catch (TransportException ex) { throw new WebServiceTransportException("Could not use transport: " + ex.getMessage(), ex); } catch (IOException ex) { throw new WebServiceIOException("I/O error: " + ex.getMessage(), ex); } finally { TransportUtils.closeConnection(connection); TransportContextHolder.setTransportContext(previousTransportContext); } }
public <T> T sendAndReceive(String uriString, WebServiceMessageCallback requestCallback, WebServiceMessageExtractor<T> responseExtractor) { Assert.notNull(responseExtractor, "'responseExtractor' must not be null"); Assert.hasLength(uriString, "'uri' must not be empty"); TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); WebServiceConnection connection = null; try { connection = createConnection(URI.create(uriString)); TransportContextHolder.setTransportContext(new DefaultTransportContext(connection)); MessageContext messageContext = new DefaultMessageContext(getMessageFactory()); return doSendAndReceive(messageContext, connection, requestCallback, responseExtractor); } catch (TransportException ex) { throw new WebServiceTransportException("Could not use transport: " + ex.getMessage(), ex); } catch (IOException ex) { throw new WebServiceIOException("I/O error: " + ex.getMessage(), ex); } finally { TransportUtils.closeConnection(connection); TransportContextHolder.setTransportContext(previousTransportContext); } }
@Override protected void handleInvalidXmlException(HttpServletRequest req, HttpServletResponse res, Object handler, InvalidXmlException ex) throws Exception { WebServiceConnection connection = new MyHttpServletConnection(req, res); TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); TransportContextHolder.setTransportContext(new DefaultTransportContext(connection)); try { MessageContext messageContext = new DefaultMessageContext(getMessageFactory().createWebServiceMessage(), getMessageFactory()); SoapBody soapBody = ((SoapMessage) messageContext.getResponse()).getSoapBody(); soapBody.addServerOrReceiverFault(getFaultString(ex), Locale.ENGLISH); connection.send(messageContext.getResponse()); } finally { TransportUtils.closeConnection(connection); TransportContextHolder.setTransportContext(previousTransportContext); } }