From 123ba64d2bb9b51ac302dda66ec95794b7b998a5 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Tue, 22 Nov 2011 14:51:39 -0500 Subject: [PATCH] polishing INT-2235 --- .../ResourceInboundChannelAdapterParser.java | 4 +-- ...a => ResourceRetrievingMessageSource.java} | 11 +++--- ...ourceInboundChannelAdapterParserTests.java | 35 ++++++++----------- ...ResourcePatternResolver-config-usagerf.xml | 6 ++-- 4 files changed, 26 insertions(+), 30 deletions(-) rename spring-integration-core/src/main/java/org/springframework/integration/resource/{ResourceMessageSource.java => ResourceRetrievingMessageSource.java} (88%) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ResourceInboundChannelAdapterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ResourceInboundChannelAdapterParser.java index 9284805970..7945013557 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ResourceInboundChannelAdapterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/ResourceInboundChannelAdapterParser.java @@ -19,7 +19,7 @@ package org.springframework.integration.config.xml; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.integration.resource.ResourceMessageSource; +import org.springframework.integration.resource.ResourceRetrievingMessageSource; import org.w3c.dom.Element; /** @@ -33,7 +33,7 @@ public class ResourceInboundChannelAdapterParser extends AbstractPollingInboundC @Override protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) { - BeanDefinitionBuilder sourceBuilder = BeanDefinitionBuilder.genericBeanDefinition(ResourceMessageSource.class); + BeanDefinitionBuilder sourceBuilder = BeanDefinitionBuilder.genericBeanDefinition(ResourceRetrievingMessageSource.class); sourceBuilder.addConstructorArgValue(element.getAttribute("pattern")); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(sourceBuilder, element, "pattern-resolver"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(sourceBuilder, element, "filter"); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceMessageSource.java b/spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceRetrievingMessageSource.java similarity index 88% rename from spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceMessageSource.java rename to spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceRetrievingMessageSource.java index 7b104b7ca5..47fae1d0f5 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceMessageSource.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/resource/ResourceRetrievingMessageSource.java @@ -40,7 +40,7 @@ import org.springframework.util.ObjectUtils; * @author Mark Fisher * @since 2.1 */ -public class ResourceMessageSource extends AbstractMessageSource implements ApplicationContextAware, InitializingBean { +public class ResourceRetrievingMessageSource extends AbstractMessageSource implements ApplicationContextAware, InitializingBean { private final String pattern; @@ -51,7 +51,7 @@ public class ResourceMessageSource extends AbstractMessageSource imp private volatile CollectionFilter filter; - public ResourceMessageSource(String pattern) { + public ResourceRetrievingMessageSource(String pattern) { Assert.hasText(pattern, "pattern must not be empty"); this.pattern = pattern; } @@ -82,13 +82,16 @@ public class ResourceMessageSource extends AbstractMessageSource imp protected Resource[] doReceive() { try { Resource[] resources = this.patternResolver.getResources(this.pattern); - if (this.filter != null && !ObjectUtils.isEmpty(resources)) { + if (ObjectUtils.isEmpty(resources)) { + resources = null; + } + else if (this.filter != null) { Collection filteredResources = this.filter.filter(Arrays.asList(resources)); if (CollectionUtils.isEmpty(filteredResources)) { resources = null; } else { - resources = filteredResources.toArray(new Resource[0]); + resources = filteredResources.toArray(new Resource[filteredResources.size()]); } } return resources; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourceInboundChannelAdapterParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourceInboundChannelAdapterParserTests.java index 2af6712e9a..bb3028fe6d 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourceInboundChannelAdapterParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourceInboundChannelAdapterParserTests.java @@ -19,12 +19,10 @@ package org.springframework.integration.resource; 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.assertTrue; import java.io.File; import java.util.Collection; -import java.util.Collections; import org.junit.Test; @@ -37,7 +35,6 @@ import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.endpoint.SourcePollingChannelAdapter; import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.util.CollectionFilter; -import org.springframework.util.CollectionUtils; /** * @author Oleg Zhurakousky @@ -49,7 +46,7 @@ public class ResourceInboundChannelAdapterParserTests { public void testDefaultConfig(){ ApplicationContext context = new ClassPathXmlApplicationContext("ResourcePatternResolver-config.xml", this.getClass()); SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault", SourcePollingChannelAdapter.class); - ResourceMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceMessageSource.class); + ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceRetrievingMessageSource.class); assertNotNull(source); boolean autoStartup = TestUtils.getPropertyValue(resourceAdapter, "autoStartup", Boolean.class); assertFalse(autoStartup); @@ -67,7 +64,7 @@ public class ResourceInboundChannelAdapterParserTests { public void testCustomPatternResolver(){ ApplicationContext context = new ClassPathXmlApplicationContext("ResourcePatternResolver-config-custom.xml", this.getClass()); SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault", SourcePollingChannelAdapter.class); - ResourceMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceMessageSource.class); + ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceRetrievingMessageSource.class); assertNotNull(source); assertEquals(context.getBean("customResolver"), TestUtils.getPropertyValue(source, "patternResolver")); } @@ -105,31 +102,27 @@ public class ResourceInboundChannelAdapterParserTests { ApplicationContext context = new ClassPathXmlApplicationContext("ResourcePatternResolver-config-usagerf.xml", this.getClass()); SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault", SourcePollingChannelAdapter.class); - ResourceMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceMessageSource.class); + ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source", ResourceRetrievingMessageSource.class); assertNotNull(source); - assertEquals(context.getBean("rlFilter"), TestUtils.getPropertyValue(source, "filter")); - + TestCollectionFilter customFilter = context.getBean("customFilter", TestCollectionFilter.class); + assertEquals(customFilter, TestUtils.getPropertyValue(source, "filter")); + + assertFalse(customFilter.invoked); + resourceAdapter.start(); QueueChannel resultChannel = context.getBean("resultChannel", QueueChannel.class); - Message message = (Message) resultChannel.receive(1000); assertNotNull(message); - - message = (Message) resultChannel.receive(1000); - assertNull(message); - + assertTrue(customFilter.invoked); } - public static class OneItemAndNeverAgainResourceListFilter implements CollectionFilter { + public static class TestCollectionFilter implements CollectionFilter { + + private volatile boolean invoked = false; - private volatile boolean once = false; - public Collection filter(Collection unfilteredResources) { - if (!once && !CollectionUtils.isEmpty(unfilteredResources)) { - once = true; - return Collections.singletonList(unfilteredResources.iterator().next()); - } - return null; + this.invoked = true; + return unfilteredResources; } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourcePatternResolver-config-usagerf.xml b/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourcePatternResolver-config-usagerf.xml index 3c71c30647..1e32093fc7 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourcePatternResolver-config-usagerf.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/resource/ResourcePatternResolver-config-usagerf.xml @@ -7,12 +7,12 @@ + pattern="file:#{T(java.lang.System).getProperty('java.io.tmpdir') + '/testUsage*'}" + filter="customFilter" auto-startup="false"> - +