polishing INT-2235

This commit is contained in:
Mark Fisher
2011-11-22 14:51:39 -05:00
parent 72c8fff421
commit 123ba64d2b
4 changed files with 26 additions and 30 deletions

View File

@@ -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");

View File

@@ -40,7 +40,7 @@ import org.springframework.util.ObjectUtils;
* @author Mark Fisher
* @since 2.1
*/
public class ResourceMessageSource extends AbstractMessageSource<Resource[]> implements ApplicationContextAware, InitializingBean {
public class ResourceRetrievingMessageSource extends AbstractMessageSource<Resource[]> implements ApplicationContextAware, InitializingBean {
private final String pattern;
@@ -51,7 +51,7 @@ public class ResourceMessageSource extends AbstractMessageSource<Resource[]> imp
private volatile CollectionFilter<Resource> 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<Resource[]> 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<Resource> 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;

View File

@@ -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<Resource[]> message = (Message<Resource[]>) resultChannel.receive(1000);
assertNotNull(message);
message = (Message<Resource[]>) resultChannel.receive(1000);
assertNull(message);
assertTrue(customFilter.invoked);
}
public static class OneItemAndNeverAgainResourceListFilter implements CollectionFilter<Resource> {
public static class TestCollectionFilter implements CollectionFilter<Resource> {
private volatile boolean invoked = false;
private volatile boolean once = false;
public Collection<Resource> filter(Collection<Resource> unfilteredResources) {
if (!once && !CollectionUtils.isEmpty(unfilteredResources)) {
once = true;
return Collections.singletonList(unfilteredResources.iterator().next());
}
return null;
this.invoked = true;
return unfilteredResources;
}
}

View File

@@ -7,12 +7,12 @@
<int:resource-inbound-channel-adapter id="resourceAdapterDefault" channel="resultChannel"
pattern="file:#{T(java.lang.System).getProperty('java.io.tmpdir') + 'testUsage*'}"
filter="rlFilter" auto-startup="true">
pattern="file:#{T(java.lang.System).getProperty('java.io.tmpdir') + '/testUsage*'}"
filter="customFilter" auto-startup="false">
<int:poller fixed-rate="500"/>
</int:resource-inbound-channel-adapter>
<bean id="rlFilter" class="org.springframework.integration.resource.ResourceInboundChannelAdapterParserTests.OneItemAndNeverAgainResourceListFilter"/>
<bean id="customFilter" class="org.springframework.integration.resource.ResourceInboundChannelAdapterParserTests.TestCollectionFilter"/>
<int:channel id="resultChannel">
<int:queue/>