From ff0d81e36b3e90a9a4f552f012ab498e85d3cbfd Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 11 Nov 2010 15:57:49 -0500 Subject: [PATCH] INT-1603 added namespace support for SearchInboundMessageSource --- .../config/TwitterNamespaceHandler.java | 1 + .../TwitterReceivingMessageSourceParser.java | 17 ++++- .../config/spring-integration-twitter-2.0.xsd | 26 ++++++- ...chReceivingMessageSourceParser-context.xml | 44 ++++++++++++ ...archReceivingMessageSourceParserTests.java | 70 +++++++++++++++++++ 5 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParser-context.xml create mode 100644 spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParserTests.java diff --git a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterNamespaceHandler.java b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterNamespaceHandler.java index b39e351272..d6640e1843 100644 --- a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterNamespaceHandler.java +++ b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterNamespaceHandler.java @@ -34,6 +34,7 @@ public class TwitterNamespaceHandler extends AbstractIntegrationNamespaceHandler registerBeanDefinitionParser("inbound-channel-adapter", new TwitterReceivingMessageSourceParser()); registerBeanDefinitionParser("dm-inbound-channel-adapter", new TwitterReceivingMessageSourceParser()); registerBeanDefinitionParser("mentions-inbound-channel-adapter", new TwitterReceivingMessageSourceParser()); + registerBeanDefinitionParser("search-inbound-channel-adapter", new TwitterReceivingMessageSourceParser()); // outbound registerBeanDefinitionParser("outbound-channel-adapter", new TwitterSendingMessageHandlerParser()); diff --git a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterReceivingMessageSourceParser.java b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterReceivingMessageSourceParser.java index d2f9d0b70d..8f6a377586 100644 --- a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterReceivingMessageSourceParser.java +++ b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterReceivingMessageSourceParser.java @@ -27,6 +27,8 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; +import org.springframework.integration.twitter.core.Twitter4jTemplate; +import org.springframework.util.StringUtils; /** * Parser for inbound Twitter Channel Adapters. @@ -49,12 +51,25 @@ public class TwitterReceivingMessageSourceParser extends AbstractPollingInboundC else if ("mentions-inbound-channel-adapter".equals(elementName)) { className = BASE_PACKAGE + ".inbound.MentionsReceivingMessageSource"; } + else if ("search-inbound-channel-adapter".equals(elementName)){ + className = BASE_PACKAGE + ".inbound.SearchReceivingMessageSource"; + } else { parserContext.getReaderContext().error("element '" + elementName + "' is not supported by this parser.", element); } BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(className); - builder.addConstructorArgReference(element.getAttribute("twitter-template")); + String templateBeanName = element.getAttribute("twitter-template"); + + if (!StringUtils.hasText(templateBeanName)){ + BeanDefinitionBuilder templateBuilder = + BeanDefinitionBuilder.genericBeanDefinition("org.springframework.integration.twitter.core.Twitter4jTemplate"); + builder.addConstructorArgValue(templateBuilder.getBeanDefinition()); + } else { + builder.addConstructorArgReference(templateBeanName); + } + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-startup"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "query"); String name = BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry()); return new RuntimeBeanReference(name); } diff --git a/spring-integration-twitter/src/main/resources/org/springframework/integration/twitter/config/spring-integration-twitter-2.0.xsd b/spring-integration-twitter/src/main/resources/org/springframework/integration/twitter/config/spring-integration-twitter-2.0.xsd index cb51616490..34d919b11a 100644 --- a/spring-integration-twitter/src/main/resources/org/springframework/integration/twitter/config/spring-integration-twitter-2.0.xsd +++ b/spring-integration-twitter/src/main/resources/org/springframework/integration/twitter/config/spring-integration-twitter-2.0.xsd @@ -43,6 +43,30 @@ + + + + + + Configures an inbound channel adapter that consumes message (representing mentions of your handle) + from twitter and sends Messages whose payloads are Status objects. + + + + + + + + + Twitter search query (e.g, #springintegration . + For more info on Twitter queries please refer to this site: http://search.twitter.com/operators) + + + + + + + @@ -95,7 +119,7 @@ - + diff --git a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParser-context.xml b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParser-context.xml new file mode 100644 index 0000000000..32d78cac80 --- /dev/null +++ b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParser-context.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParserTests.java b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParserTests.java new file mode 100644 index 0000000000..314a0a1389 --- /dev/null +++ b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSearchReceivingMessageSourceParserTests.java @@ -0,0 +1,70 @@ +/* + * 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.twitter.config; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Proxy; + +import net.sf.cglib.proxy.Enhancer; + +import org.junit.Test; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.endpoint.SourcePollingChannelAdapter; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.twitter.core.Twitter4jTemplate; +import org.springframework.integration.twitter.core.TwitterOperations; +import org.springframework.integration.twitter.inbound.AbstractTwitterMessageSource; +import org.springframework.integration.twitter.inbound.SearchReceivingMessageSource; + +/** + * @author Oleg Zhurakousky + * + */ +public class TestSearchReceivingMessageSourceParserTests { + + @Test + public void testSearchReceivingDefaultTemplate(){ + ApplicationContext ac = new ClassPathXmlApplicationContext("TestSearchReceivingMessageSourceParser-context.xml", this.getClass()); + SourcePollingChannelAdapter spca = ac.getBean("searchAdapter", SourcePollingChannelAdapter.class); + SearchReceivingMessageSource ms = (SearchReceivingMessageSource) TestUtils.getPropertyValue(spca, "source"); + assertFalse(ms.isAutoStartup()); + + assertFalse(ms.isAutoStartup()); + Twitter4jTemplate template = (Twitter4jTemplate) TestUtils.getPropertyValue(ms, "twitter"); + + assertFalse(template.getUnderlyingTwitter().isOAuthEnabled()); // verify that anonymous Twitte + } + @Test + public void testSearchReceivingCustomTemplate(){ + ApplicationContext ac = new ClassPathXmlApplicationContext("TestSearchReceivingMessageSourceParser-context.xml", this.getClass()); + SourcePollingChannelAdapter spca = ac.getBean("searchAdapterWithTemplate", SourcePollingChannelAdapter.class); + SearchReceivingMessageSource ms = (SearchReceivingMessageSource) TestUtils.getPropertyValue(spca, "source"); + assertFalse(ms.isAutoStartup()); + + assertFalse(ms.isAutoStartup()); + TwitterOperations template = (TwitterOperations) TestUtils.getPropertyValue(ms, "twitter"); + assertEquals(ac.getBean("twitter"), template); + } + + +}