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"`.
This commit is contained in:
Gary Russell
2015-10-09 10:57:39 -04:00
parent dd14e6142b
commit b6467e1329
3 changed files with 44 additions and 7 deletions

View File

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

View File

@@ -21,6 +21,13 @@
</integration:poller>
</inbound-channel-adapter>
<inbound-channel-adapter id="inboundWithJustFilter"
directory="${java.io.tmpdir}"
filter="filter"
auto-startup="false">
<integration:poller fixed-rate="5000" />
</inbound-channel-adapter>
<integration:channel id="successChannel" />
<beans:bean id="filter" class="org.springframework.integration.file.config.FileListFilterFactoryBean">

View File

@@ -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<File> 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<File> {
@Override
public int compare(File f1, File f2) {
return 0;
}