From b6467e1329d812b38789bfe105940ade1ab6bd7e Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 9 Oct 2015 10:57:39 -0400 Subject: [PATCH] INT-3849: Fix File Inbound Adapter Regression JIRA: https://jira.spring.io/browse/INT-3849 A file inbound adapter with just a `filter` attribute (no implied filter attributes) did not get its filter injected. The parser took an early exit from the filter configuration if none of the implied filter attributes were specified. Work around is to explicitly set `ignore-hidden="true"`. --- .../FileInboundChannelAdapterParser.java | 11 ++++--- ...boundChannelAdapterParserTests-context.xml | 7 ++++ .../FileInboundChannelAdapterParserTests.java | 33 +++++++++++++++++-- 3 files changed, 44 insertions(+), 7 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 0a6383ae3b..f4965cb4b4 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 @@ -84,23 +84,26 @@ public class FileInboundChannelAdapterParser extends AbstractPollingInboundChann String filenameRegex = element.getAttribute("filename-regex"); String preventDuplicates = element.getAttribute("prevent-duplicates"); String ignoreHidden = element.getAttribute("ignore-hidden"); - if (!StringUtils.hasText(filenamePattern) && !StringUtils.hasText(filenameRegex) + String filter = element.getAttribute("filter"); + if (!StringUtils.hasText(filter) && !StringUtils.hasText(filenamePattern) && !StringUtils.hasText(filenameRegex) && !StringUtils.hasText(preventDuplicates) && !StringUtils.hasText(ignoreHidden)) { return null; } BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition(FileListFilterFactoryBean.class); factoryBeanBuilder.setRole(BeanDefinition.ROLE_SUPPORT); - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(factoryBeanBuilder, element, "filter"); + if (StringUtils.hasText(filter)) { + factoryBeanBuilder.addPropertyReference("filter", filter); + } if (StringUtils.hasText(filenamePattern)) { - if (element.hasAttribute("filter")) { + if (StringUtils.hasText(filter)) { parserContext.getReaderContext().error( "At most one of 'filter' and 'filename-pattern' may be provided.", element); } factoryBeanBuilder.addPropertyValue("filenamePattern", filenamePattern); } if (StringUtils.hasText(filenameRegex)) { - if (element.hasAttribute("filter")) { + if (StringUtils.hasText(filter)) { parserContext.getReaderContext().error( "At most one of 'filter' and 'filename-regex' may be provided.", element); } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests-context.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests-context.xml index 6e6342374d..625c973903 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests-context.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests-context.xml @@ -21,6 +21,13 @@ + + + + diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests.java index 5218b7a682..7d5547dd3c 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterParserTests.java @@ -16,24 +16,34 @@ package org.springframework.integration.file.config; +import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.Comparator; +import java.util.Iterator; +import java.util.Set; import java.util.concurrent.PriorityBlockingQueue; import org.junit.Before; 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.file.DefaultDirectoryScanner; import org.springframework.integration.file.FileReadingMessageSource; import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.IgnoreHiddenFileListFilter; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -45,28 +55,44 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; */ @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) +@DirtiesContext public class FileInboundChannelAdapterParserTests { @Autowired(required = true) private ApplicationContext context; @Autowired - private FileReadingMessageSource source; + @Qualifier("inputDirPoller.adapter.source") + private FileReadingMessageSource inputDirPollerSource; + + @Autowired + @Qualifier("inboundWithJustFilter.adapter.source") + private FileReadingMessageSource inboundWithJustFilterSource; + + @Autowired + private FileListFilter filter; private DirectFieldAccessor accessor; @Before public void init() { - accessor = new DirectFieldAccessor(source); + accessor = new DirectFieldAccessor(inputDirPollerSource); } @Test public void channelName() throws Exception { - context.getBean("inputDirPoller"); AbstractMessageChannel channel = context.getBean("inputDirPoller", AbstractMessageChannel.class); assertEquals("Channel should be available under specified id", "inputDirPoller", channel.getComponentName()); } + @Test + public void justFilter() throws Exception { + Iterator filterIterator = TestUtils + .getPropertyValue(this.inboundWithJustFilterSource, "scanner.filter.fileFilters", Set.class).iterator(); + assertThat(filterIterator.next(), instanceOf(IgnoreHiddenFileListFilter.class)); + assertSame(this.filter, filterIterator.next()); + } + @Test public void inputDirectory() { File expected = new File(System.getProperty("java.io.tmpdir")); @@ -103,6 +129,7 @@ public class FileInboundChannelAdapterParserTests { static class TestComparator implements Comparator { + @Override public int compare(File f1, File f2) { return 0; }