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