From 0a6e33c1ec48581346bb6015329da07515d54f05 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Sat, 18 Nov 2006 01:18:58 +0000 Subject: [PATCH] Finished up JMS support. --- sandbox/pom.xml | 27 ++-- .../jms/JmsReceiverObjectSupport.java | 104 ++++++++++++++ .../jms/JmsTransportInputStream.java | 78 +++++++--- .../jms/JmsTransportMessageListener.java | 135 ------------------ .../jms/JmsTransportOutputStream.java | 54 ++++--- .../jms/MessageEndpointMessageListener.java | 53 +++++++ .../jms/JmsTransportInputStreamTest.java | 56 ++++++++ .../jms/JmsTransportOutputStreamTest.java | 57 ++++++++ ...> MessageEndpointMessageListenerTest.java} | 64 +++++---- 9 files changed, 402 insertions(+), 226 deletions(-) create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/JmsReceiverObjectSupport.java delete mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/MessageEndpointMessageListener.java create mode 100644 sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportInputStreamTest.java create mode 100644 sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportOutputStreamTest.java rename sandbox/src/test/java/org/springframework/ws/transport/jms/{JmsTransportMessageListenerTest.java => MessageEndpointMessageListenerTest.java} (63%) diff --git a/sandbox/pom.xml b/sandbox/pom.xml index 366df6c3..32263783 100644 --- a/sandbox/pom.xml +++ b/sandbox/pom.xml @@ -9,24 +9,6 @@ spring-ws-sandbox jar Spring WS Sandbox - - - spring-2.0 - - - spring.version - 2.0 - - - - - org.springframework - spring-jms - ${spring.version} - - - - @@ -54,6 +36,10 @@ org.springframework spring-mock + + org.springframework + spring-jms + javax.xml.soap @@ -79,6 +65,11 @@ 3.0.1 true + + activemq + activemq + test + org.mortbay.jetty jetty diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsReceiverObjectSupport.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsReceiverObjectSupport.java new file mode 100644 index 00000000..4e7f43ae --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsReceiverObjectSupport.java @@ -0,0 +1,104 @@ +/* + * Copyright 2006 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.ws.transport.jms; + +import javax.jms.BytesMessage; +import javax.jms.Message; +import javax.jms.MessageProducer; +import javax.jms.Session; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.jms.support.JmsUtils; +import org.springframework.util.Assert; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.endpoint.MessageEndpoint; +import org.springframework.ws.transport.ReceiverObjectSupport; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.TransportOutputStream; + +/** + * Convenience base class for JMS server-side transport objects. Contains a {@link MessageEndpoint}, and has methods for + * handling incoming JMS Message requests. + *

+ * This class can be used as a base for a EJB MessageDrivenBean, or using Spring-2.0's MessageDriven POJO's. + * + * @author Arjen Poutsma + * @see #handle(javax.jms.Message,javax.jms.Session) + */ +public abstract class JmsReceiverObjectSupport extends ReceiverObjectSupport implements InitializingBean { + + private MessageEndpoint messageEndpoint; + + /** + * Returns the MessageEndpoint used by this listener. + */ + public MessageEndpoint getMessageEndpoint() { + return messageEndpoint; + } + + /** + * Sets the MessageEndpoint used by this listener. + */ + public void setMessageEndpoint(MessageEndpoint messageEndpoint) { + this.messageEndpoint = messageEndpoint; + } + + public void afterPropertiesSet() throws Exception { + Assert.notNull(getMessageFactory(), "messageFactory is required"); + Assert.notNull(getMessageEndpoint(), "messageEndpoint must not be null"); + logger.info("Using message factory [" + getMessageFactory() + "]"); + } + + /** + * Handles an incoming Messages. Uses the given Session to create a response request. + * + * @param request the incoming message + * @param session the JMS session used to create a response + * @throws IllegalArgumentException when request is not a BytesMessage + */ + protected final void handle(Message request, Session session) throws Exception { + if (request instanceof BytesMessage) { + TransportInputStream tis = new JmsTransportInputStream((BytesMessage) request); + TransportOutputStream tos = new JmsTransportOutputStream(session, request.getJMSCorrelationID()); + handle(tis, tos, getMessageEndpoint()); + } + else { + throw new IllegalArgumentException( + "Wrong message type: [" + request.getClass() + "]. Only BytesMessages can be handled"); + } + + } + + protected final void handleResponse(TransportInputStream tis, TransportOutputStream tos, WebServiceMessage response) + throws Exception { + Message requestMessage = ((JmsTransportInputStream) tis).getMessage(); + if (requestMessage.getJMSReplyTo() == null) { + logger.warn("Incoming message has no ReplyTo set, not sending response"); + return; + } + response.writeTo(tos); + Session session = ((JmsTransportOutputStream) tos).getSession(); + MessageProducer producer = session.createProducer(requestMessage.getJMSReplyTo()); + Message responseMessage = ((JmsTransportOutputStream) tos).getMessage(); + try { + producer.send(responseMessage); + } + finally { + JmsUtils.closeMessageProducer(producer); + } + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java index 6a992aeb..bc775e8a 100644 --- a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java @@ -16,13 +16,13 @@ package org.springframework.ws.transport.jms; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.Iterator; +import javax.jms.BytesMessage; import javax.jms.JMSException; -import javax.jms.TextMessage; +import javax.jms.MessageEOFException; import org.springframework.util.Assert; import org.springframework.ws.transport.TransportInputStream; @@ -30,45 +30,40 @@ import org.springframework.ws.transport.support.EnumerationIterator; /** * JMS specific implementation of the TransportInputStream interface. Exposes a JMS - * TextMessage. + * BytesMessage. * * @author Arjen Poutsma - * @see #getTextMessage() + * @see #getMessage() */ public class JmsTransportInputStream extends TransportInputStream { - private final TextMessage textMessage; + private final BytesMessage message; /** * Constructs a new instance of the JmsTransportInputStream using the provided JMS - * TextMessage. + * BytesMessage. * - * @param textMessage the JMS message + * @param message the JMS message */ - public JmsTransportInputStream(TextMessage textMessage) { - Assert.notNull(textMessage, "textMessage must not be null"); - this.textMessage = textMessage; + public JmsTransportInputStream(BytesMessage message) { + Assert.notNull(message, "message must not be null"); + this.message = message; } /** - * Returns the wrapped JMS TextMessage. + * Returns the wrapped JMS message. */ - public TextMessage getTextMessage() { - return textMessage; + public BytesMessage getMessage() { + return message; } protected InputStream createInputStream() throws IOException { - try { - return new ByteArrayInputStream(textMessage.getText().getBytes("UTF-8")); - } - catch (JMSException ex) { - throw new IOException("Could not get text of message: " + ex.getMessage()); - } + return new BytesMessageInputStream(); } public Iterator getHeaderNames() throws IOException { try { - return new EnumerationIterator(textMessage.getPropertyNames()); + return new EnumerationIterator(message.getPropertyNames()); } catch (JMSException ex) { throw new IOException("Could not get property names: " + ex.getMessage()); @@ -77,11 +72,52 @@ public class JmsTransportInputStream extends TransportInputStream { public Iterator getHeaders(String name) throws IOException { try { - String value = textMessage.getStringProperty(name); + String value = message.getStringProperty(name); return Collections.singletonList(value).iterator(); } catch (JMSException ex) { throw new IOException("Could not get property value: " + ex.getMessage()); } } + + /** + * InputStream that wraps the JMS BytesMessage. + */ + private class BytesMessageInputStream extends InputStream { + + public int read(byte b[]) throws IOException { + try { + return message.readBytes(b); + } + catch (JMSException ex) { + throw new IOException(ex.getMessage()); + } + } + + public int read(byte b[], int off, int len) throws IOException { + if (off == 0) { + try { + return message.readBytes(b, len); + } + catch (JMSException ex) { + throw new IOException(ex.getMessage()); + } + } + else { + return super.read(b, off, len); + } + } + + public int read() throws IOException { + try { + return message.readByte(); + } + catch (MessageEOFException ex) { + return -1; + } + catch (JMSException ex) { + throw new IOException(ex.getMessage()); + } + } + } } diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java deleted file mode 100644 index f856ecd6..00000000 --- a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2006 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.ws.transport.jms; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.Session; -import javax.jms.TextMessage; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.jms.listener.SessionAwareMessageListener; -import org.springframework.jms.support.JmsUtils; -import org.springframework.util.Assert; -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.endpoint.MessageEndpoint; -import org.springframework.ws.transport.ServerTransportObjectSupport; -import org.springframework.ws.transport.TransportInputStream; -import org.springframework.ws.transport.TransportOutputStream; - -/** - * JMS MessageListener that can be used to handle incoming JMS messages. Requires a - * WebServiceMessageFactory which is used to convert the incoming JMS TextMessage into a - * WebServiceMessage, and passes that context to the required MessageEndpoint. If a response - * is created, it is sent using a response JMS message. - *

- * This class implements both MessageListener, for - *

- * Note that the MessageDispatcher implements the MessageEndpoint interface, enabling this - * adapter to function as a gateway to further message handling logic. - * - * @author Arjen Poutsma - * @see #setMessageFactory(org.springframework.ws.WebServiceMessageFactory) - * @see #setMessageEndpoint(org.springframework.ws.endpoint.MessageEndpoint) - */ -public class JmsTransportMessageListener extends ServerTransportObjectSupport - implements SessionAwareMessageListener, MessageListener, InitializingBean { - - private static final Log logger = LogFactory.getLog(JmsTransportMessageListener.class); - - private MessageEndpoint messageEndpoint; - - /** - * Returns the MessageEndpoint used by this listener. - */ - public MessageEndpoint getMessageEndpoint() { - return messageEndpoint; - } - - /** - * Sets the MessageEndpoint used by this listener. - */ - public void setMessageEndpoint(MessageEndpoint messageEndpoint) { - this.messageEndpoint = messageEndpoint; - } - - public void afterPropertiesSet() throws Exception { - Assert.notNull(getMessageFactory(), "messageFactory is required"); - Assert.notNull(getMessageEndpoint(), "messageEndpoint must not be null"); - logger.info("Using message factory [" + getMessageFactory() + "]"); - } - - public void onMessage(Message message) { - try { - onMessage(message, null); - } - catch (JMSException ex) { - logger.error("Could not handle message: " + ex.getMessage(), ex); - } - } - - public void onMessage(Message message, Session session) throws JMSException { - if (message instanceof TextMessage) { - logger.info("Received message [" + message.getJMSMessageID() + "]"); - try { - TransportInputStream tis = new JmsTransportInputStream((TextMessage) message); - TransportOutputStream tos; - if (session == null) { - tos = null; - } - else { - tos = new JmsTransportOutputStream(session, ((TextMessage) message).getJMSCorrelationID()); - } - handle(tis, tos, getMessageEndpoint()); - } - catch (Exception ex) { - logger.error(ex, ex); - } - } - else { - throw new IllegalArgumentException("JmsTransportMessageListener can only handle TextMessages"); - } - } - - protected void handleResponse(TransportInputStream tis, TransportOutputStream tos, WebServiceMessage response) - throws Exception { - if (tos != null) { - Message requestMessage = ((JmsTransportInputStream) tis).getTextMessage(); - if (requestMessage.getJMSReplyTo() == null) { - logger.warn("Incoming message has no ReplyTo set, not sending response"); - return; - } - response.writeTo(tos); - Message responseMessage = ((JmsTransportOutputStream) tos).getTextMessage(); - Session session = ((JmsTransportOutputStream) tos).getSession(); - MessageProducer producer = session.createProducer(requestMessage.getJMSReplyTo()); - try { - producer.send(responseMessage); - } - finally { - JmsUtils.closeMessageProducer(producer); - } - } - else { - logger.warn("JMS Session is not available, sending of response is impossible"); - } - } -} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java index 237f5210..c210c67a 100644 --- a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java @@ -16,12 +16,11 @@ package org.springframework.ws.transport.jms; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.Session; -import javax.jms.TextMessage; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -29,14 +28,14 @@ import org.springframework.ws.transport.TransportOutputStream; /** * JMS specific implementation of the TransportOutputStream interface. Exposes a JMS - * TextMessage, constructed lazily using a Session. + * BytesMessage, constructed lazily using a Session. * * @author Arjen Poutsma - * @see #getTextMessage() + * @see #getMessage() */ public class JmsTransportOutputStream extends TransportOutputStream { - private TextMessage textMessage; + private BytesMessage message; private final Session session; @@ -74,54 +73,67 @@ public class JmsTransportOutputStream extends TransportOutputStream { } /** - * Returns the wrapped JMS TextMessage. Created lazily. + * Returns the wrapped JMS BytesMessage. Created lazily. */ - public TextMessage getTextMessage() throws IOException { - if (textMessage == null) { + public BytesMessage getMessage() throws IOException { + if (message == null) { try { - textMessage = session.createTextMessage(); + message = session.createBytesMessage(); if (StringUtils.hasLength(correlationId)) { - textMessage.setJMSCorrelationID(correlationId); + message.setJMSCorrelationID(correlationId); } } catch (JMSException ex) { - throw new IOException("Could not create text message: " + ex.getMessage()); + throw new IOException("Could not create message: " + ex.getMessage()); } } - return textMessage; + return message; } protected OutputStream getOutputStream() throws IOException { - return new TextMessageOutputStream(); + return new BytesMessageOutputStream(); } public void addHeader(String name, String value) throws IOException { try { - getTextMessage().setStringProperty(name, value); + getMessage().setStringProperty(name, value); } catch (JMSException ex) { throw new IOException("Could not set property " + ex.getMessage()); } } - private class TextMessageOutputStream extends ByteArrayOutputStream { + /** + * OutputStream that wraps the JMS BytesMessage. + */ + private class BytesMessageOutputStream extends OutputStream { - public void flush() throws IOException { + public void write(byte b[]) throws IOException { try { - getTextMessage().setText(new String(toString("UTF-8"))); + getMessage().writeBytes(b); } catch (JMSException ex) { - throw new IOException("Could not set message text: " + ex.getMessage()); + throw new IOException(ex.getMessage()); } } - public void close() throws IOException { + public void write(byte b[], int off, int len) throws IOException { try { - getTextMessage().setText(new String(toString("UTF-8"))); + getMessage().writeBytes(b, off, len); } catch (JMSException ex) { - throw new IOException("Could not set message text: " + ex.getMessage()); + throw new IOException(ex.getMessage()); + } + } + + public void write(int b) throws IOException { + try { + getMessage().writeByte((byte) b); + } + catch (JMSException ex) { + throw new IOException(ex.getMessage()); } } } + } diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/MessageEndpointMessageListener.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/MessageEndpointMessageListener.java new file mode 100644 index 00000000..2c9aa7eb --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/MessageEndpointMessageListener.java @@ -0,0 +1,53 @@ +/* + * Copyright 2006 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.ws.transport.jms; + +import javax.jms.BytesMessage; +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; + +import org.springframework.jms.listener.SessionAwareMessageListener; + +/** + * Spring-2.0 SessionAwareMessageListener that can be used to handle incoming JMS messages. Requires a + * WebServiceMessageFactory which is used to convert the incoming JMS TextMessage into a + * WebServiceMessage, and passes that context to the required MessageEndpoint. If a response + * is created, it is sent using a response JMS message. + *

+ * Note that the MessageDispatcher implements the MessageEndpoint interface, enabling this + * adapter to function as a gateway to further message handling logic. + * + * @author Arjen Poutsma + * @see #setMessageFactory(org.springframework.ws.WebServiceMessageFactory) + * @see #setMessageEndpoint(org.springframework.ws.endpoint.MessageEndpoint) + */ +public class MessageEndpointMessageListener extends JmsReceiverObjectSupport implements SessionAwareMessageListener { + + public void onMessage(Message message, Session session) throws JMSException { + logger.info("Received request [" + message.getJMSMessageID() + "]"); + try { + handle((BytesMessage) message, session); + } + catch (Exception ex) { + JMSException jmsException = new JMSException(ex.getMessage()); + jmsException.setLinkedException(ex); + throw jmsException; + } + } + +} diff --git a/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportInputStreamTest.java b/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportInputStreamTest.java new file mode 100644 index 00000000..de71095f --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportInputStreamTest.java @@ -0,0 +1,56 @@ +/* + * Copyright 2006 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.ws.transport.jms; + +import java.util.Collections; +import java.util.Iterator; +import javax.jms.BytesMessage; + +import junit.framework.TestCase; +import org.easymock.MockControl; + +public class JmsTransportInputStreamTest extends TestCase { + + private JmsTransportInputStream tis; + + private MockControl messageControl; + + private BytesMessage messageMock; + + protected void setUp() throws Exception { + messageControl = MockControl.createControl(BytesMessage.class); + messageMock = (BytesMessage) messageControl.getMock(); + tis = new JmsTransportInputStream(messageMock); + } + + public void testHeaders() throws Exception { + String headerName = "Header"; + messageControl.expectAndReturn(messageMock.getPropertyNames(), + Collections.enumeration(Collections.singleton(headerName))); + String headerValue = "Value"; + messageControl.expectAndReturn(messageMock.getStringProperty(headerName), headerValue); + messageControl.replay(); + Iterator iterator = tis.getHeaderNames(); + assertTrue("No headers found", iterator.hasNext()); + assertEquals("Invalid header", headerName, iterator.next()); + iterator = tis.getHeaders(headerName); + assertTrue("No header values found", iterator.hasNext()); + assertEquals("Invalid header value", headerValue, iterator.next()); + messageControl.verify(); + } + +} \ No newline at end of file diff --git a/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportOutputStreamTest.java b/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportOutputStreamTest.java new file mode 100644 index 00000000..daa1ac5e --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportOutputStreamTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2006 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.ws.transport.jms; + +import javax.jms.BytesMessage; +import javax.jms.Session; + +import junit.framework.TestCase; +import org.easymock.MockControl; + +public class JmsTransportOutputStreamTest extends TestCase { + + private JmsTransportOutputStream tos; + + private MockControl messageControl; + + private BytesMessage messageMock; + + private MockControl sessionControl; + + private Session sessionMock; + + protected void setUp() throws Exception { + messageControl = MockControl.createControl(BytesMessage.class); + messageMock = (BytesMessage) messageControl.getMock(); + sessionControl = MockControl.createControl(Session.class); + sessionMock = (Session) sessionControl.getMock(); + tos = new JmsTransportOutputStream(sessionMock); + } + + public void testHeaders() throws Exception { + sessionControl.expectAndReturn(sessionMock.createBytesMessage(), messageMock); + String headerName = "Header"; + String headerValue = "Value"; + messageMock.setStringProperty(headerName, headerValue); + sessionControl.replay(); + messageControl.replay(); + tos.addHeader(headerName, headerValue); + sessionControl.verify(); + messageControl.verify(); + } + +} \ No newline at end of file diff --git a/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportMessageListenerTest.java b/sandbox/src/test/java/org/springframework/ws/transport/jms/MessageEndpointMessageListenerTest.java similarity index 63% rename from sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportMessageListenerTest.java rename to sandbox/src/test/java/org/springframework/ws/transport/jms/MessageEndpointMessageListenerTest.java index cd817e57..3af5e1a6 100644 --- a/sandbox/src/test/java/org/springframework/ws/transport/jms/JmsTransportMessageListenerTest.java +++ b/sandbox/src/test/java/org/springframework/ws/transport/jms/MessageEndpointMessageListenerTest.java @@ -1,3 +1,5 @@ +/* +*/ /* * Copyright 2006 the original author or authors. * @@ -13,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* package org.springframework.ws.transport.jms; @@ -20,15 +23,17 @@ import javax.jms.BytesMessage; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; -import javax.jms.TextMessage; +import javax.jms.StreamMessage; import junit.framework.TestCase; +import org.codehaus.activemq.message.ActiveMQBytesMessage; +import org.codehaus.activemq.message.ActiveMQTopic; import org.easymock.MockControl; import org.springframework.ws.MockWebServiceMessageFactory; import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.MessageEndpoint; -public class JmsTransportMessageListenerTest extends TestCase { +public class MessageEndpointMessageListenerTest extends TestCase { private static final String REQUEST = " \n" + " DIS\n" + " \n" + " \n" + ""; - private JmsTransportMessageListener messageListener; + private MessageEndpointMessageListener messageListener; - private MockControl messageControl; + private BytesMessage request; - private TextMessage requestMock; + private MockControl sessionControl; + + private Session sessionMock; protected void setUp() throws Exception { - messageListener = new JmsTransportMessageListener(); - messageControl = MockControl.createControl(TextMessage.class); - requestMock = (TextMessage) messageControl.getMock(); + messageListener = new MessageEndpointMessageListener(); + request = new ActiveMQBytesMessage(); + request.writeBytes(REQUEST.getBytes("UTF-8")); messageListener.setMessageFactory(new MockWebServiceMessageFactory()); + sessionControl = MockControl.createControl(Session.class); + sessionMock = (Session) sessionControl.getMock(); } public void testOnMessageInvalidMessage() throws Exception { - MockControl mockControl = MockControl.createControl(BytesMessage.class); - BytesMessage bytesMessage = (BytesMessage) mockControl.getMock(); + MockControl mockControl = MockControl.createControl(StreamMessage.class); + StreamMessage message = (StreamMessage) mockControl.getMock(); try { - messageListener.onMessage(bytesMessage); + messageListener.onMessage(message, sessionMock); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException ex) { @@ -62,8 +71,6 @@ public class JmsTransportMessageListenerTest extends TestCase { } public void testOnMessageNoResponse() throws Exception { - messageControl.expectAndReturn(requestMock.getText(), REQUEST); - messageControl.replay(); MessageEndpoint endpoint = new MessageEndpoint() { @@ -72,28 +79,22 @@ public class JmsTransportMessageListenerTest extends TestCase { }; messageListener.setMessageEndpoint(endpoint); - messageListener.onMessage(requestMock); - - messageControl.verify(); + request.reset(); + messageListener.onMessage(request, sessionMock); } public void testOnMessageResponse() throws Exception { - MockControl sessionControl = MockControl.createControl(Session.class); - Session sessionMock = (Session) sessionControl.getMock(); MockControl producerControl = MockControl.createControl(MessageProducer.class); MessageProducer producerMock = (MessageProducer) producerControl.getMock(); - TextMessage responseMock = (TextMessage) messageControl.getMock(); - messageControl.expectAndReturn(requestMock.getText(), REQUEST); + BytesMessage response = new ActiveMQBytesMessage(); String correlationId = "correlationId"; - Destination replyTo = new Destination() { - }; - messageControl.expectAndReturn(requestMock.getJMSCorrelationID(), correlationId); - sessionControl.expectAndReturn(sessionMock.createTextMessage(), responseMock); - responseMock.setJMSCorrelationID(correlationId); - messageControl.expectAndReturn(requestMock.getJMSReplyTo(), replyTo); + Destination replyTo = new ActiveMQTopic(); + request.setJMSCorrelationID(correlationId); + request.setJMSReplyTo(replyTo); + request.reset(); + sessionControl.expectAndReturn(sessionMock.createBytesMessage(), response); sessionControl.expectAndReturn(sessionMock.createProducer(replyTo), producerMock); - producerMock.send(responseMock); - messageControl.replay(); + producerMock.send(response); sessionControl.replay(); producerControl.replay(); @@ -105,10 +106,11 @@ public class JmsTransportMessageListenerTest extends TestCase { }; messageListener.setMessageEndpoint(endpoint); - messageListener.onMessage(requestMock, sessionMock); + messageListener.onMessage(request, sessionMock); - messageControl.verify(); sessionControl.verify(); producerControl.verify(); + assertEquals("Invalid correlationId", correlationId, response.getJMSCorrelationID()); } -} \ No newline at end of file + +}*/