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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user