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:
Mark Fisher
2010-11-13 10:26:48 -05:00
parent afa88f8502
commit 352f5f5f73
9 changed files with 62 additions and 96 deletions

View File

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

View File

@@ -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) {

View File

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

View File

@@ -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>

View File

@@ -52,8 +52,9 @@ public class FileReadingMessageSourceIntegrationTests {
@AfterClass
public static void cleanUp() throws Throwable {
if(inputDir.exists())
if(inputDir.exists()) {
inputDir.delete();
}
}
@BeforeClass

View File

@@ -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"/>

View File

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

View File

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

View File

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