From 0be6410a6d53954d8acd5786a6cc43b5df8a8ea1 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Thu, 16 Dec 2010 18:45:12 -0500 Subject: [PATCH] INT-1636 rolling back the DM target user expression support --- docs/src/reference/docbook/twitter.xml | 32 ++++++++------- .../TwitterOutboundChannelAdapterParser.java | 14 +------ .../DirectMessageSendingMessageHandler.java | 39 +------------------ .../config/spring-integration-twitter-2.0.xsd | 10 +---- ...estSendingMessageHandlerParser-context.xml | 3 +- .../TestSendingMessageHandlerParserTests.java | 9 ++--- ...rectMessageSendingMessageHandlerTests.java | 13 ------- 7 files changed, 26 insertions(+), 94 deletions(-) diff --git a/docs/src/reference/docbook/twitter.xml b/docs/src/reference/docbook/twitter.xml index 62d6294834..6cb6a0699b 100644 --- a/docs/src/reference/docbook/twitter.xml +++ b/docs/src/reference/docbook/twitter.xml @@ -259,25 +259,27 @@ received. When it comes to Twitter Direct Messages, you must specify who you are sending the message to - the target userid. - The Twitter Outbound Direct Message Channel Adapter provides two ways you can specify that target user. - - - The first (and default) way is that it will look for a target userid in the Message headers under the name twitter_dmTargetUserId which - is also identified by the following constant: TwitterHeaders.DM_TARGET_USER_ID. + The Twitter Outbound Direct Message Channel Adapter will look for a target userid in the Message headers under the name + twitter_dmTargetUserId which is also identified by the following constant: TwitterHeaders.DM_TARGET_USER_ID. So when creating a Message all you need to do is add a value for that header. - + + .setHeader(TwitterHeaders.DM_TARGET_USER_ID, "z_oleg").build();]]> - The above approach works well if you know the target userid in advance. However there are times when that - value must be determined dynamically. For those cases you can utilize the second approach: SpEL support. - Simply provide a valid SpEL expression via the target-user-expression attribute. - - ]]> + The above approach works well if you are creating the Message programmatically. However it's more common to + provide the header value within a messaging flow. The value can be provided by an upstream <header-enricher>. + +
+]]> + + + It's quite common that the value must be determined dynamically. For those cases you can take advantage + of SpEL support within the <header-enricher>. + + +
+]]> diff --git a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterOutboundChannelAdapterParser.java b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterOutboundChannelAdapterParser.java index 7fac8f68f6..8ef5038639 100644 --- a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterOutboundChannelAdapterParser.java +++ b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/config/TwitterOutboundChannelAdapterParser.java @@ -18,15 +18,12 @@ package org.springframework.integration.twitter.config; import static org.springframework.integration.twitter.config.TwitterNamespaceHandler.BASE_PACKAGE; -import org.springframework.beans.factory.config.BeanDefinition; +import org.w3c.dom.Element; + import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractOutboundChannelAdapterParser; -import org.springframework.util.StringUtils; - -import org.w3c.dom.Element; /** * Parser for all outbound Twitter adapters @@ -42,12 +39,6 @@ public class TwitterOutboundChannelAdapterParser extends AbstractOutboundChannel String className = determineClassName(element, parserContext); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(className); builder.addConstructorArgReference(element.getAttribute("twitter-template")); - String targetUserExpression = element.getAttribute("target-user-expression"); - if (StringUtils.hasText(targetUserExpression)){ - BeanDefinition expressionDef = new RootBeanDefinition("org.springframework.integration.config.ExpressionFactoryBean"); - expressionDef.getConstructorArgumentValues().addGenericArgumentValue(targetUserExpression); - builder.addPropertyValue("targetUserExpression", expressionDef); - } return builder.getBeanDefinition(); } @@ -64,7 +55,6 @@ public class TwitterOutboundChannelAdapterParser extends AbstractOutboundChannel else { parserContext.getReaderContext().error("element '" + elementName + "' is not supported by this parser.", element); } - return className; } diff --git a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandler.java b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandler.java index 9915210574..14296b7edb 100644 --- a/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandler.java +++ b/spring-integration-twitter/src/main/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandler.java @@ -16,14 +16,6 @@ package org.springframework.integration.twitter.outbound; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.context.expression.BeanFactoryResolver; -import org.springframework.core.convert.ConversionService; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.expression.spel.support.StandardTypeConverter; import org.springframework.integration.Message; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.twitter.core.TwitterHeaders; @@ -40,18 +32,8 @@ import org.springframework.util.Assert; */ public class DirectMessageSendingMessageHandler extends AbstractMessageHandler { - private static final ExpressionParser PARSER = new SpelExpressionParser(); - - private static final Expression DEFAULT_TARGET_USER_EXPRESSION = PARSER.parseExpression( - "headers[T(org.springframework.integration.twitter.core.TwitterHeaders).DM_TARGET_USER_ID]"); - - private final TwitterOperations twitterOperations; - private final StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); - - private volatile Expression targetUserExpression = DEFAULT_TARGET_USER_EXPRESSION; - public DirectMessageSendingMessageHandler(TwitterOperations twitterOperations) { Assert.notNull(twitterOperations, "twitterOperations must not be null"); @@ -59,31 +41,14 @@ public class DirectMessageSendingMessageHandler extends AbstractMessageHandler { } - public void setTargetUserExpression(Expression targetUserExpression) { - this.targetUserExpression = (targetUserExpression != null) ? targetUserExpression : DEFAULT_TARGET_USER_EXPRESSION; - } - - @Override - public void onInit() throws Exception { - super.onInit(); - BeanFactory beanFactory = this.getBeanFactory(); - if (beanFactory != null) { - this.evaluationContext.setBeanResolver(new BeanFactoryResolver(beanFactory)); - } - ConversionService conversionService = this.getConversionService(); - if (conversionService != null) { - this.evaluationContext.setTypeConverter(new StandardTypeConverter(conversionService)); - } - } - @Override protected void handleMessageInternal(Message message) throws Exception { Assert.isTrue(message.getPayload() instanceof String, "Only payload of type String is supported. " + "Consider adding a transformer to the message flow in front of this adapter."); - Object toUser = this.targetUserExpression.getValue(this.evaluationContext, message); + Object toUser = message.getHeaders().get(TwitterHeaders.DM_TARGET_USER_ID); Assert.isTrue(toUser instanceof String || toUser instanceof Integer, "the header '" + TwitterHeaders.DM_TARGET_USER_ID + - "' must be either a String (a screenname) or an int (a user ID)"); + "' must contain either a String (a screenname) or an int (a user ID)"); String payload = (String) message.getPayload(); if (toUser instanceof Integer) { this.twitterOperations.sendDirectMessage((Integer) toUser, payload); 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 7f0ae7e17b..1632a97cde 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 @@ -94,15 +94,7 @@ - - - - - Allows you to provide a valid SpEL Expression which will compute the target userid. - - - - + diff --git a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParser-context.xml b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParser-context.xml index 178d6c69cb..60770f1eaf 100644 --- a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParser-context.xml +++ b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParser-context.xml @@ -26,8 +26,7 @@ + channel="inputChannel"/> diff --git a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParserTests.java b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParserTests.java index 213fa1f819..363f2dcc99 100644 --- a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParserTests.java +++ b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/config/TestSendingMessageHandlerParserTests.java @@ -16,13 +16,12 @@ package org.springframework.integration.twitter.config; -import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.expression.Expression; import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.twitter.outbound.DirectMessageSendingMessageHandler; @@ -37,10 +36,8 @@ public class TestSendingMessageHandlerParserTests { public void testSendingMessageHandlerSuccessfulBootstrap(){ ApplicationContext ac = new ClassPathXmlApplicationContext("TestSendingMessageHandlerParser-context.xml", this.getClass()); EventDrivenConsumer dmAdapter = ac.getBean("dmAdapter", EventDrivenConsumer.class); - DirectMessageSendingMessageHandler handler = - (DirectMessageSendingMessageHandler) TestUtils.getPropertyValue(dmAdapter, "handler"); - Expression targetUserExpression = (Expression) TestUtils.getPropertyValue(handler, "targetUserExpression"); - assertEquals("'z' + '_oleg'", targetUserExpression.getExpressionString()); + Object handler = TestUtils.getPropertyValue(dmAdapter, "handler"); + assertEquals(DirectMessageSendingMessageHandler.class, handler.getClass()); } } diff --git a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandlerTests.java b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandlerTests.java index 4453a9770c..7d06d1e722 100644 --- a/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandlerTests.java +++ b/spring-integration-twitter/src/test/java/org/springframework/integration/twitter/outbound/DirectMessageSendingMessageHandlerTests.java @@ -23,7 +23,6 @@ import static org.mockito.Mockito.verify; import org.junit.Test; import org.springframework.integration.Message; -import org.springframework.integration.config.ExpressionFactoryBean; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.twitter.core.TwitterHeaders; import org.springframework.integration.twitter.core.TwitterOperations; @@ -50,16 +49,4 @@ public class DirectMessageSendingMessageHandlerTests { verify(twitter, times(1)).sendDirectMessage(123, "hello"); } - @Test - public void validateSendDirectMessageWithTargetUserExpression() throws Exception{ - Message message1 = MessageBuilder.withPayload("z").build(); - DirectMessageSendingMessageHandler handler = new DirectMessageSendingMessageHandler(twitter); - ExpressionFactoryBean efb = new ExpressionFactoryBean("payload + '_oleg'"); - efb.afterPropertiesSet(); - handler.setTargetUserExpression(efb.getObject()); - handler.afterPropertiesSet(); - handler.handleMessage(message1); - verify(twitter, times(1)).sendDirectMessage("z_oleg", "z"); - } - }