From 1fdafb547fe8ba6769d5ab641110e11bfba91ed4 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 9 Nov 2010 10:26:17 -0500 Subject: [PATCH] INT-1592 added support for auto-discovery of XmppConnection based on the bean name - 'xmppConnection', added tests --- .../AbstractXmppConnectionAwareEndpoint.java | 49 +++++++++++++++++++ ...ractXmppConnectionAwareMessageHandler.java | 49 +++++++++++++++++++ .../integration/xmpp/XmppContextUtils.java | 25 ++++++++++ .../messages/XmppMessageDrivenEndpoint.java | 19 ++++--- .../XmppMessageSendingMessageHandler.java | 33 ++++++------- .../XmppRosterEventMessageDrivenEndpoint.java | 18 ++++--- .../XmppRosterEventMessageSendingHandler.java | 21 ++++---- .../config/spring-integration-xmpp-2.0.xsd | 8 +-- .../XmppMessageDrivenEndpointTests.java | 20 ++++++++ ...XmppMessageSendingMessageHandlerTests.java | 21 +++++++- ...RosterEventMessageSendingHandlerTests.java | 44 ++++++++++++++++- ...RosterEventMessageDrivenEndpointTests.java | 19 +++++++ 12 files changed, 273 insertions(+), 53 deletions(-) create mode 100644 spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareEndpoint.java create mode 100644 spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareMessageHandler.java create mode 100644 spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/XmppContextUtils.java diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareEndpoint.java new file mode 100644 index 0000000000..6342b32f98 --- /dev/null +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareEndpoint.java @@ -0,0 +1,49 @@ +/* + * Copyright 2002-2010 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.xmpp; + +import org.jivesoftware.smack.XMPPConnection; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.integration.endpoint.AbstractEndpoint; +import org.springframework.util.Assert; + +/** + * @author Oleg Zhurakousky + * @since 2.0 + * + */ +public abstract class AbstractXmppConnectionAwareEndpoint extends AbstractEndpoint { + protected volatile XMPPConnection xmppConnection; + protected volatile boolean initialized; + + public AbstractXmppConnectionAwareEndpoint(){} + + public AbstractXmppConnectionAwareEndpoint(XMPPConnection xmppConnection){ + Assert.notNull(xmppConnection, "'xmppConnection' must no be null"); + this.xmppConnection = xmppConnection; + } + + protected void onInit() throws Exception { + BeanFactory bf = this.getBeanFactory(); + if (xmppConnection == null && bf != null){ + xmppConnection = bf.getBean(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, XMPPConnection.class); + } + Assert.notNull(xmppConnection, "Failed to resolve XMPPConnection. XMPPConnection must either be set expicitly " + + "via 'xmpp-connection' attribute or implicitly by registering a bean with the name 'xmppConnection' and of type " + + "'org.jivesoftware.smack.XMPPConnection' in the Application Context"); + this.initialized = true; + } +} diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareMessageHandler.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareMessageHandler.java new file mode 100644 index 0000000000..67e0afb919 --- /dev/null +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/AbstractXmppConnectionAwareMessageHandler.java @@ -0,0 +1,49 @@ +/* + * Copyright 2002-2010 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.xmpp; + +import org.jivesoftware.smack.XMPPConnection; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.integration.handler.AbstractMessageHandler; +import org.springframework.util.Assert; + +/** + * @author Oleg Zhurakousky + * @since 2.0 + * + */ +public abstract class AbstractXmppConnectionAwareMessageHandler extends AbstractMessageHandler { + protected volatile XMPPConnection xmppConnection; + protected volatile boolean initialized; + + public AbstractXmppConnectionAwareMessageHandler(){} + + public AbstractXmppConnectionAwareMessageHandler(XMPPConnection xmppConnection){ + Assert.notNull(xmppConnection, "'xmppConnection' must no be null"); + this.xmppConnection = xmppConnection; + } + + protected void onInit() throws Exception { + BeanFactory bf = this.getBeanFactory(); + if (xmppConnection == null && bf != null){ + xmppConnection = bf.getBean(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, XMPPConnection.class); + } + Assert.notNull(xmppConnection, "Failed to resolve XMPPConnection. XMPPConnection must either be set expicitly " + + "via 'xmpp-connection' attribute or implicitly by registering a bean with the name 'xmppConnection' and of type " + + "'org.jivesoftware.smack.XMPPConnection' in the Application Context"); + this.initialized = true; + } +} diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/XmppContextUtils.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/XmppContextUtils.java new file mode 100644 index 0000000000..25a9f9a54b --- /dev/null +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/XmppContextUtils.java @@ -0,0 +1,25 @@ +/* + * Copyright 2002-2010 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.xmpp; + +/** + * @author Oleg ZHurakousky + * @since 2.0 + */ +public interface XmppContextUtils { + + final String XMPP_CONNECTION_BEAN_NAME = "xmppConnection"; +} diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpoint.java index 3e8a6c7267..17cd31ee9c 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpoint.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.integration.xmpp.messages; import org.jivesoftware.smack.Chat; @@ -24,8 +23,8 @@ import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.springframework.integration.MessageChannel; import org.springframework.integration.core.MessagingTemplate; -import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.xmpp.AbstractXmppConnectionAwareEndpoint; import org.springframework.integration.xmpp.XmppHeaders; import org.springframework.util.Assert; @@ -53,22 +52,22 @@ import org.springframework.util.Assert; * @see XMPPConnection the XMPPConnection (as * created by {@link XmppConnectionFactory} */ -public class XmppMessageDrivenEndpoint extends AbstractEndpoint { +public class XmppMessageDrivenEndpoint extends AbstractXmppConnectionAwareEndpoint { private final MessagingTemplate messagingTemplate = new MessagingTemplate(); private volatile MessageChannel requestChannel; - private final XMPPConnection xmppConnection; - private volatile boolean extractPayload = true; private volatile PacketListener packetListener; - private volatile boolean initialized; - + public XmppMessageDrivenEndpoint(){ + super(); + } + public XmppMessageDrivenEndpoint(XMPPConnection xmppConnection){ - this.xmppConnection = xmppConnection; + super(xmppConnection); } /** @@ -89,7 +88,7 @@ public class XmppMessageDrivenEndpoint extends AbstractEndpoint { @Override protected void doStart() { - Assert.isTrue(this.initialized, this.getComponentType() + " must be initialized"); + Assert.isTrue(this.initialized, this.getComponentName() + "#" + this.getComponentType() + " must be initialized"); xmppConnection.addPacketListener(this.packetListener, null); } @@ -100,6 +99,7 @@ public class XmppMessageDrivenEndpoint extends AbstractEndpoint { @Override protected void onInit() throws Exception { + super.onInit(); this.messagingTemplate.setDefaultChannel(requestChannel); this.messagingTemplate.afterPropertiesSet(); this.packetListener = new PacketListener() { @@ -108,7 +108,6 @@ public class XmppMessageDrivenEndpoint extends AbstractEndpoint { forwardXmppMessage(xmppConnection.getChatManager().getThreadChat(message.getThread()), message); } }; - this.initialized = true; } private void forwardXmppMessage(Chat chat, Message xmppMessage) { diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandler.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandler.java index 2c118af7c6..8cd2ad1f46 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandler.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandler.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.integration.xmpp.messages; import org.jivesoftware.smack.Chat; @@ -21,7 +20,7 @@ import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.springframework.integration.Message; import org.springframework.integration.MessageHandlingException; -import org.springframework.integration.handler.AbstractMessageHandler; +import org.springframework.integration.xmpp.AbstractXmppConnectionAwareMessageHandler; import org.springframework.integration.xmpp.XmppHeaders; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -32,30 +31,30 @@ import org.springframework.util.StringUtils; * @author Oleg Zhurakousky * @since 2.0 */ -public class XmppMessageSendingMessageHandler extends AbstractMessageHandler { - - private final XMPPConnection xmppConnection; +public class XmppMessageSendingMessageHandler extends AbstractXmppConnectionAwareMessageHandler { + public XmppMessageSendingMessageHandler(){ + super(); + } + public XmppMessageSendingMessageHandler(XMPPConnection xmppConnection){ - Assert.notNull(xmppConnection, "'xmppConnection' must no be null"); - this.xmppConnection = xmppConnection; + super(xmppConnection); } protected void handleMessageInternal(Message message) { - String messageBody = null; - String destinationUser = null; - Object payload = message.getPayload(); - Assert.isInstanceOf(String.class, payload, "Only payload of type String is suported. You " + - "can apply transformer prior to sending message to this handler"); - messageBody = (String) payload; - destinationUser = (String) message.getHeaders().get(XmppHeaders.CHAT_TO_USER); + Assert.isTrue(this.initialized, this.getComponentName() + "#" + this.getComponentType() + " must be initialized"); + Object messageBody = message.getPayload(); + String destinationUser = (String) message.getHeaders().get(XmppHeaders.CHAT_TO_USER); Assert.state(StringUtils.hasText(destinationUser), "'" + XmppHeaders.CHAT_TO_USER + "' header must not be null"); + Assert.isInstanceOf(String.class, messageBody, "Only payload of type String is suported. You " + + "can apply transformer prior to sending message to this handler"); + String threadId = (String) message.getHeaders().get(XmppHeaders.CHAT_THREAD_ID); Chat chat = getOrCreateChatWithParticipant(destinationUser, threadId); - // TODO - figure out what to do with chat.threadId? try { - chat.sendMessage(messageBody); - } catch (XMPPException e) { + chat.sendMessage((String) messageBody); + } + catch (XMPPException e) { throw new MessageHandlingException(message, e); } } diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpoint.java index 40c4ae4aba..6ea29a077b 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpoint.java @@ -25,13 +25,15 @@ import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Presence; +import org.springframework.beans.factory.BeanFactory; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; import org.springframework.integration.MessageHandlingException; import org.springframework.integration.MessagingException; import org.springframework.integration.core.MessagingTemplate; -import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.xmpp.AbstractXmppConnectionAwareEndpoint; +import org.springframework.integration.xmpp.XmppContextUtils; import org.springframework.util.Assert; /** @@ -43,22 +45,22 @@ import org.springframework.util.Assert; * @author Oleg Zhurakousky * @since 2.0 */ -public class XmppRosterEventMessageDrivenEndpoint extends AbstractEndpoint { +public class XmppRosterEventMessageDrivenEndpoint extends AbstractXmppConnectionAwareEndpoint { private static final Log logger = LogFactory.getLog(XmppRosterEventMessageDrivenEndpoint.class); private volatile MessageChannel requestChannel; - private final XMPPConnection xmppConnection; - private final MessagingTemplate messagingTemplate = new MessagingTemplate(); private final EventForwardingRosterListener rosterListener = new EventForwardingRosterListener(); - private volatile boolean initialized; + public XmppRosterEventMessageDrivenEndpoint(){ + super(); + } public XmppRosterEventMessageDrivenEndpoint(XMPPConnection xmppConnection){ - this.xmppConnection = xmppConnection; + super(xmppConnection); } /** * @param requestChannel the channel on which the inbound message should be sent @@ -69,7 +71,7 @@ public class XmppRosterEventMessageDrivenEndpoint extends AbstractEndpoint { @Override protected void doStart() { - Assert.isTrue(this.initialized, this.getComponentType() + " must be initialized"); + Assert.isTrue(this.initialized, this.getComponentName() + "#" + this.getComponentType() + " must be initialized"); this.xmppConnection.getRoster().addRosterListener(rosterListener); } @@ -80,9 +82,9 @@ public class XmppRosterEventMessageDrivenEndpoint extends AbstractEndpoint { @Override protected void onInit() throws Exception { + super.onInit(); this.messagingTemplate.setDefaultChannel(requestChannel); this.messagingTemplate.afterPropertiesSet(); - this.initialized = true; } /** diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageSendingHandler.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageSendingHandler.java index 4acc102df4..8e38ab0da3 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageSendingHandler.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageSendingHandler.java @@ -18,33 +18,30 @@ package org.springframework.integration.xmpp.presence; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Presence; import org.springframework.integration.Message; -import org.springframework.integration.handler.AbstractMessageHandler; -import org.springframework.integration.mapping.OutboundMessageMapper; +import org.springframework.integration.xmpp.AbstractXmppConnectionAwareMessageHandler; import org.springframework.util.Assert; /** - * This class will facilitate publishing updated presence values for a given connection. This change happens on the - * {@link org.jivesoftware.smack.Roster#setSubscriptionMode(org.jivesoftware.smack.Roster.SubscriptionMode)} property. + * This class will facilitate publishing updated presence values for a given connection. * * @author Josh Long * @author Oleg Zhurakousky - * @see org.jivesoftware.smack.packet.Presence.Mode the mode (i.e.: - * {@link org.jivesoftware.smack.packet.Presence.Mode#away}) - * @see org.jivesoftware.smack.packet.Presence.Type the type (i.e.: - * {@link org.jivesoftware.smack.packet.Presence.Type#available} ) + * * @since 2.0 */ -public class XmppRosterEventMessageSendingHandler extends AbstractMessageHandler { +public class XmppRosterEventMessageSendingHandler extends AbstractXmppConnectionAwareMessageHandler { - private final XMPPConnection xmppConnection; + public XmppRosterEventMessageSendingHandler(){ + super(); + } public XmppRosterEventMessageSendingHandler(XMPPConnection xmppConnection){ - Assert.notNull(xmppConnection, "'xmppConnection' must not be null"); - this.xmppConnection = xmppConnection; + super(xmppConnection); } @Override protected void handleMessageInternal(Message message) throws Exception { + Assert.isTrue(this.initialized, this.getComponentName() + "#" + this.getComponentType() + " must be initialized"); Object payload = message.getPayload(); Assert.isInstanceOf(Presence.class, payload, "'payload' must be of type 'org.jivesoftware.smack.packet.Presence', was " + payload.getClass().getName()); diff --git a/spring-integration-xmpp/src/main/resources/org/springframework/integration/xmpp/config/spring-integration-xmpp-2.0.xsd b/spring-integration-xmpp/src/main/resources/org/springframework/integration/xmpp/config/spring-integration-xmpp-2.0.xsd index 7ce5dbfcc1..3c451fae04 100644 --- a/spring-integration-xmpp/src/main/resources/org/springframework/integration/xmpp/config/spring-integration-xmpp-2.0.xsd +++ b/spring-integration-xmpp/src/main/resources/org/springframework/integration/xmpp/config/spring-integration-xmpp-2.0.xsd @@ -66,7 +66,7 @@ - + @@ -97,7 +97,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -160,7 +160,7 @@ - + diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpointTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpointTests.java index ea8919cdbe..ef82642fcd 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpointTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageDrivenEndpointTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.xmpp.messages; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; @@ -29,6 +30,9 @@ import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.xmpp.XmppContextUtils; /** * @author Oleg Zhurakousky @@ -76,4 +80,20 @@ public class XmppMessageDrivenEndpointTests { XmppMessageDrivenEndpoint endpoint = new XmppMessageDrivenEndpoint(mock(XMPPConnection.class)); endpoint.start(); } + + @Test + public void testWithImplicitXmppConnection(){ + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); + XmppMessageDrivenEndpoint endpoint = new XmppMessageDrivenEndpoint(); + endpoint.setBeanFactory(bf); + endpoint.afterPropertiesSet(); + assertNotNull(TestUtils.getPropertyValue(endpoint,"xmppConnection")); + } + + @Test(expected=IllegalArgumentException.class) + public void testNoXmppConnection(){ + XmppMessageDrivenEndpoint endpoint = new XmppMessageDrivenEndpoint(); + endpoint.afterPropertiesSet(); + } } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandlerTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandlerTests.java index 19dc9bec76..c15037b6e2 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandlerTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppMessageSendingMessageHandlerTests.java @@ -3,6 +3,7 @@ */ package org.springframework.integration.xmpp.messages; +import static junit.framework.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; @@ -15,10 +16,13 @@ import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.XMPPConnection; import org.junit.Test; import org.mockito.Mockito; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.integration.Message; import org.springframework.integration.MessageHandlingException; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.xmpp.XmppContextUtils; import org.springframework.integration.xmpp.XmppHeaders; /** @@ -37,7 +41,7 @@ public class XmppMessageSendingMessageHandlerTests { when(chantManager.createChat(Mockito.any(String.class), Mockito.any(MessageListener.class))).thenReturn(chat); XmppMessageSendingMessageHandler handler = new XmppMessageSendingMessageHandler(connection); - + handler.afterPropertiesSet(); Message message = MessageBuilder.withPayload("Test Message"). setHeader(XmppHeaders.CHAT_TO_USER, "kermit@frog.com"). build(); @@ -73,4 +77,19 @@ public class XmppMessageSendingMessageHandlerTests { XmppMessageSendingMessageHandler handler = new XmppMessageSendingMessageHandler(mock(XMPPConnection.class)); handler.handleMessage(new GenericMessage(123)); } + @Test + public void testWithImplicitXmppConnection(){ + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); + XmppMessageSendingMessageHandler handler = new XmppMessageSendingMessageHandler(); + handler.setBeanFactory(bf); + handler.afterPropertiesSet(); + assertNotNull(TestUtils.getPropertyValue(handler,"xmppConnection")); + } + + @Test(expected=IllegalArgumentException.class) + public void testNoXmppConnection(){ + XmppMessageSendingMessageHandler handler = new XmppMessageSendingMessageHandler(); + handler.afterPropertiesSet(); + } } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppRosterEventMessageSendingHandlerTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppRosterEventMessageSendingHandlerTests.java index 288c8fb165..6f1a047cbc 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppRosterEventMessageSendingHandlerTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/messages/XmppRosterEventMessageSendingHandlerTests.java @@ -15,10 +15,52 @@ */ package org.springframework.integration.xmpp.messages; +import static junit.framework.Assert.assertNotNull; +import static org.mockito.Mockito.mock; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.packet.Presence; +import org.junit.Test; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.integration.MessageHandlingException; +import org.springframework.integration.message.GenericMessage; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.xmpp.XmppContextUtils; +import org.springframework.integration.xmpp.presence.XmppRosterEventMessageSendingHandler; + /** * @author Oleg Zhurakousky * */ public class XmppRosterEventMessageSendingHandlerTests { - + + @Test + public void testPresencePayload(){ + XmppRosterEventMessageSendingHandler handler = new XmppRosterEventMessageSendingHandler(mock(XMPPConnection.class)); + handler.afterPropertiesSet(); + handler.handleMessage(new GenericMessage(mock(Presence.class))); + } + + @Test(expected=MessageHandlingException.class) + public void testWrongPayload(){ + XmppRosterEventMessageSendingHandler handler = new XmppRosterEventMessageSendingHandler(mock(XMPPConnection.class)); + handler.afterPropertiesSet(); + handler.handleMessage(new GenericMessage(new Object())); + } + + @Test + public void testWithImplicitXmppConnection(){ + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); + XmppRosterEventMessageSendingHandler handler = new XmppRosterEventMessageSendingHandler(); + handler.setBeanFactory(bf); + handler.afterPropertiesSet(); + assertNotNull(TestUtils.getPropertyValue(handler,"xmppConnection")); + } + + @Test(expected=IllegalArgumentException.class) + public void testNoXmppConnection(){ + XmppRosterEventMessageSendingHandler handler = new XmppRosterEventMessageSendingHandler(); + handler.afterPropertiesSet(); + } } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpointTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpointTests.java index 3b44c79e77..375b043063 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpointTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/presence/XmppRosterEventMessageDrivenEndpointTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.xmpp.presence; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -35,9 +36,11 @@ import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.integration.Message; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.xmpp.XmppContextUtils; /** * @author Oleg Zhurakousky @@ -115,4 +118,20 @@ public class XmppRosterEventMessageDrivenEndpointTests { Message message = channel.receive(10); assertEquals(entries, message.getPayload()); } + + @Test + public void testWithImplicitXmppConnection(){ + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); + XmppRosterEventMessageDrivenEndpoint endpoint = new XmppRosterEventMessageDrivenEndpoint(); + endpoint.setBeanFactory(bf); + endpoint.afterPropertiesSet(); + assertNotNull(TestUtils.getPropertyValue(endpoint,"xmppConnection")); + } + + @Test(expected=IllegalArgumentException.class) + public void testNoXmppConnection(){ + XmppRosterEventMessageDrivenEndpoint handler = new XmppRosterEventMessageDrivenEndpoint(); + handler.afterPropertiesSet(); + } }