diff --git a/spring-integration-core/src/main/java/org/springframework/integration/filter/MessageFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/filter/MessageFilter.java index 089b2e797c..35d38dcc39 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/filter/MessageFilter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/filter/MessageFilter.java @@ -111,7 +111,7 @@ public class MessageFilter extends AbstractReplyProducingPostProcessingMessageHa if (this.selector instanceof AbstractMessageProcessingSelector) { ((AbstractMessageProcessingSelector) this.selector).setConversionService(this.getConversionService()); } - if (this.selector instanceof BeanFactoryAware) { + if (this.selector instanceof BeanFactoryAware && this.getBeanFactory() != null) { ((BeanFactoryAware) this.selector).setBeanFactory(this.getBeanFactory()); } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java index f49d17b759..c91b711299 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -18,9 +18,10 @@ package org.springframework.integration.handler; import java.lang.reflect.Method; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandlingException; -import org.springframework.integration.annotation.ServiceActivator; /** * @author Mark Fisher @@ -59,6 +60,9 @@ public class ServiceActivatingHandler extends AbstractReplyProducingMessageHandl if (processor instanceof AbstractMessageProcessor) { ((AbstractMessageProcessor) this.processor).setConversionService(this.getConversionService()); } + if (this.processor instanceof BeanFactoryAware && this.getBeanFactory() != null) { + ((BeanFactoryAware) this.processor).setBeanFactory(this.getBeanFactory()); + } } @Override diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java index 0af9afc5cb..f5ec81462f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java @@ -49,7 +49,7 @@ class AbstractMessageProcessingRouter extends AbstractMappingMessageRouter { if (this.messageProcessor instanceof AbstractMessageProcessor) { ((AbstractMessageProcessor) this.messageProcessor).setConversionService(this.getConversionService()); } - if (this.messageProcessor instanceof BeanFactoryAware) { + if (this.messageProcessor instanceof BeanFactoryAware && this.getBeanFactory() != null) { ((BeanFactoryAware) this.messageProcessor).setBeanFactory(this.getBeanFactory()); } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageProcessingSplitter.java b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageProcessingSplitter.java index 5150192d43..bce1d9202c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageProcessingSplitter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/splitter/AbstractMessageProcessingSplitter.java @@ -48,7 +48,7 @@ abstract class AbstractMessageProcessingSplitter extends AbstractMessageSplitter if (conversionService != null && this.messageProcessor instanceof AbstractMessageProcessor) { ((AbstractMessageProcessor) this.messageProcessor).setConversionService(conversionService); } - if (this.messageProcessor instanceof BeanFactoryAware) { + if (this.messageProcessor instanceof BeanFactoryAware && this.getBeanFactory() != null) { ((BeanFactoryAware) this.messageProcessor).setBeanFactory(this.getBeanFactory()); } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/ContentEnricher.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/ContentEnricher.java index 737083cd33..54bd42d820 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/ContentEnricher.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/ContentEnricher.java @@ -20,6 +20,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.context.Lifecycle; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; @@ -264,6 +265,14 @@ public class ContentEnricher extends AbstractReplyProducingMessageHandler implem targetContext.setBeanResolver(null); this.targetEvaluationContext = targetContext; + if (this.getBeanFactory() != null) { + for (HeaderValueMessageProcessor headerValueMessageProcessor : headerExpressions.values()) { + if (headerValueMessageProcessor instanceof BeanFactoryAware) { + ((BeanFactoryAware) headerValueMessageProcessor).setBeanFactory(this.getBeanFactory()); + } + } + } + } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java index d5b084aa57..fc73847c9d 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.integration.context.IntegrationObjectSupport; @@ -153,11 +154,17 @@ public class HeaderEnricher extends IntegrationObjectSupport implements Transfor public void onInit() throws Exception { boolean shouldOverwrite = this.defaultOverwrite; for (HeaderValueMessageProcessor processor : this.headersToAdd.values()) { + if (processor instanceof BeanFactoryAware && this.getBeanFactory() != null) { + ((BeanFactoryAware) processor).setBeanFactory(this.getBeanFactory()); + } Boolean processerOverwrite = processor.isOverwrite(); if (processerOverwrite != null) { shouldOverwrite |= processerOverwrite; } } + if (this.messageProcessor != null && this.messageProcessor instanceof BeanFactoryAware && this.getBeanFactory() != null) { + ((BeanFactoryAware) this.messageProcessor).setBeanFactory(this.getBeanFactory()); + } if (!shouldOverwrite && !this.shouldSkipNulls) { logger.warn(this.getComponentName() + " is configured to not overwrite existing headers. 'shouldSkipNulls = false' will have no effect"); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/AbstractExpressionEvaluator.java b/spring-integration-core/src/main/java/org/springframework/integration/util/AbstractExpressionEvaluator.java index 50e8260091..fbc1795c85 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/AbstractExpressionEvaluator.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/AbstractExpressionEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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 @@ -113,9 +113,7 @@ public abstract class AbstractExpressionEvaluator implements BeanFactoryAware, I else { this.evaluationContext = ExpressionUtils.createStandardEvaluationContext(this.beanFactory); } - if (this.typeConverter != null) { - this.evaluationContext.setTypeConverter(this.typeConverter); - } + this.evaluationContext.setTypeConverter(this.typeConverter); } return this.evaluationContext; } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/endpoint/ServiceActivatorEndpointTests.java b/spring-integration-core/src/test/java/org/springframework/integration/endpoint/ServiceActivatorEndpointTests.java index 49fc4a050a..f7a66d4bc7 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/endpoint/ServiceActivatorEndpointTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/endpoint/ServiceActivatorEndpointTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2014 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. @@ -20,21 +20,27 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import org.junit.Test; +import org.mockito.Mockito; + +import org.springframework.beans.factory.BeanFactory; import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.channel.TestChannelResolver; import org.springframework.integration.handler.ReplyRequiredException; import org.springframework.integration.handler.ServiceActivatingHandler; -import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; +import org.springframework.messaging.support.GenericMessage; /** * @author Mark Fisher * @author Marius Bogoevici + * @author Artem Bilan */ public class ServiceActivatorEndpointTests { @@ -200,6 +206,17 @@ public class ServiceActivatorEndpointTests { assertEquals("ABC-123", correlationId); } + @Test + public void testBeanFactoryPopulation() { + ServiceActivatingHandler endpoint = this.createEndpoint(); + BeanFactory mock = Mockito.mock(BeanFactory.class); + endpoint.setBeanFactory(mock); + endpoint.afterPropertiesSet(); + Object beanFactory = TestUtils.getPropertyValue(endpoint, "processor.beanFactory"); + assertNotNull(beanFactory); + assertSame(mock, beanFactory); + } + private ServiceActivatingHandler createEndpoint() { return new ServiceActivatingHandler(new TestBean(), "handle"); diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java index b8482910b2..579483eab2 100644 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java +++ b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java @@ -16,14 +16,6 @@ package org.springframework.integration.groovy; -import groovy.lang.Binding; -import groovy.lang.GString; -import groovy.lang.GroovyClassLoader; -import groovy.lang.GroovyObject; -import groovy.lang.MetaClass; -import groovy.lang.MissingPropertyException; -import groovy.lang.Script; - import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -41,6 +33,14 @@ import org.springframework.scripting.groovy.GroovyObjectCustomizer; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import groovy.lang.Binding; +import groovy.lang.GString; +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyObject; +import groovy.lang.MetaClass; +import groovy.lang.MissingPropertyException; +import groovy.lang.Script; + /** * The {@link org.springframework.integration.handler.MessageProcessor} implementation * to evaluate Groovy scripts. @@ -97,14 +97,14 @@ public class GroovyScriptExecutingMessageProcessor extends AbstractScriptExecuti @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { super.setBeanFactory(beanFactory); - if (beanFactory instanceof ConfigurableListableBeanFactory) { + if (beanFactory != null && beanFactory instanceof ConfigurableListableBeanFactory) { ((ConfigurableListableBeanFactory) beanFactory).ignoreDependencyType(MetaClass.class); } } /** * Sets a {@link GroovyObjectCustomizer} for this processor. - * + * * @param customizer The customizer. */ public void setCustomizer(GroovyObjectCustomizer customizer) { diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XPathHeaderEnricherParser.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XPathHeaderEnricherParser.java index dd2591abe0..f54838aa46 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XPathHeaderEnricherParser.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XPathHeaderEnricherParser.java @@ -23,7 +23,6 @@ import org.w3c.dom.NodeList; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.config.IntegrationConfigUtils; import org.springframework.integration.config.xml.AbstractTransformerParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.integration.xml.transformer.XPathHeaderEnricher; @@ -61,8 +60,8 @@ public class XPathHeaderEnricherParser extends AbstractTransformerParser { Element headerElement = (Element) node; String elementName = node.getLocalName(); if ("header".equals(elementName)) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(IntegrationConfigUtils.BASE_PACKAGE - + ".xml.transformer.XPathHeaderEnricher$XPathExpressionEvaluatingHeaderValueMessageProcessor"); + BeanDefinitionBuilder builder = + BeanDefinitionBuilder.genericBeanDefinition(XPathHeaderEnricher.XPathExpressionEvaluatingHeaderValueMessageProcessor.class); String expressionString = headerElement.getAttribute("xpath-expression"); String expressionRef = headerElement.getAttribute("xpath-expression-ref"); boolean isExpressionString = StringUtils.hasText(expressionString); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XPathHeaderEnricher.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XPathHeaderEnricher.java index a848150611..53aa553741 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XPathHeaderEnricher.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XPathHeaderEnricher.java @@ -25,11 +25,10 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; -import org.springframework.expression.TypeConverter; -import org.springframework.expression.spel.support.StandardTypeConverter; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.transformer.HeaderEnricher; import org.springframework.integration.transformer.support.HeaderValueMessageProcessor; +import org.springframework.integration.util.BeanFactoryTypeConverter; import org.springframework.integration.xml.DefaultXmlPayloadConverter; import org.springframework.integration.xml.XmlPayloadConverter; import org.springframework.integration.xml.xpath.XPathEvaluationType; @@ -61,15 +60,15 @@ public class XPathHeaderEnricher extends HeaderEnricher { } - static class XPathExpressionEvaluatingHeaderValueMessageProcessor implements HeaderValueMessageProcessor, + public static class XPathExpressionEvaluatingHeaderValueMessageProcessor implements HeaderValueMessageProcessor, BeanFactoryAware { - private TypeConverter typeConverter = new StandardTypeConverter(); + private static final XmlPayloadConverter converter = new DefaultXmlPayloadConverter(); + + private final BeanFactoryTypeConverter typeConverter = new BeanFactoryTypeConverter(); private final XPathExpression expression; - private volatile XmlPayloadConverter converter = new DefaultXmlPayloadConverter(); - private volatile XPathEvaluationType evaluationType = XPathEvaluationType.STRING_RESULT; private volatile TypeDescriptor headerTypeDescriptor; @@ -109,7 +108,7 @@ public class XPathHeaderEnricher extends HeaderEnricher { public void setBeanFactory(BeanFactory beanFactory) throws BeansException { ConversionService conversionService = IntegrationContextUtils.getConversionService(beanFactory); if (conversionService != null) { - this.typeConverter = new StandardTypeConverter(conversionService); + this.typeConverter.setConversionService(conversionService); } } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XPathHeaderEnricherTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XPathHeaderEnricherTests.java index 43fd1229f1..b8d336a0ad 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XPathHeaderEnricherTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XPathHeaderEnricherTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 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. @@ -22,19 +22,20 @@ import static org.junit.Assert.assertNull; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import org.junit.Test; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; import org.springframework.integration.support.MessageBuilder; -import org.springframework.integration.xml.transformer.XPathHeaderEnricher; import org.springframework.integration.xml.transformer.XPathHeaderEnricher.XPathExpressionEvaluatingHeaderValueMessageProcessor; import org.springframework.integration.xml.xpath.XPathEvaluationType; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; /** * @author Jonas Partner * @author David Turanski + * @author Gary Russell * @since 2.0 */ public class XPathHeaderEnricherTests { @@ -53,6 +54,21 @@ public class XPathHeaderEnricherTests { assertEquals("Wrong value for element two expression", "2", headers.get("two")); } + @Test + public void convertedEvaluation() { + Map expressionMap = + new HashMap(); + XPathExpressionEvaluatingHeaderValueMessageProcessor processor = new XPathExpressionEvaluatingHeaderValueMessageProcessor( + "/root/elementOne"); + processor.setHeaderType(TimeZone.class); + expressionMap.put("one", processor); + String docAsString = "America/New_York"; + XPathHeaderEnricher enricher = new XPathHeaderEnricher(expressionMap); + Message result = enricher.transform(MessageBuilder.withPayload(docAsString).build()); + MessageHeaders headers = result.getHeaders(); + assertEquals("Wrong value for element one expression", TimeZone.getTimeZone("America/New_York"), headers.get("one")); + } + @Test public void nullValuesSkippedByDefault() { Map expressionMap