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'.
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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<FileListFilter<File>> {
|
||||
|
||||
private volatile FileListFilter<File> fileListFilter;
|
||||
private volatile FileListFilter<File> result;
|
||||
|
||||
private volatile FileListFilter<File> filterReference;
|
||||
private volatile FileListFilter<File> filter;
|
||||
|
||||
private volatile String filenamePattern;
|
||||
|
||||
@@ -42,15 +41,9 @@ public class FileListFilterFactoryBean implements FactoryBean<FileListFilter<Fil
|
||||
|
||||
private final Object monitor = new Object();
|
||||
|
||||
private volatile Collection<FileListFilter<File>> filterReferences;
|
||||
|
||||
|
||||
public void setFilterReferences(Collection<FileListFilter<File>> filterReferences) {
|
||||
this.filterReferences = filterReferences;
|
||||
}
|
||||
|
||||
public void setFilterReference(FileListFilter<File> filterReference) {
|
||||
this.filterReference = filterReference;
|
||||
public void setFilter(FileListFilter<File> filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public void setFilenamePattern(String filenamePattern) {
|
||||
@@ -66,39 +59,39 @@ public class FileListFilterFactoryBean implements FactoryBean<FileListFilter<Fil
|
||||
}
|
||||
|
||||
public FileListFilter<File> 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<File> 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<FileListFilter<Fil
|
||||
filter = new AcceptOnceFileListFilter<File>();
|
||||
}
|
||||
|
||||
// finally, it might be that they simply want a {@link CompositeFileListFilter}
|
||||
if ((this.filterReferences != null) && (this.filterReferences.size() > 0)) {
|
||||
CompositeFileListFilter<File> compositeFilter = new CompositeFileListFilter<File>();
|
||||
for (FileListFilter<File> ff : filterReferences) {
|
||||
compositeFilter.addFilter(ff);
|
||||
}
|
||||
filter = compositeFilter;
|
||||
}
|
||||
if (filter == null) {
|
||||
filter = new CompositeFileListFilter<File>();
|
||||
}
|
||||
this.fileListFilter = filter;
|
||||
this.result = filter;
|
||||
}
|
||||
|
||||
private CompositeFileListFilter<File> createCompositeWithAcceptOnceFilter(FileListFilter<File> otherFilter) {
|
||||
|
||||
@@ -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<F> implements FileListFilter<F> {
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<F> filterFiles(F[] files) {
|
||||
Assert.notNull(files, "'files' should not be null");
|
||||
List<F> leftOver = Arrays.asList(files);
|
||||
List<F> results = new ArrayList<F>(Arrays.asList(files));
|
||||
for (FileListFilter<F> fileFilter : this.fileFilters) {
|
||||
F[] fileArray = (F[]) leftOver.toArray();
|
||||
leftOver = fileFilter.filterFiles(fileArray);
|
||||
List<F> currentResults = fileFilter.filterFiles(files);
|
||||
results.retainAll(currentResults);
|
||||
}
|
||||
return leftOver;
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,29 +11,18 @@
|
||||
p:filter-ref="compositeFilter"/>
|
||||
|
||||
<!-- customized filter -->
|
||||
<bean id="legacyCompositeFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
|
||||
<bean id="compositeFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
|
||||
<constructor-arg>
|
||||
<list>
|
||||
<bean class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/>
|
||||
<bean class="org.springframework.integration.file.TestFileListFilter"/>
|
||||
<bean class="org.springframework.integration.file.filters.PatternMatchingFileListFilter">
|
||||
<bean class="org.springframework.integration.file.filters.SimplePatternFileListFilter">
|
||||
<constructor-arg value="test*"/>
|
||||
</bean>
|
||||
</list>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<!-- is equivalent to previous filter -->
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" id="compositeFilter">
|
||||
<property name="filterReferences">
|
||||
<util:list>
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:preventDuplicates="true"/>
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:preventDuplicates="false"/>
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:filenamePattern="test*"/>
|
||||
</util:list>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -52,8 +52,9 @@ public class FileReadingMessageSourceIntegrationTests {
|
||||
|
||||
@AfterClass
|
||||
public static void cleanUp() throws Throwable {
|
||||
if(inputDir.exists())
|
||||
if(inputDir.exists()) {
|
||||
inputDir.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
|
||||
@@ -25,21 +25,15 @@
|
||||
<si:queue capacity="10"/>
|
||||
</si:channel>
|
||||
|
||||
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" id="compositeFilter">
|
||||
<property name="filterReferences">
|
||||
|
||||
<bean class="org.springframework.integration.file.filters.CompositeFileListFilter" id="compositeFilter">
|
||||
<constructor-arg>
|
||||
<util:list>
|
||||
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:preventDuplicates="true"/>
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:preventDuplicates="false"/>
|
||||
<bean class="org.springframework.integration.file.config.FileListFilterFactoryBean" p:filenamePattern="test*"/>
|
||||
|
||||
</util:list>
|
||||
|
||||
</property>
|
||||
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<si:poller default="true" fixed-rate="10"/>
|
||||
|
||||
|
||||
@@ -24,11 +24,12 @@ import org.springframework.integration.file.filters.FileListFilter;
|
||||
|
||||
/**
|
||||
* @author Iwein Fuld
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class TestFileListFilter implements FileListFilter<File> {
|
||||
|
||||
public List<File> filterFiles(File[] entries) {
|
||||
return Arrays.asList(entries);
|
||||
}
|
||||
public List<File> filterFiles(File[] entries) {
|
||||
return Arrays.asList(entries);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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<File> 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<File> 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<File> result = factory.getObject();
|
||||
assertFalse(result instanceof CompositeFileListFilter);
|
||||
|
||||
Reference in New Issue
Block a user