diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/RosterListeningEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/RosterListeningEndpoint.java index 8fadd0d5e0..d0e82066dc 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/RosterListeningEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/RosterListeningEndpoint.java @@ -29,10 +29,7 @@ import org.jivesoftware.smack.packet.Presence; 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.support.MessageBuilder; import org.springframework.integration.xmpp.core.AbstractXmppConnectionAwareEndpoint; import org.springframework.util.Assert; @@ -49,8 +46,6 @@ public class RosterListeningEndpoint extends AbstractXmppConnectionAwareEndpoint private static final Log logger = LogFactory.getLog(RosterListeningEndpoint.class); - private volatile MessageChannel requestChannel; - private final MessagingTemplate messagingTemplate = new MessagingTemplate(); private final EventForwardingRosterListener rosterListener = new EventForwardingRosterListener(); @@ -69,7 +64,7 @@ public class RosterListeningEndpoint extends AbstractXmppConnectionAwareEndpoint * @param requestChannel the channel on which the inbound message should be sent */ public void setRequestChannel(final MessageChannel requestChannel) { - this.requestChannel = requestChannel; + this.messagingTemplate.setDefaultChannel(requestChannel); } @Override @@ -86,51 +81,32 @@ public class RosterListeningEndpoint extends AbstractXmppConnectionAwareEndpoint @Override protected void onInit() throws Exception { super.onInit(); - this.messagingTemplate.setDefaultChannel(requestChannel); this.messagingTemplate.afterPropertiesSet(); } - /** - * Called whenever an event happens related to the {@link Roster}. - */ - private void forwardRosterEvent(Object event) { - Message message = null; - try { - message = MessageBuilder.withPayload(event).build(); - this.messagingTemplate.send(this.requestChannel, message); - } - catch (MessagingException e) { - throw e; - } - catch (Exception e) { - throw new MessageHandlingException(message, "Failed to send roster event message", e); - } - } /** - * RosterListener that subscribes to a given {@link Roster}'s events - * and forwards them to a message channel. + * RosterListener that subscribes to a given {@link Roster}'s events. + * Presence changes will be forwarded to a message channel. + * All others are only logged at debug level. */ private class EventForwardingRosterListener implements RosterListener { public void entriesAdded(Collection entries) { logger.debug("entries added: " + StringUtils.join(entries.iterator(), ",")); - forwardRosterEvent(entries); } public void entriesUpdated(Collection entries) { logger.debug("entries updated: " + StringUtils.join(entries.iterator(), ",")); - forwardRosterEvent(entries); } public void entriesDeleted(Collection entries) { logger.debug("entries deleted: " + StringUtils.join(entries.iterator(), ",")); - forwardRosterEvent(entries); } public void presenceChanged(Presence presence) { logger.debug("presence changed: " + ToStringBuilder.reflectionToString(presence)); - forwardRosterEvent(presence); + messagingTemplate.convertAndSend(presence); } } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/XmppRosterListeningEndpointTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/XmppRosterListeningEndpointTests.java index 82475e9cfc..1c186cc708 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/XmppRosterListeningEndpointTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/XmppRosterListeningEndpointTests.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.xmpp.inbound; import static junit.framework.Assert.assertEquals; @@ -21,9 +22,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.util.Arrays; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.jivesoftware.smack.Roster; @@ -36,21 +35,20 @@ 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.core.XmppContextUtils; -import org.springframework.integration.xmpp.inbound.RosterListeningEndpoint; /** * @author Oleg Zhurakousky - * */ public class XmppRosterListeningEndpointTests { @Test - public void testEndpointLifecycle(){ + public void testEndpointLifecycle() { final Set rosterSet = new HashSet(); XMPPConnection connection = mock(XMPPConnection.class); Roster roster = mock(Roster.class); @@ -79,13 +77,13 @@ public class XmppRosterListeningEndpointTests { } @Test(expected=IllegalArgumentException.class) - public void testNonInitializedFailure(){ + public void testNonInitializedFailure() { RosterListeningEndpoint rosterEndpoint = new RosterListeningEndpoint(mock(XMPPConnection.class)); rosterEndpoint.start(); } @Test - public void testRosterPresenceChangeEvent(){ + public void testRosterPresenceChangeEvent() { XMPPConnection connection = mock(XMPPConnection.class); Roster roster = mock(Roster.class); when(connection.getRoster()).thenReturn(roster); @@ -100,26 +98,9 @@ public class XmppRosterListeningEndpointTests { Message message = channel.receive(10); assertEquals(presence, message.getPayload()); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test - public void testRosterEntriesEvents(){ - XMPPConnection connection = mock(XMPPConnection.class); - Roster roster = mock(Roster.class); - when(connection.getRoster()).thenReturn(roster); - RosterListeningEndpoint rosterEndpoint = new RosterListeningEndpoint(connection); - QueueChannel channel = new QueueChannel(); - rosterEndpoint.setRequestChannel(channel); - rosterEndpoint.afterPropertiesSet(); - rosterEndpoint.start(); - RosterListener rosterListener = (RosterListener) TestUtils.getPropertyValue(rosterEndpoint, "rosterListener"); - List entries = Arrays.asList(new String[]{"many", "moe", "jack"}); - rosterListener.entriesUpdated(entries); - Message message = channel.receive(10); - assertEquals(entries, message.getPayload()); - } - - @Test - public void testWithImplicitXmppConnection(){ + public void testWithImplicitXmppConnection() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); RosterListeningEndpoint endpoint = new RosterListeningEndpoint(); @@ -129,8 +110,9 @@ public class XmppRosterListeningEndpointTests { } @Test(expected=IllegalArgumentException.class) - public void testNoXmppConnection(){ + public void testNoXmppConnection() { RosterListeningEndpoint handler = new RosterListeningEndpoint(); handler.afterPropertiesSet(); } + }