From 228edd8b3743125b097eccf36cf1c1a109718ff4 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 13 Dec 2010 14:00:31 -0500 Subject: [PATCH] INT-1682, INT-1683 ChatMessageListeningEndpoint and PresenceListeningEndpoint now extend MessageProducerSupport, gaining errorChannel and history writing capabilities --- ...stractXmppInboundChannelAdapterParser.java | 2 +- .../AbstractXmppConnectionAwareEndpoint.java | 19 ++++++++++++--- .../inbound/ChatMessageListeningEndpoint.java | 18 +++------------ .../inbound/PresenceListeningEndpoint.java | 23 +++++-------------- ...ssageInboundChannelAdapterParserTests.java | 2 +- .../ChatMessageListeningEndpointTests.java | 3 +++ .../PresenceListeningEndpointTests.java | 4 +++- 7 files changed, 33 insertions(+), 38 deletions(-) diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/config/AbstractXmppInboundChannelAdapterParser.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/config/AbstractXmppInboundChannelAdapterParser.java index a2dabc274b..b64e5e07dd 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/config/AbstractXmppInboundChannelAdapterParser.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/config/AbstractXmppInboundChannelAdapterParser.java @@ -58,7 +58,7 @@ public abstract class AbstractXmppInboundChannelAdapterParser extends AbstractSi "'xmpp-connection' attribute or have default XMPP connection bean registered under the name 'xmppConnection'" + "(e.g., ). If 'id' is not provided the default will be 'xmppConnection'."); } - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "channel", "requestChannel"); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "channel", "outputChannel"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-startup"); this.postProcess(element, parserContext, builder); } diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareEndpoint.java index 6a87e260b1..662c10fe83 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareEndpoint.java @@ -17,15 +17,18 @@ package org.springframework.integration.xmpp.core; import org.jivesoftware.smack.XMPPConnection; + import org.springframework.beans.factory.BeanFactory; -import org.springframework.integration.endpoint.AbstractEndpoint; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.endpoint.MessageProducerSupport; import org.springframework.util.Assert; /** * @author Oleg Zhurakousky + * @author Mark Fisher * @since 2.0 */ -public abstract class AbstractXmppConnectionAwareEndpoint extends AbstractEndpoint { +public abstract class AbstractXmppConnectionAwareEndpoint extends MessageProducerSupport { protected volatile XMPPConnection xmppConnection; @@ -40,8 +43,18 @@ public abstract class AbstractXmppConnectionAwareEndpoint extends AbstractEndpoi this.xmppConnection = xmppConnection; } + /** + * {@link Deprecated} This method will be eligible for removal in 2.1. + * Use {@link #setOutputChannel(MessageChannel)} instead. + */ + @Deprecated + public void setRequestChannel(MessageChannel requestChannel) { + this.setOutputChannel(requestChannel); + } - protected void onInit() throws Exception { + @Override + protected void onInit() { + super.onInit(); BeanFactory beanFactory = this.getBeanFactory(); if (this.xmppConnection == null && beanFactory != null) { this.xmppConnection = beanFactory.getBean(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, XMPPConnection.class); diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpoint.java index a9009a2132..108191ab69 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpoint.java @@ -21,8 +21,6 @@ import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Packet; -import org.springframework.integration.MessageChannel; -import org.springframework.integration.core.MessagingTemplate; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.xmpp.XmppHeaders; import org.springframework.integration.xmpp.core.AbstractXmppConnectionAwareEndpoint; @@ -39,8 +37,6 @@ import org.springframework.util.Assert; */ public class ChatMessageListeningEndpoint extends AbstractXmppConnectionAwareEndpoint { - private final MessagingTemplate messagingTemplate = new MessagingTemplate(); - private volatile boolean extractPayload = true; private final PacketListener packetListener = new ChatMessagePublishingPacketListener(); @@ -55,13 +51,6 @@ public class ChatMessageListeningEndpoint extends AbstractXmppConnectionAwareEnd } - /** - * @param requestChannel the channel on which the inbound message should be sent - */ - public void setRequestChannel(MessageChannel requestChannel) { - this.messagingTemplate.setDefaultChannel(requestChannel); - } - /** * Specify whether the text message body should be extracted when mapping to a * Spring Integration Message payload. Otherwise, the full XMPP Message will be @@ -72,9 +61,8 @@ public class ChatMessageListeningEndpoint extends AbstractXmppConnectionAwareEnd } @Override - protected void onInit() throws Exception { - super.onInit(); - this.messagingTemplate.afterPropertiesSet(); + public String getComponentType() { + return "xmpp:inbound-channel-adapter"; } @Override @@ -101,7 +89,7 @@ public class ChatMessageListeningEndpoint extends AbstractXmppConnectionAwareEnd MessageBuilder messageBuilder = MessageBuilder.withPayload(payload) .setHeader(XmppHeaders.TYPE, xmppMessage.getType()) .setHeader(XmppHeaders.CHAT, chat); - messagingTemplate.send(messageBuilder.build()); + sendMessage(messageBuilder.build()); } } } diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpoint.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpoint.java index 44ff6521e1..2868d2b880 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpoint.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpoint.java @@ -20,15 +20,13 @@ import java.util.Collection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Presence; import org.springframework.integration.Message; -import org.springframework.integration.MessageChannel; -import org.springframework.integration.core.MessagingTemplate; +import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.xmpp.core.AbstractXmppConnectionAwareEndpoint; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -40,6 +38,7 @@ import org.springframework.util.StringUtils; * * @author Josh Long * @author Oleg Zhurakousky + * @author Mark Fisher * @since 2.0 */ public class PresenceListeningEndpoint extends AbstractXmppConnectionAwareEndpoint { @@ -47,8 +46,6 @@ public class PresenceListeningEndpoint extends AbstractXmppConnectionAwareEndpoi private static final Log logger = LogFactory.getLog(PresenceListeningEndpoint.class); - private final MessagingTemplate messagingTemplate = new MessagingTemplate(); - private final PresencePublishingRosterListener rosterListener = new PresencePublishingRosterListener(); @@ -61,11 +58,9 @@ public class PresenceListeningEndpoint extends AbstractXmppConnectionAwareEndpoi } - /** - * @param requestChannel the channel on which the inbound message should be sent - */ - public void setRequestChannel(final MessageChannel requestChannel) { - this.messagingTemplate.setDefaultChannel(requestChannel); + @Override + public String getComponentType() { + return "xmpp:presence-inbound-channel-adapter"; } @Override @@ -82,12 +77,6 @@ public class PresenceListeningEndpoint extends AbstractXmppConnectionAwareEndpoi } } - @Override - protected void onInit() throws Exception { - super.onInit(); - this.messagingTemplate.afterPropertiesSet(); - } - /** * RosterListener that subscribes to a given {@link Roster}'s events. @@ -119,7 +108,7 @@ public class PresenceListeningEndpoint extends AbstractXmppConnectionAwareEndpoi if (logger.isDebugEnabled()) { logger.debug("presence changed: " + presence.getFrom() + " - " + presence); } - messagingTemplate.convertAndSend(presence); + sendMessage(MessageBuilder.withPayload(presence).build()); } } } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/config/ChatMessageInboundChannelAdapterParserTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/config/ChatMessageInboundChannelAdapterParserTests.java index 71a77b550e..a65ec4c6e3 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/config/ChatMessageInboundChannelAdapterParserTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/config/ChatMessageInboundChannelAdapterParserTests.java @@ -46,7 +46,7 @@ public class ChatMessageInboundChannelAdapterParserTests { public void testInboundAdapter(){ ChatMessageListeningEndpoint adapter = context.getBean("xmppInboundAdapter", ChatMessageListeningEndpoint.class); assertFalse(adapter.isAutoStartup()); - DirectChannel channel = (DirectChannel) TestUtils.getPropertyValue(adapter, "messagingTemplate.defaultChannel"); + DirectChannel channel = (DirectChannel) TestUtils.getPropertyValue(adapter, "outputChannel"); assertEquals("xmppInbound", channel.getComponentName()); XMPPConnection connection = (XMPPConnection)TestUtils.getPropertyValue(adapter, "xmppConnection"); assertEquals(connection, context.getBean("testConnection")); diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpointTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpointTests.java index 354c9bedb3..54c52d9b70 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpointTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpointTests.java @@ -31,6 +31,7 @@ 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.channel.QueueChannel; import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.xmpp.core.XmppContextUtils; import org.springframework.integration.xmpp.inbound.ChatMessageListeningEndpoint; @@ -66,6 +67,7 @@ public class ChatMessageListeningEndpointTests { }).when(connection).removePacketListener(Mockito.any(PacketListener.class)); assertEquals(0, packetListSet.size()); + endpoint.setOutputChannel(new QueueChannel()); endpoint.afterPropertiesSet(); endpoint.start(); assertEquals(1, packetListSet.size()); @@ -85,6 +87,7 @@ public class ChatMessageListeningEndpointTests { bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); ChatMessageListeningEndpoint endpoint = new ChatMessageListeningEndpoint(); endpoint.setBeanFactory(bf); + endpoint.setOutputChannel(new QueueChannel()); endpoint.afterPropertiesSet(); assertNotNull(TestUtils.getPropertyValue(endpoint,"xmppConnection")); } diff --git a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpointTests.java b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpointTests.java index becddd29f9..64942b9c1e 100644 --- a/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpointTests.java +++ b/spring-integration-xmpp/src/test/java/org/springframework/integration/xmpp/inbound/PresenceListeningEndpointTests.java @@ -68,6 +68,7 @@ public class PresenceListeningEndpointTests { } }).when(roster).removeRosterListener(Mockito.any(RosterListener.class)); PresenceListeningEndpoint rosterEndpoint = new PresenceListeningEndpoint(connection); + rosterEndpoint.setOutputChannel(new QueueChannel()); rosterEndpoint.afterPropertiesSet(); assertEquals(0, rosterSet.size()); rosterEndpoint.start(); @@ -89,7 +90,7 @@ public class PresenceListeningEndpointTests { when(connection.getRoster()).thenReturn(roster); PresenceListeningEndpoint rosterEndpoint = new PresenceListeningEndpoint(connection); QueueChannel channel = new QueueChannel(); - rosterEndpoint.setRequestChannel(channel); + rosterEndpoint.setOutputChannel(channel); rosterEndpoint.afterPropertiesSet(); rosterEndpoint.start(); RosterListener rosterListener = (RosterListener) TestUtils.getPropertyValue(rosterEndpoint, "rosterListener"); @@ -105,6 +106,7 @@ public class PresenceListeningEndpointTests { bf.registerSingleton(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, mock(XMPPConnection.class)); PresenceListeningEndpoint endpoint = new PresenceListeningEndpoint(); endpoint.setBeanFactory(bf); + endpoint.setOutputChannel(new QueueChannel()); endpoint.afterPropertiesSet(); assertNotNull(TestUtils.getPropertyValue(endpoint,"xmppConnection")); }