From 352f5f5f73f73f670a9a28d195ecd9651a2918a5 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Sat, 13 Nov 2010 10:26:48 -0500 Subject: [PATCH] Fixed issue with generics in List vs. array within CompositeFileListFilter's filterFiles() method. Also removed unnecessary 'filterReferences' option on FileListFilterFactoryBean (can use CompositeFileListFilter for that). The 'filterReference' property is now just 'filter', and the factory's product is now called 'result'. --- .../FileInboundChannelAdapterParser.java | 11 ++--- .../config/FileListFilterFactoryBean.java | 45 +++++++------------ .../file/filters/CompositeFileListFilter.java | 19 +++++--- ...gMessageSourceIntegrationTests-context.xml | 15 +------ ...eReadingMessageSourceIntegrationTests.java | 3 +- .../FileToChannelIntegrationTests-context.xml | 14 ++---- .../integration/file/TestFileListFilter.java | 7 +-- ...nelAdapterWithRegexPatternParserTests.java | 36 +++++++-------- .../FileListFilterFactoryBeanTests.java | 8 ++-- 9 files changed, 62 insertions(+), 96 deletions(-) diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileInboundChannelAdapterParser.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileInboundChannelAdapterParser.java index 37002df4da..ccd75a6d53 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileInboundChannelAdapterParser.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileInboundChannelAdapterParser.java @@ -82,14 +82,10 @@ public class FileInboundChannelAdapterParser extends AbstractPollingInboundChann BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition( PACKAGE_NAME + ".config.FileListFilterFactoryBean"); factoryBeanBuilder.setRole(BeanDefinition.ROLE_SUPPORT); - String filter = element.getAttribute("filter"); - if (StringUtils.hasText(filter)) { - factoryBeanBuilder.addPropertyReference("filterReference", filter); - } - + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(factoryBeanBuilder, element, "filter"); String filenamePattern = element.getAttribute("filename-pattern"); if (StringUtils.hasText(filenamePattern)) { - if (StringUtils.hasText(filter)) { + if (element.hasAttribute("filter")) { parserContext.getReaderContext().error( "At most one of 'filter' and 'filename-pattern' may be provided.", element); } @@ -97,13 +93,12 @@ public class FileInboundChannelAdapterParser extends AbstractPollingInboundChann } String filenameRegex = element.getAttribute("filename-regex"); if (StringUtils.hasText(filenameRegex)) { - if (StringUtils.hasText(filter)) { + if (element.hasAttribute("filter")) { parserContext.getReaderContext().error( "At most one of 'filter' and 'filename-regex' may be provided.", element); } factoryBeanBuilder.addPropertyValue("filenameRegex", filenameRegex); } - IntegrationNamespaceUtils.setValueIfAttributeDefined(factoryBeanBuilder, element, "prevent-duplicates"); return BeanDefinitionReaderUtils.registerWithGeneratedName( factoryBeanBuilder.getBeanDefinition(), parserContext.getRegistry()); diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java index 5610362b95..753f6ad854 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java @@ -18,7 +18,6 @@ package org.springframework.integration.file.config; import java.io.File; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import org.springframework.beans.factory.FactoryBean; @@ -30,9 +29,9 @@ import org.springframework.integration.file.filters.*; */ public class FileListFilterFactoryBean implements FactoryBean> { - private volatile FileListFilter fileListFilter; + private volatile FileListFilter result; - private volatile FileListFilter filterReference; + private volatile FileListFilter filter; private volatile String filenamePattern; @@ -42,15 +41,9 @@ public class FileListFilterFactoryBean implements FactoryBean> filterReferences; - - public void setFilterReferences(Collection> filterReferences) { - this.filterReferences = filterReferences; - } - - public void setFilterReference(FileListFilter filterReference) { - this.filterReference = filterReference; + public void setFilter(FileListFilter filter) { + this.filter = filter; } public void setFilenamePattern(String filenamePattern) { @@ -66,39 +59,39 @@ public class FileListFilterFactoryBean implements FactoryBean getObject() throws Exception { - if (this.fileListFilter == null) { + if (this.result == null) { synchronized (this.monitor) { - this.intializeFileListFilter(); + this.initializeFileListFilter(); } } - return this.fileListFilter; + return this.result; } public Class getObjectType() { - return (this.fileListFilter != null) ? this.fileListFilter.getClass() : FileListFilter.class; + return (this.result != null) ? this.result.getClass() : FileListFilter.class; } public boolean isSingleton() { return true; } - private void intializeFileListFilter() { - if (this.fileListFilter != null) { + private void initializeFileListFilter() { + if (this.result != null) { return; } FileListFilter filter; - if ((this.filterReference != null) && (this.filenamePattern != null || this.filenameRegex!=null)) { + if ((this.filter != null) && (this.filenamePattern != null || this.filenameRegex!=null)) { throw new IllegalArgumentException("The 'filter' reference is mutually exclusive with " + "'filename-pattern' and 'filename-regex' attributes."); } //'filter' is set - if (this.filterReference != null) { + if (this.filter != null) { if (Boolean.TRUE.equals(this.preventDuplicates)) { - filter = this.createCompositeWithAcceptOnceFilter(this.filterReference); + filter = this.createCompositeWithAcceptOnceFilter(this.filter); } else { // preventDuplicates is either FALSE or NULL - filter = this.filterReference; + filter = this.filter; } } @@ -131,18 +124,10 @@ public class FileListFilterFactoryBean implements FactoryBean(); } - // finally, it might be that they simply want a {@link CompositeFileListFilter} - if ((this.filterReferences != null) && (this.filterReferences.size() > 0)) { - CompositeFileListFilter compositeFilter = new CompositeFileListFilter(); - for (FileListFilter ff : filterReferences) { - compositeFilter.addFilter(ff); - } - filter = compositeFilter; - } if (filter == null) { filter = new CompositeFileListFilter(); } - this.fileListFilter = filter; + this.result = filter; } private CompositeFileListFilter createCompositeWithAcceptOnceFilter(FileListFilter otherFilter) { diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java index 7fdd1d3e98..4e0026312a 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java @@ -16,11 +16,17 @@ package org.springframework.integration.file.filters; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; -import java.util.*; - /** * Simple {@link FileListFilter} that predicates its matches against any of many * configured {@link FileListFilter}. @@ -80,15 +86,14 @@ public class CompositeFileListFilter implements FileListFilter { } - @SuppressWarnings("unchecked") public List filterFiles(F[] files) { Assert.notNull(files, "'files' should not be null"); - List leftOver = Arrays.asList(files); + List results = new ArrayList(Arrays.asList(files)); for (FileListFilter fileFilter : this.fileFilters) { - F[] fileArray = (F[]) leftOver.toArray(); - leftOver = fileFilter.filterFiles(fileArray); + List currentResults = fileFilter.filterFiles(files); + results.retainAll(currentResults); } - return leftOver; + return results; } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml index b7733e7ecb..65b46cb3b9 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml @@ -11,29 +11,18 @@ p:filter-ref="compositeFilter"/> - + - + - - - - - - - - - - - diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java index 4a2f4f2c3c..8427ea6832 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java @@ -52,8 +52,9 @@ public class FileReadingMessageSourceIntegrationTests { @AfterClass public static void cleanUp() throws Throwable { - if(inputDir.exists()) + if(inputDir.exists()) { inputDir.delete(); + } } @BeforeClass diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileToChannelIntegrationTests-context.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/FileToChannelIntegrationTests-context.xml index 2f22357250..4292c92ee2 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileToChannelIntegrationTests-context.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileToChannelIntegrationTests-context.xml @@ -25,21 +25,15 @@ - - - - + + - - - - - - + + diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java b/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java index 80d3ddedf7..39ce7ffce7 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java @@ -24,11 +24,12 @@ import org.springframework.integration.file.filters.FileListFilter; /** * @author Iwein Fuld + * @author Mark Fisher */ public class TestFileListFilter implements FileListFilter { - public List filterFiles(File[] entries) { - return Arrays.asList(entries); - } + public List filterFiles(File[] entries) { + return Arrays.asList(entries); + } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithRegexPatternParserTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithRegexPatternParserTests.java index 3c9825cf71..861ebaf151 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithRegexPatternParserTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithRegexPatternParserTests.java @@ -16,28 +16,27 @@ package org.springframework.integration.file.config; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.DirectFieldAccessor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.ApplicationContext; -import org.springframework.integration.channel.AbstractMessageChannel; -import org.springframework.integration.endpoint.AbstractEndpoint; -import org.springframework.integration.file.FileReadingMessageSource; -import org.springframework.integration.file.filters.*; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; -import java.io.File; import java.util.Set; import java.util.regex.Pattern; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.*; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.file.FileReadingMessageSource; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.PatternMatchingFileListFilter; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * * @author Mark Fisher * @author Iwein Fuld * @@ -47,9 +46,6 @@ import static org.junit.Assert.*; @RunWith(SpringJUnit4ClassRunner.class) public class FileInboundChannelAdapterWithRegexPatternParserTests { - @Autowired(required = true) - private ApplicationContext context; - private DirectFieldAccessor accessor; @Autowired(required = true) @@ -71,7 +67,7 @@ public class FileInboundChannelAdapterWithRegexPatternParserTests { pattern = (Pattern) new DirectFieldAccessor(filter).getPropertyValue("pattern"); } } - assertNotNull("expected SimplePatternFileListFilterTest", pattern); + assertNotNull("expected PatternMatchingFileListFilter", pattern); assertEquals("^.*\\.txt$", pattern.pattern()); } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java index 84b78df2f8..0812469407 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java @@ -44,7 +44,7 @@ public class FileListFilterFactoryBeanTests { @Test(expected = IllegalArgumentException.class) public void customFilterAndFilenamePatternAreMutuallyExclusive() throws Exception { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); - factory.setFilterReference(new TestFilter()); + factory.setFilter(new TestFilter()); factory.setFilenamePattern("foo"); factory.getObject(); } @@ -53,7 +53,7 @@ public class FileListFilterFactoryBeanTests { public void customFilterAndPreventDuplicatesNull() throws Exception { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); TestFilter testFilter = new TestFilter(); - factory.setFilterReference(testFilter); + factory.setFilter(testFilter); FileListFilter result = factory.getObject(); assertFalse(result instanceof CompositeFileListFilter); assertSame(testFilter, result); @@ -63,7 +63,7 @@ public class FileListFilterFactoryBeanTests { public void customFilterAndPreventDuplicatesTrue() throws Exception { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); TestFilter testFilter = new TestFilter(); - factory.setFilterReference(testFilter); + factory.setFilter(testFilter); factory.setPreventDuplicates(Boolean.TRUE); FileListFilter result = factory.getObject(); assertTrue(result instanceof CompositeFileListFilter); @@ -76,7 +76,7 @@ public class FileListFilterFactoryBeanTests { public void customFilterAndPreventDuplicatesFalse() throws Exception { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); TestFilter testFilter = new TestFilter(); - factory.setFilterReference(testFilter); + factory.setFilter(testFilter); factory.setPreventDuplicates(Boolean.FALSE); FileListFilter result = factory.getObject(); assertFalse(result instanceof CompositeFileListFilter);