diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/DefaultDirectoryScanner.java b/spring-integration-file/src/main/java/org/springframework/integration/file/DefaultDirectoryScanner.java index 87b41a67cb..796e3ff1ed 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/DefaultDirectoryScanner.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/DefaultDirectoryScanner.java @@ -21,8 +21,8 @@ import java.util.Arrays; import java.util.List; import org.springframework.integration.MessagingException; -import org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; /** * Default directory scanner and base class for other directory scanners. @@ -33,12 +33,12 @@ import org.springframework.integration.file.entries.EntryListFilter; */ public class DefaultDirectoryScanner implements DirectoryScanner { - private volatile EntryListFilter filter = new AcceptOnceEntryFileListFilter(); + private volatile FileListFilter filter = new AcceptOnceFileListFilter(); private volatile FileLocker locker; - public void setFilter(EntryListFilter filter) { + public void setFilter(FileListFilter filter) { this.filter = filter; } @@ -66,7 +66,7 @@ public class DefaultDirectoryScanner implements DirectoryScanner { throw new MessagingException("The path [" + directory + "] does not denote a properly accessible directory."); } - return (this.filter != null) ? this.filter.filterEntries(files) : Arrays.asList(files); + return (this.filter != null) ? this.filter.filterFiles(files) : Arrays.asList(files); } /** diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/DirectoryScanner.java b/spring-integration-file/src/main/java/org/springframework/integration/file/DirectoryScanner.java index c9090e3277..c327b77d1d 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/DirectoryScanner.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/DirectoryScanner.java @@ -16,11 +16,11 @@ package org.springframework.integration.file; -import org.springframework.integration.file.entries.EntryListFilter; - import java.io.File; import java.util.List; +import org.springframework.integration.file.filters.FileListFilter; + /** * Strategy for scanning directories. Implementations may select all children * and grandchildren of the scanned directory in any order. This interface is @@ -52,7 +52,7 @@ public interface DirectoryScanner { * @param filter * the custom filter to be used */ - void setFilter(EntryListFilter filter); + void setFilter(FileListFilter filter); /** * Sets a custom locker to be used by this scanner. The locker will get a diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/FileReadingMessageSource.java b/spring-integration-file/src/main/java/org/springframework/integration/file/FileReadingMessageSource.java index 89b39b9d8d..9c2591ee97 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/FileReadingMessageSource.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/FileReadingMessageSource.java @@ -31,14 +31,14 @@ import org.springframework.integration.MessagingException; import org.springframework.integration.aggregator.ResequencingMessageGroupProcessor; import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.integration.core.MessageSource; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.support.MessageBuilder; import org.springframework.util.Assert; /** * {@link MessageSource} that creates messages from a file system directory. To * prevent messages for certain files, you may supply a - * {@link org.springframework.integration.file.entries.EntryListFilter}. By + * {@link org.springframework.integration.file.filters.FileListFilter}. By * default, an * {@link org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter} * is used. It ensures files are picked up only once from the directory. @@ -174,22 +174,19 @@ public class FileReadingMessageSource extends IntegrationObjectSupport implement } /** - * Sets a - * {@link org.springframework.integration.file.entries.EntryListFilter}. By - * default a - * {@link org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter} - * with no bounds is used. In most cases a customized - * {@link org.springframework.integration.file.entries.EntryListFilter} will + * Sets a {@link FileListFilter}. By default a + * {@link org.springframework.integration.file.filters.AbstractFileListFilter} + * with no bounds is used. In most cases a customized {@link FileListFilter} will * be needed to deal with modification and duplication concerns. If multiple * filters are required a - * {@link org.springframework.integration.file.entries.CompositeEntryListFilter} + * {@link org.springframework.integration.file.filters.CompositeFileListFilter} * can be used to group them together. *

* The supplied filter must be thread safe.. * * @param filter a filter */ - public void setFilter(EntryListFilter filter) { + public void setFilter(FileListFilter filter) { Assert.notNull(filter, "'filter' must not be null"); this.scanner.setFilter(filter); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/HeadDirectoryScanner.java b/spring-integration-file/src/main/java/org/springframework/integration/file/HeadDirectoryScanner.java index 999a56df71..fbe7d58e1a 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/HeadDirectoryScanner.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/HeadDirectoryScanner.java @@ -16,13 +16,12 @@ package org.springframework.integration.file; -import org.springframework.integration.file.entries.EntryListFilter; - import java.io.File; - import java.util.Arrays; import java.util.List; +import org.springframework.integration.file.filters.FileListFilter; + /** * A custom scanner that only returns the first maxNumberOfFiles * elements from a directory listing. This is useful to limit the number of File @@ -38,7 +37,7 @@ public class HeadDirectoryScanner extends DefaultDirectoryScanner { } - private static class HeadFilter implements EntryListFilter { + private static class HeadFilter implements FileListFilter { private final int maxNumberOfFiles; @@ -46,7 +45,7 @@ public class HeadDirectoryScanner extends DefaultDirectoryScanner { this.maxNumberOfFiles = maxNumberOfFiles; } - public List filterEntries(File[] files) { + public List filterFiles(File[] files) { return Arrays.asList(files).subList(0, Math.min(files.length, maxNumberOfFiles)); } } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java index ebb4b769bd..03d6a7751d 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java @@ -16,22 +16,25 @@ package org.springframework.integration.file.config; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.integration.file.entries.*; -import org.springframework.integration.file.filters.SimplePatternFileListFilter; - import java.io.File; import java.util.Collection; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.integration.file.filters.AcceptAllFileListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.SimplePatternFileListFilter; + /** * @author Mark Fisher * @since 1.0.3 */ -public class FileListFilterFactoryBean implements FactoryBean> { +public class FileListFilterFactoryBean implements FactoryBean> { - private volatile EntryListFilter fileListFilter; + private volatile FileListFilter fileListFilter; - private volatile EntryListFilter filterReference; + private volatile FileListFilter filterReference; private volatile String filenamePattern; @@ -39,14 +42,14 @@ public class FileListFilterFactoryBean implements FactoryBean> filterReferences; + private volatile Collection> filterReferences; - public void setFilterReferences(Collection> filterReferences) { + public void setFilterReferences(Collection> filterReferences) { this.filterReferences = filterReferences; } - public void setFilterReference(EntryListFilter filterReference) { + public void setFilterReference(FileListFilter filterReference) { this.filterReference = filterReference; } @@ -58,7 +61,7 @@ public class FileListFilterFactoryBean implements FactoryBean getObject() throws Exception { + public FileListFilter getObject() throws Exception { if (this.fileListFilter == null) { synchronized (this.monitor) { this.intializeFileListFilter(); @@ -68,7 +71,7 @@ public class FileListFilterFactoryBean implements FactoryBean getObjectType() { - return (this.fileListFilter != null) ? this.fileListFilter.getClass() : EntryListFilter.class; + return (this.fileListFilter != null) ? this.fileListFilter.getClass() : FileListFilter.class; } public boolean isSingleton() { @@ -79,7 +82,7 @@ public class FileListFilterFactoryBean implements FactoryBean filter; + FileListFilter filter; if ((this.filterReference != null) && (this.filenamePattern != null)) { throw new IllegalArgumentException("The 'filter' reference and " + "'filename-pattern' attributes are mutually exclusive."); @@ -103,29 +106,29 @@ public class FileListFilterFactoryBean implements FactoryBean(); + filter = new AcceptAllFileListFilter(); } else { // preventDuplicates is either TRUE or NULL - filter = new AcceptOnceEntryFileListFilter(); + filter = new AcceptOnceFileListFilter(); } - // finally, it might be that they simply want a {@link CompositeEntryListFilter} + // finally, it might be that they simply want a {@link CompositeFileListFilter} if ((this.filterReferences != null) && (this.filterReferences.size() > 0)) { - CompositeEntryListFilter compositeFilter = new CompositeEntryListFilter(); - for (EntryListFilter ff : filterReferences) { + CompositeFileListFilter compositeFilter = new CompositeFileListFilter(); + for (FileListFilter ff : filterReferences) { compositeFilter.addFilter(ff); } filter = compositeFilter; } if (filter == null) { - filter = new CompositeEntryListFilter(); + filter = new CompositeFileListFilter(); } this.fileListFilter = filter; } - private CompositeEntryListFilter createCompositeWithAcceptOnceFilter(EntryListFilter otherFilter) { - CompositeEntryListFilter compositeFilter = new CompositeEntryListFilter(); - compositeFilter.addFilter(new AcceptOnceEntryFileListFilter()); + private CompositeFileListFilter createCompositeWithAcceptOnceFilter(FileListFilter otherFilter) { + CompositeFileListFilter compositeFilter = new CompositeFileListFilter(); + compositeFilter.addFilter(new AcceptOnceFileListFilter()); compositeFilter.addFilter(otherFilter); return compositeFilter; } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileReadingMessageSourceFactoryBean.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileReadingMessageSourceFactoryBean.java index 12ebf988e7..42bfb798dc 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileReadingMessageSourceFactoryBean.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileReadingMessageSourceFactoryBean.java @@ -16,19 +16,19 @@ package org.springframework.integration.file.config; +import java.io.File; +import java.util.Comparator; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.integration.file.DirectoryScanner; import org.springframework.integration.file.FileReadingMessageSource; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.file.locking.AbstractFileLockerFilter; -import java.io.File; -import java.util.Comparator; - /** * @author Mark Fisher * @author Iwein Fuld @@ -42,7 +42,7 @@ public class FileReadingMessageSourceFactoryBean implements FactoryBean filter; + private volatile FileListFilter filter; private volatile AbstractFileLockerFilter locker; @@ -71,7 +71,7 @@ public class FileReadingMessageSourceFactoryBean implements FactoryBean filter) { + public void setFilter(FileListFilter filter) { if (filter instanceof AbstractFileLockerFilter && (this.locker == null)) { this.setLocker((AbstractFileLockerFilter) filter); } @@ -137,10 +137,10 @@ public class FileReadingMessageSourceFactoryBean implements FactoryBean fileCompositeEntryListFilter = new CompositeEntryListFilter(); - fileCompositeEntryListFilter.addFilter(this.filter); - fileCompositeEntryListFilter.addFilter(this.locker); - this.source.setFilter(fileCompositeEntryListFilter); + CompositeFileListFilter compositeFileListFilter = new CompositeFileListFilter(); + compositeFileListFilter.addFilter(this.filter); + compositeFileListFilter.addFilter(this.locker); + this.source.setFilter(compositeFileListFilter); this.source.setLocker(locker); } } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java index 484876148f..46a89e7417 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.integration.file.filters; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -27,19 +26,16 @@ import java.util.List; * * @author Mark Fisher * @author Iwein Fuld - * - * @deprecated Replaced by AbstractEntryListFilter in 2.0.0 */ -@Deprecated -public abstract class AbstractFileListFilter implements FileListFilter { +public abstract class AbstractFileListFilter implements FileListFilter { /** * {@inheritDoc} */ - public final List filterFiles(File[] files) { - List accepted = new ArrayList(); + public final List filterFiles(F[] files) { + List accepted = new ArrayList(); if (files != null) { - for (File file : files) { + for (F file : files) { if (this.accept(file)) { accepted.add(file); } @@ -51,6 +47,6 @@ public abstract class AbstractFileListFilter implements FileListFilter { /** * Subclasses must implement this method. */ - protected abstract boolean accept(File file); + protected abstract boolean accept(F file); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptAllFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptAllFileListFilter.java new file mode 100644 index 0000000000..6a8da438a6 --- /dev/null +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptAllFileListFilter.java @@ -0,0 +1,35 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.file.filters; + + +/** + * Simple implementation of {@link FileListFilter} that always returns true. + * Suitable as a default. + * + * @author Iwein Fuld + * @author Josh Long + * @param + */ +public class AcceptAllFileListFilter extends AbstractFileListFilter { + + @Override + public boolean accept(F file) { + return true; + } + +} diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptOnceFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptOnceFileListFilter.java index 85cd327fae..eafb74aed2 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptOnceFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AcceptOnceFileListFilter.java @@ -13,14 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.file.filters; -import org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter; -import org.springframework.util.Assert; - -import java.io.File; -import java.util.List; - +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; /** * {@link FileListFilter} that passes files only one time. This can @@ -30,34 +27,46 @@ import java.util.List; * This implementation is thread safe. * * @author Iwein Fuld + * @author Josh Long * @since 1.0.0 */ -public class AcceptOnceFileListFilter extends AcceptOnceEntryFileListFilter implements FileListFilter{ +public class AcceptOnceFileListFilter extends AbstractFileListFilter { - /** - * Creates an AcceptOnceFileFilter that is based on a bounded queue. If the - * queue overflows, files that fall out will be passed through this filter - * again if passed to the {@link #filterFiles(File[])} method. - * - * @param maxCapacity the maximum number of Files to maintain in the 'seen' - * queue. - */ - public AcceptOnceFileListFilter(int maxCapacity) { - super(maxCapacity); - } + private final Queue seen; + + private final Object monitor = new Object(); - /** - * Creates an AcceptOnceFileFilter based on an unbounded queue. - */ - public AcceptOnceFileListFilter() { - super(); - } /** - * Filter out all the files that this instance has seen before. + * Creates an AcceptOnceFileListFilter that is based on a bounded queue. If the queue overflows, + * files that fall out will be passed through this filter again if passed to the + * {@link #filterFiles(Object[])} + * + * @param maxCapacity the maximum number of Files to maintain in the 'seen' queue. */ - public List filterFiles(File[] files) { - Assert.notNull(files, "'files' must not be null."); - return this.filterEntries(files); + public AcceptOnceFileListFilter(int maxCapacity) { + this.seen = new LinkedBlockingQueue(maxCapacity); } + + /** + * Creates an AcceptOnceFileListFilter based on an unbounded queue. + */ + public AcceptOnceFileListFilter() { + this.seen = new LinkedBlockingQueue(); + } + + + public boolean accept(F file) { + synchronized (this.monitor) { + if (this.seen.contains(file)) { + return false; + } + if (!this.seen.offer(file)) { + this.seen.poll(); + this.seen.add(file); + } + return true; + } + } + } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java index 416a1f7272..7fdd1d3e98 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/CompositeFileListFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,41 +13,82 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.file.filters; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; -import java.io.File; -import java.io.FileFilter; import java.util.*; - /** - * Composition that delegates to multiple {@link FileFilter}s. The composition is AND based, meaning that a file must - * pass through each filter's {@link #filterFiles(java.io.File[])} method in order to be accepted by the composite. + * Simple {@link FileListFilter} that predicates its matches against any of many + * configured {@link FileListFilter}. * * @author Iwein Fuld - * @author Mark Fisher + * @author Josh Long + * @param */ -public class CompositeFileListFilter extends CompositeEntryListFilter implements FileListFilter{ +public class CompositeFileListFilter implements FileListFilter { - public CompositeFileListFilter(EntryListFilter... fileFilters) { - this(Arrays.asList(fileFilters)); - } + private final Set> fileFilters; - public CompositeFileListFilter(Collection> fileFilters) { - super(fileFilters); - } - /** - * {@inheritDoc} - *

- * This implementation delegates to a collection of filters and returns only files that pass all the filters. - */ - public List filterFiles(File[] files) { - Assert.notNull(files, "'files' should not be null."); - return this.filterEntries(files); - } + public CompositeFileListFilter() { + this.fileFilters = new LinkedHashSet>(); + } + + public CompositeFileListFilter(Collection> fileFilters) { + this.fileFilters = new LinkedHashSet>(fileFilters); + } + + + public CompositeFileListFilter addFilter(FileListFilter filter) { + return this.addFilters(Collections.singletonList(filter)); + } + + /** + * @param filters one or more new filters to add + * @return this CompositeFileFilter instance with the added filters + * @see #addFilters(Collection) + */ + public CompositeFileListFilter addFilters(FileListFilter... filters) { + return addFilters(Arrays.asList(filters)); + } + + /** + * Not thread safe. Only a single thread may add filters at a time. + *

+ * Add the new filters to this CompositeFileListFilter while maintaining the existing filters. + * + * @param filtersToAdd a list of filters to add + * @return this CompositeFileListFilter instance with the added filters + */ + public CompositeFileListFilter addFilters(Collection> filtersToAdd) { + for (FileListFilter elf : filtersToAdd) { + if (elf instanceof InitializingBean) { + try { + ((InitializingBean) elf).afterPropertiesSet(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + } + this.fileFilters.addAll(filtersToAdd); + return this; + } + + + @SuppressWarnings("unchecked") + public List filterFiles(F[] files) { + Assert.notNull(files, "'files' should not be null"); + List leftOver = Arrays.asList(files); + for (FileListFilter fileFilter : this.fileFilters) { + F[] fileArray = (F[]) leftOver.toArray(); + leftOver = fileFilter.filterFiles(fileArray); + } + return leftOver; + } + } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/FileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/FileListFilter.java index 65529f4eba..d2daa85666 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/FileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/FileListFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,25 +16,23 @@ package org.springframework.integration.file.filters; -import java.io.File; import java.util.List; /** - * Strategy interface for filtering a group of files. + * Strategy interface for filtering a group of files. This is a generic filter intended + * to work with either local files or references to remote files. * * @author Iwein Fuld + * @author Josh Long * * @since 1.0.0 - * - * @see org.springframework.integration.file.entries.EntryListFilter - * */ -public interface FileListFilter { +public interface FileListFilter { /** * Filters out files and returns the files that are left in a list, or an * empty list when a null is passed in. */ - List filterFiles(File[] files); + List filterFiles(F[] files); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/PatternMatchingFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/PatternMatchingFileListFilter.java index e4e4bbfc76..c207c76e7b 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/PatternMatchingFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/PatternMatchingFileListFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,40 +16,65 @@ package org.springframework.integration.file.filters; -import org.springframework.integration.file.entries.FileEntryNameExtractor; -import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.integration.file.entries.EntryNameExtractor; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; -import java.io.File; -import java.util.List; import java.util.regex.Pattern; /** - * An {@link org.springframework.integration.file.entries.EntryListFilter} implementation that matches a File against a {@link Pattern}. + * Filters a listing of files by qualifying their 'name' (as determined by {@link org.springframework.integration.file.entries.EntryNameExtractor}) + * against a regular expression (an instance of {@link java.util.regex.Pattern}) * * @author Iwein Fuld - * @author Mark Fisher - * - * @since 1.0.0 + * @author Josh Long + * @param the type of file entry + * @since 2.0 */ -public class PatternMatchingFileListFilter extends PatternMatchingEntryListFilter implements FileListFilter{ +public class PatternMatchingFileListFilter extends AbstractFileListFilter implements InitializingBean { - /** - * Create a file filter for the given pattern. - */ - public PatternMatchingFileListFilter(Pattern pattern) { - super(new FileEntryNameExtractor(), pattern); + private volatile EntryNameExtractor entryNameExtractor; + + private volatile Pattern pattern; + + private volatile String patternExpression; + + + public PatternMatchingFileListFilter(EntryNameExtractor entryNameExtractor, String pattern) { + this.entryNameExtractor = entryNameExtractor; + this.patternExpression = pattern; } - public PatternMatchingFileListFilter(String pattern) { - super(new FileEntryNameExtractor(), pattern); + public PatternMatchingFileListFilter(EntryNameExtractor entryNameExtractor, Pattern pattern) { + this.entryNameExtractor = entryNameExtractor; + this.pattern = pattern; } - /** - * Filter out the files of which the name doesn't match the pattern of this filter - */ - public List filterFiles(File[] files) { - Assert.notNull(files, "'files' must not be null."); - return this.filterEntries(files); + + public void setEntryNameExtractor(EntryNameExtractor entryNameExtractor) { + this.entryNameExtractor = entryNameExtractor; } + + public void setPattern(Pattern pattern) { + this.pattern = pattern; + } + + public void setPatternExpression(String patternExpression) { + this.patternExpression = patternExpression; + } + + public void afterPropertiesSet() throws Exception { + if (StringUtils.hasText(this.patternExpression) && (pattern == null)) { + this.pattern = Pattern.compile(this.patternExpression); + } + Assert.notNull(this.entryNameExtractor, "'entryNameExtractor' must not be null!"); + Assert.notNull(this.pattern, "'pattern' must not be null!"); + } + + @Override + public boolean accept(F entry) { + return (entry != null) && this.pattern.matcher(this.entryNameExtractor.getName(entry)).matches(); + } + } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/SimplePatternFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/SimplePatternFileListFilter.java index 46fc59aec1..2ed937c114 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/SimplePatternFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/SimplePatternFileListFilter.java @@ -1,11 +1,24 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.integration.file.filters; -import org.springframework.integration.file.entries.AbstractEntryListFilter; -import org.springframework.util.AntPathMatcher; -import org.springframework.util.Assert; - import java.io.File; -import java.util.List; + +import org.springframework.util.AntPathMatcher; /** * Filter that supports ant style path expressions, which are less powerful but more readable than regular expressions. @@ -16,15 +29,18 @@ import java.util.List; * @see org.springframework.integration.file.filters.PatternMatchingFileListFilter * @since 2.0.0 */ -public class SimplePatternFileListFilter extends AbstractEntryListFilter implements FileListFilter { +public class SimplePatternFileListFilter extends AbstractFileListFilter { private final AntPathMatcher matcher = new AntPathMatcher(); + private final String path; + public SimplePatternFileListFilter(String path) { this.path = path; } + /** * Accept the given file its name matches the pattern, */ @@ -33,8 +49,4 @@ public class SimplePatternFileListFilter extends AbstractEntryListFilter i return matcher.match(path, file.getName()); } - public List filterFiles(File[] files) { - Assert.notNull("'files' must not be null."); - return this.filterEntries(files); - } } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/AbstractFileLockerFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/AbstractFileLockerFilter.java index 71fff4aac8..d7d865426a 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/locking/AbstractFileLockerFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/locking/AbstractFileLockerFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ package org.springframework.integration.file.locking; -import org.springframework.integration.file.FileLocker; -import org.springframework.integration.file.entries.AbstractEntryListFilter; - import java.io.File; +import org.springframework.integration.file.FileLocker; +import org.springframework.integration.file.filters.AbstractFileListFilter; + /** * Convenience base class for implementing FileLockers that check a lock before accepting a file. This is needed * when used in combination with a FileReadingMessageSource through a DirectoryScanner. @@ -29,10 +29,11 @@ import java.io.File; * @since 2.0 * */ -public abstract class AbstractFileLockerFilter extends AbstractEntryListFilter implements FileLocker { +public abstract class AbstractFileLockerFilter extends AbstractFileListFilter implements FileLocker { @Override public boolean accept(File file) { return this.isLockable(file); } + } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java index 772e4ad571..524105f16d 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSychronizer.java @@ -16,27 +16,27 @@ package org.springframework.integration.file.synchronization; +import java.util.concurrent.ScheduledFuture; + import org.springframework.core.io.Resource; import org.springframework.integration.MessagingException; import org.springframework.integration.endpoint.AbstractEndpoint; -import org.springframework.integration.file.entries.AcceptAllEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.integration.file.filters.AcceptAllFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; import org.springframework.scheduling.Trigger; import org.springframework.util.Assert; -import java.util.concurrent.ScheduledFuture; - /** * Base class charged with knowing how to connect to a remote file system, * scan it for new files and then download the files. *

* The implementation should run through any configured - * {@link org.springframework.integration.file.entries.EntryListFilter}s to - * ensure the entry is acceptable. + * {@link org.springframework.integration.file.filters.FileListFilter}s to + * ensure the file entry is acceptable. * * @author Josh Long */ -public abstract class AbstractInboundRemoteFileSystemSychronizer extends AbstractEndpoint { +public abstract class AbstractInboundRemoteFileSystemSychronizer extends AbstractEndpoint { /** * Should we delete the source file? For an FTP @@ -50,9 +50,9 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst protected volatile Resource localDirectory; /** - * An {@link EntryListFilter} that runs against the remote file system view. + * An {@link FileListFilter} that runs against the remote file system view. */ - protected volatile EntryListFilter filter = new AcceptAllEntryListFilter(); + protected volatile FileListFilter filter = new AcceptAllFileListFilter(); /** * The {@link ScheduledFuture} instance we get when we @@ -63,10 +63,10 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst /** * The {@link EntryAcknowledgmentStrategy} implementation. */ - protected EntryAcknowledgmentStrategy entryAcknowledgmentStrategy; + protected EntryAcknowledgmentStrategy entryAcknowledgmentStrategy; - public void setEntryAcknowledgmentStrategy(EntryAcknowledgmentStrategy entryAcknowledgmentStrategy) { + public void setEntryAcknowledgmentStrategy(EntryAcknowledgmentStrategy entryAcknowledgmentStrategy) { this.entryAcknowledgmentStrategy = entryAcknowledgmentStrategy; } @@ -78,7 +78,7 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst this.localDirectory = localDirectory; } - public void setFilter(EntryListFilter filter) { + public void setFilter(FileListFilter filter) { this.filter = filter; } @@ -90,16 +90,16 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst * be a 'live' stateful client (a connection?) that is inappropriate to cache as it has per-request state. * @param t * leverages strategy implementations to enable different - * behavior. It's a hook to the entry ({@link T}) after it's been + * behavior. It's a hook to the file entry ({@link F}) after it's been * successfully downloaded. Conceptually, you might delete the * remote one or rename it, etc. * @throws Throwable * escape hatch exception, let the adapter deal with it. */ - protected void acknowledge(Object usefulContextOrClientData, T t) throws Throwable { + protected void acknowledge(Object usefulContextOrClientData, F file) throws Throwable { Assert.notNull(this.entryAcknowledgmentStrategy != null, "entryAcknowledgmentStrategy can't be null!"); - this.entryAcknowledgmentStrategy.acknowledge(usefulContextOrClientData, t); + this.entryAcknowledgmentStrategy.acknowledge(usefulContextOrClientData, file); } /** @@ -107,8 +107,8 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst */ protected void doStart() { if (this.entryAcknowledgmentStrategy == null) { - this.entryAcknowledgmentStrategy = new EntryAcknowledgmentStrategy() { - public void acknowledge(Object o, T msg) { + this.entryAcknowledgmentStrategy = new EntryAcknowledgmentStrategy() { + public void acknowledge(Object o, F msg) { // no-op } }; @@ -167,9 +167,9 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst * into the pipeline and also some more advanced scenarios (i.e., 'move file * to another folder on delete ', or 'rename on delete') * - * @param the entry type (file, sftp, ftp, ...) + * @param the file entry type (file, sftp, ftp, ...) */ - public static interface EntryAcknowledgmentStrategy { + public static interface EntryAcknowledgmentStrategy { /** * Semantics are simple. You get a pointer to the entry just processed @@ -183,7 +183,7 @@ public abstract class AbstractInboundRemoteFileSystemSychronizer extends Abst * the data / file / entry you want to process -- specific to subclasses * @throws Exception in case of an error while acknowledging */ - void acknowledge(Object useful, T msg) throws Exception; + void acknowledge(Object useful, F msg) throws Exception; } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java index 8281358470..517fde976c 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/synchronization/AbstractInboundRemoteFileSystemSynchronizingMessageSource.java @@ -27,11 +27,11 @@ import org.springframework.integration.MessagingException; import org.springframework.integration.core.MessageSource; import org.springframework.integration.endpoint.MessageProducerSupport; import org.springframework.integration.file.FileReadingMessageSource; -import org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; import org.springframework.integration.file.entries.FileEntryNameExtractor; -import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.PatternMatchingFileListFilter; /** * Factors out the common logic between the FTP and SFTP adapters. Designed to @@ -43,7 +43,7 @@ import org.springframework.integration.file.entries.PatternMatchingEntryListFilt *

* The base class supports configuration of whether the remote file system and * local file system's directories should be created on start (what 'creating a - * directory' means to the specific adapter is of course implementaton + * directory' means to the specific adapter is of course implementation * specific). *

* This class is to be used as a pair with an implementation of @@ -53,7 +53,7 @@ import org.springframework.integration.file.entries.PatternMatchingEntryListFilt * * @author Josh Long */ -public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource> +public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource> extends MessageProducerSupport implements MessageSource { /** @@ -70,7 +70,7 @@ public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource< * An implementation that will handle the chores of actually connecting to and synching up * the remote file system with the local one, in an inbound direction. */ - protected volatile T synchronizer; + protected volatile S synchronizer; /** * Directory to which things should be synched locally. @@ -85,14 +85,14 @@ public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource< /** * The predicate to use in scanning the remote File system for downloads. */ - protected EntryListFilter remotePredicate; + protected FileListFilter remotePredicate; public void setAutoCreateDirectories(boolean autoCreateDirectories) { this.autoCreateDirectories = autoCreateDirectories; } - public void setSynchronizer(T synchronizer) { + public void setSynchronizer(S synchronizer) { this.synchronizer = synchronizer; } @@ -100,7 +100,7 @@ public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource< this.localDirectory = localDirectory; } - public void setRemotePredicate(EntryListFilter remotePredicate) { + public void setRemotePredicate(FileListFilter remotePredicate) { this.remotePredicate = remotePredicate; } @@ -154,12 +154,12 @@ public abstract class AbstractInboundRemoteFileSystemSynchronizingMessageSource< } @SuppressWarnings("unchecked") - private EntryListFilter buildFilter() { + private FileListFilter buildFilter() { FileEntryNameExtractor fileEntryNameExtractor = new FileEntryNameExtractor(); Pattern completePattern = Pattern.compile("^.*(?(Arrays.asList( - new AcceptOnceEntryFileListFilter(), - new PatternMatchingEntryListFilter(fileEntryNameExtractor, completePattern))); + return new CompositeFileListFilter(Arrays.asList( + new AcceptOnceFileListFilter(), + new PatternMatchingFileListFilter(fileEntryNameExtractor, completePattern))); } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/CompositeFileListFilterTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/CompositeFileListFilterTests.java index 32c5bd7d64..f03dd5f2f1 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/CompositeFileListFilterTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/CompositeFileListFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,22 @@ package org.springframework.integration.file; -import org.junit.Test; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.*; +import org.junit.Test; + +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; /** * @author Iwein Fuld @@ -35,46 +39,46 @@ import static org.mockito.Mockito.*; public class CompositeFileListFilterTests { @SuppressWarnings("unchecked") - private EntryListFilter fileFilterMock1 = mock(EntryListFilter.class); + private FileListFilter fileFilterMock1 = mock(FileListFilter.class); @SuppressWarnings("unchecked") - private EntryListFilter fileFilterMock2 = mock(EntryListFilter.class); + private FileListFilter fileFilterMock2 = mock(FileListFilter.class); private File fileMock = mock(File.class); @Test public void forwardedToFilters() throws Exception { - CompositeEntryListFilter compositeFileFilter = new CompositeEntryListFilter(); - compositeFileFilter .addFilter(fileFilterMock1);compositeFileFilter.addFilter( fileFilterMock2); + CompositeFileListFilter compositeFileFilter = new CompositeFileListFilter(); + compositeFileFilter .addFilter(fileFilterMock1);compositeFileFilter.addFilter(fileFilterMock2); List returnedFiles = Arrays.asList( fileMock); - when(fileFilterMock1.filterEntries(isA(File[].class))).thenReturn(returnedFiles); - when(fileFilterMock2.filterEntries(isA(File[].class))).thenReturn(returnedFiles); - assertEquals(returnedFiles, compositeFileFilter.filterEntries(new File[]{fileMock})); - verify(fileFilterMock1).filterEntries(isA(File[].class)); - verify(fileFilterMock2).filterEntries(isA(File[].class)); + when(fileFilterMock1.filterFiles(isA(File[].class))).thenReturn(returnedFiles); + when(fileFilterMock2.filterFiles(isA(File[].class))).thenReturn(returnedFiles); + assertEquals(returnedFiles, compositeFileFilter.filterFiles(new File[]{fileMock})); + verify(fileFilterMock1).filterFiles(isA(File[].class)); + verify(fileFilterMock2).filterFiles(isA(File[].class)); } @Test public void forwardedToAddedFilters() throws Exception { - CompositeEntryListFilter compositeFileFilter = new CompositeEntryListFilter(); + CompositeFileListFilter compositeFileFilter = new CompositeFileListFilter(); compositeFileFilter.addFilter(fileFilterMock1); compositeFileFilter.addFilter( fileFilterMock2); List returnedFiles = Arrays.asList(fileMock); - when(fileFilterMock1.filterEntries(isA(File[].class))).thenReturn(returnedFiles); - when(fileFilterMock2.filterEntries(isA(File[].class))).thenReturn(returnedFiles); - assertEquals(returnedFiles, compositeFileFilter.filterEntries(new File[]{fileMock})); - verify(fileFilterMock1).filterEntries(isA(File[].class)); - verify(fileFilterMock2).filterEntries(isA(File[].class)); + when(fileFilterMock1.filterFiles(isA(File[].class))).thenReturn(returnedFiles); + when(fileFilterMock2.filterFiles(isA(File[].class))).thenReturn(returnedFiles); + assertEquals(returnedFiles, compositeFileFilter.filterFiles(new File[]{fileMock})); + verify(fileFilterMock1).filterFiles(isA(File[].class)); + verify(fileFilterMock2).filterFiles(isA(File[].class)); } @Test public void negative() throws Exception { - CompositeEntryListFilter compositeFileFilter = new CompositeEntryListFilter(); + CompositeFileListFilter compositeFileFilter = new CompositeFileListFilter(); compositeFileFilter.addFilter(fileFilterMock1); compositeFileFilter.addFilter(fileFilterMock2); - when(fileFilterMock2.filterEntries(isA(File[].class))).thenReturn(new ArrayList()); - when(fileFilterMock1.filterEntries(isA(File[].class))).thenReturn(new ArrayList()); - assertTrue(compositeFileFilter.filterEntries(new File[]{fileMock}).isEmpty()); + when(fileFilterMock2.filterFiles(isA(File[].class))).thenReturn(new ArrayList()); + when(fileFilterMock1.filterFiles(isA(File[].class))).thenReturn(new ArrayList()); + assertTrue(compositeFileFilter.filterFiles(new File[]{fileMock}).isEmpty()); } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml index 01614bc37b..dd6b5347ea 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests-context.xml @@ -13,12 +13,12 @@ - + - + - + diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java index fbbf8a17ad..4a2f4f2c3c 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileReadingMessageSourceIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,21 @@ package org.springframework.integration.file; -import org.junit.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; + +import java.io.File; +import java.util.concurrent.CountDownLatch; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +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.Message; @@ -25,11 +38,6 @@ import org.springframework.test.annotation.Repeat; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.io.File; -import java.util.concurrent.CountDownLatch; - -import static org.junit.Assert.*; - /** * @author Iwein Fuld */ diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/PatternMatchingFileListFilterTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/PatternMatchingFileListFilterTests.java index 08d9e09819..a02b72beb7 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/PatternMatchingFileListFilterTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/PatternMatchingFileListFilterTests.java @@ -16,19 +16,21 @@ package org.springframework.integration.file; -import org.junit.Test; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.integration.file.entries.EntryListFilter; -import org.springframework.integration.file.entries.FileEntryNameExtractor; -import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.util.List; import java.util.regex.Pattern; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.file.entries.FileEntryNameExtractor; +import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.PatternMatchingFileListFilter; /** * @author Mark Fisher @@ -41,8 +43,8 @@ public class PatternMatchingFileListFilterTests { public void matchSingleFile() { File[] files = new File[]{new File("/some/path/test.txt")}; Pattern pattern = Pattern.compile("[a-z]+\\.txt"); - PatternMatchingEntryListFilter filter = new PatternMatchingEntryListFilter(fileEntryNameExtractor, pattern); - List accepted = filter.filterEntries(files); + PatternMatchingFileListFilter filter = new PatternMatchingFileListFilter(fileEntryNameExtractor, pattern); + List accepted = filter.filterFiles(files); assertEquals(1, accepted.size()); } @@ -50,8 +52,8 @@ public class PatternMatchingFileListFilterTests { public void noMatchWithSingleFile() { File[] files = new File[]{new File("/some/path/Test.txt")}; Pattern pattern = Pattern.compile("[a-z]+\\.txt"); - PatternMatchingEntryListFilter filter = new PatternMatchingEntryListFilter(fileEntryNameExtractor, pattern); - List accepted = filter.filterEntries(files); + PatternMatchingFileListFilter filter = new PatternMatchingFileListFilter(fileEntryNameExtractor, pattern); + List accepted = filter.filterFiles(files); assertEquals(0, accepted.size()); } @@ -77,9 +79,9 @@ public class PatternMatchingFileListFilterTests { public void patternEditorInContext() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "patternMatchingFileListFilterTests.xml", this.getClass()); - EntryListFilter filter = (EntryListFilter) context.getBean("filter"); - File[] files = new File[]{new File("/some/path/foo.txt")}; - List accepted = filter.filterEntries(files); + FileListFilter filter = (FileListFilter) context.getBean("filter"); + File[] files = new File[] { new File("/some/path/foo.txt") }; + List accepted = filter.filterFiles(files); assertEquals(1, accepted.size()); } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java b/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java index 4b3b1bb6b8..80d3ddedf7 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/TestFileListFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,19 @@ package org.springframework.integration.file; -import org.springframework.integration.file.entries.EntryListFilter; - import java.io.File; import java.util.Arrays; import java.util.List; +import org.springframework.integration.file.filters.FileListFilter; + /** * @author Iwein Fuld */ -public class TestFileListFilter implements EntryListFilter { - public List filterEntries(File[] entries) { +public class TestFileListFilter implements FileListFilter { + + public List filterFiles(File[] entries) { return Arrays.asList(entries); } + } 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 2a3ff7ea19..a29ca6d45d 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,25 +16,28 @@ package org.springframework.integration.file.config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.util.Comparator; +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.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.entries.AcceptOnceEntryFileListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.io.File; -import java.util.Comparator; -import java.util.concurrent.PriorityBlockingQueue; - -import static org.junit.Assert.*; - /** * @author Iwein Fuld * @author Mark Fisher @@ -76,7 +79,7 @@ public class FileInboundChannelAdapterParserTests { DirectFieldAccessor scannerAccessor = new DirectFieldAccessor(scanner); Object filter = scannerAccessor.getPropertyValue("filter"); assertTrue("'filter' should be set", - filter instanceof AcceptOnceEntryFileListFilter); + filter instanceof AcceptOnceFileListFilter); } @Test diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPatternParserTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPatternParserTests.java index c4b8fedc36..5eab436483 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPatternParserTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPatternParserTests.java @@ -16,8 +16,17 @@ package org.springframework.integration.file.config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.util.Set; + 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; @@ -25,18 +34,13 @@ 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.entries.AcceptOnceEntryFileListFilter; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.file.filters.SimplePatternFileListFilter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.io.File; -import java.util.Set; - -import static org.junit.Assert.*; - /** * @author Mark Fisher * @author Iwein Fuld @@ -83,15 +87,14 @@ public class FileInboundChannelAdapterWithPatternParserTests { @Test public void compositeFilterType() { DirectFieldAccessor scannerAccessor = new DirectFieldAccessor(accessor.getPropertyValue("scanner")); - assertTrue(scannerAccessor.getPropertyValue("filter") instanceof CompositeEntryListFilter); + assertTrue(scannerAccessor.getPropertyValue("filter") instanceof CompositeFileListFilter); } @Test @SuppressWarnings("unchecked") public void compositeFilterSetSize() { DirectFieldAccessor scannerAccessor = new DirectFieldAccessor(accessor.getPropertyValue("scanner")); - - Set> filters = (Set>) new DirectFieldAccessor( + Set> filters = (Set>) new DirectFieldAccessor( scannerAccessor.getPropertyValue("filter")).getPropertyValue("fileFilters"); assertEquals(2, filters.size()); } @@ -100,12 +103,11 @@ public class FileInboundChannelAdapterWithPatternParserTests { @SuppressWarnings("unchecked") public void acceptOnceFilter() { DirectFieldAccessor scannerAccessor = new DirectFieldAccessor(accessor.getPropertyValue("scanner")); - - Set> filters = (Set>) new DirectFieldAccessor( + Set> filters = (Set>) new DirectFieldAccessor( scannerAccessor.getPropertyValue("filter")).getPropertyValue("fileFilters"); boolean hasAcceptOnceFilter = false; - for (EntryListFilter filter : filters) { - if (filter instanceof AcceptOnceEntryFileListFilter) { + for (FileListFilter filter : filters) { + if (filter instanceof AcceptOnceFileListFilter) { hasAcceptOnceFilter = true; } } @@ -116,10 +118,10 @@ public class FileInboundChannelAdapterWithPatternParserTests { @SuppressWarnings("unchecked") public void patternFilter() { DirectFieldAccessor scannerAccessor = new DirectFieldAccessor(accessor.getPropertyValue("scanner")); - Set> filters = (Set>) new DirectFieldAccessor( + Set> filters = (Set>) new DirectFieldAccessor( scannerAccessor.getPropertyValue("filter")).getPropertyValue("fileFilters"); String pattern = null; - for (EntryListFilter filter : filters) { + for (FileListFilter filter : filters) { if (filter instanceof SimplePatternFileListFilter) { pattern = (String) new DirectFieldAccessor(filter).getPropertyValue("path"); } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPreventDuplicatesFlagTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPreventDuplicatesFlagTests.java index a3ba2ce586..ccf8551e9e 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPreventDuplicatesFlagTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithPreventDuplicatesFlagTests.java @@ -16,27 +16,33 @@ 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.file.TestFileListFilter; -import org.springframework.integration.file.entries.AcceptOnceEntryFileListFilter; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; -import org.springframework.integration.file.filters.SimplePatternFileListFilter; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +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.Collection; import java.util.Iterator; import java.util.List; -import static org.hamcrest.CoreMatchers.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.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContext; +import org.springframework.integration.file.TestFileListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.SimplePatternFileListFilter; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Mark Fisher @@ -55,98 +61,98 @@ public class FileInboundChannelAdapterWithPreventDuplicatesFlagTests { @Test public void filterAndNull() { - EntryListFilter filter = this.extractFilter("filterAndNull"); - assertFalse(filter instanceof CompositeEntryListFilter); + FileListFilter filter = this.extractFilter("filterAndNull"); + assertFalse(filter instanceof CompositeFileListFilter); assertSame(testFilter, filter); } @Test public void filterAndTrue() { - EntryListFilter filter = this.extractFilter("filterAndTrue"); - assertTrue(filter instanceof CompositeEntryListFilter); + FileListFilter filter = this.extractFilter("filterAndTrue"); + assertTrue(filter instanceof CompositeFileListFilter); Collection filters = (Collection) new DirectFieldAccessor(filter).getPropertyValue("fileFilters"); - assertTrue(filters.iterator().next() instanceof AcceptOnceEntryFileListFilter); + assertTrue(filters.iterator().next() instanceof AcceptOnceFileListFilter); assertTrue(filters.contains(testFilter)); } @Test public void filterAndFalse() throws Exception { - EntryListFilter filter = this.extractFilter("filterAndFalse"); - assertFalse(filter instanceof CompositeEntryListFilter); + FileListFilter filter = this.extractFilter("filterAndFalse"); + assertFalse(filter instanceof CompositeFileListFilter); assertSame(testFilter, filter); } @Test @SuppressWarnings("unchecked") public void patternAndNull() throws Exception { - EntryListFilter filter = this.extractFilter("patternAndNull"); - assertTrue(filter instanceof CompositeEntryListFilter); - Collection> filters = (Collection>) + FileListFilter filter = this.extractFilter("patternAndNull"); + assertTrue(filter instanceof CompositeFileListFilter); + Collection> filters = (Collection>) new DirectFieldAccessor(filter).getPropertyValue("fileFilters"); - Iterator> iterator = filters.iterator(); - assertTrue(iterator.next() instanceof AcceptOnceEntryFileListFilter); + Iterator> iterator = filters.iterator(); + assertTrue(iterator.next() instanceof AcceptOnceFileListFilter); assertThat(iterator.next(), is(SimplePatternFileListFilter.class)); } @Test @SuppressWarnings("unchecked") public void patternAndTrue() throws Exception { - EntryListFilter filter = this.extractFilter("patternAndTrue"); - assertTrue(filter instanceof CompositeEntryListFilter); - Collection> filters = (Collection>) + FileListFilter filter = this.extractFilter("patternAndTrue"); + assertTrue(filter instanceof CompositeFileListFilter); + Collection> filters = (Collection>) new DirectFieldAccessor(filter).getPropertyValue("fileFilters"); - Iterator> iterator = filters.iterator(); - assertTrue(iterator.next() instanceof AcceptOnceEntryFileListFilter); + Iterator> iterator = filters.iterator(); + assertTrue(iterator.next() instanceof AcceptOnceFileListFilter); assertThat(iterator.next(), is(SimplePatternFileListFilter.class)); } @Test public void patternAndFalse() throws Exception { - EntryListFilter filter = this.extractFilter("patternAndFalse"); - assertFalse(filter instanceof CompositeEntryListFilter); + FileListFilter filter = this.extractFilter("patternAndFalse"); + assertFalse(filter instanceof CompositeFileListFilter); assertThat(filter, is(SimplePatternFileListFilter.class)); } @Test public void defaultAndNull() throws Exception { - EntryListFilter filter = this.extractFilter("defaultAndNull"); + FileListFilter filter = this.extractFilter("defaultAndNull"); assertNotNull(filter); - assertFalse(filter instanceof CompositeEntryListFilter); - assertTrue(filter instanceof AcceptOnceEntryFileListFilter); + assertFalse(filter instanceof CompositeFileListFilter); + assertTrue(filter instanceof AcceptOnceFileListFilter); File testFile = new File("test"); File[] files = new File[] { testFile, testFile, testFile }; - List result = filter.filterEntries(files); + List result = filter.filterFiles(files); assertEquals(1, result.size()); } @Test public void defaultAndTrue() throws Exception { - EntryListFilter filter = this.extractFilter("defaultAndTrue"); - assertFalse(filter instanceof CompositeEntryListFilter); - assertTrue(filter instanceof AcceptOnceEntryFileListFilter); + FileListFilter filter = this.extractFilter("defaultAndTrue"); + assertFalse(filter instanceof CompositeFileListFilter); + assertTrue(filter instanceof AcceptOnceFileListFilter); File testFile = new File("test"); File[] files = new File[] { testFile, testFile, testFile }; - List result = filter.filterEntries(files); + List result = filter.filterFiles(files); assertEquals(1, result.size()); } @Test public void defaultAndFalse() throws Exception { - EntryListFilter filter = this.extractFilter("defaultAndFalse"); + FileListFilter filter = this.extractFilter("defaultAndFalse"); assertNotNull(filter); - assertFalse(filter instanceof CompositeEntryListFilter); - assertFalse(filter instanceof AcceptOnceEntryFileListFilter); + assertFalse(filter instanceof CompositeFileListFilter); + assertFalse(filter instanceof AcceptOnceFileListFilter); File testFile = new File("test"); File[] files = new File[] { testFile, testFile, testFile }; - List result = filter.filterEntries(files); + List result = filter.filterFiles(files); assertEquals(3, result.size()); } @SuppressWarnings("unchecked") - private EntryListFilter extractFilter(String beanName) { - return (EntryListFilter) + private FileListFilter extractFilter(String beanName) { + return (FileListFilter) new DirectFieldAccessor( new DirectFieldAccessor( new DirectFieldAccessor(context.getBean(beanName)) diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithQueueSizeTests-context.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithQueueSizeTests-context.xml index b27cb1105c..5d84dd8d18 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithQueueSizeTests-context.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileInboundChannelAdapterWithQueueSizeTests-context.xml @@ -35,7 +35,7 @@ - + diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java index dbb93dcf0e..84b78df2f8 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/config/FileListFilterFactoryBeanTests.java @@ -16,17 +16,24 @@ package org.springframework.integration.file.config; -import org.junit.Test; -import org.springframework.beans.DirectFieldAccessor; -import org.springframework.integration.file.entries.*; -import org.springframework.integration.file.filters.SimplePatternFileListFilter; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertFalse; +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.Collection; import java.util.Iterator; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; +import org.junit.Test; + +import org.springframework.beans.DirectFieldAccessor; +import org.springframework.integration.file.filters.AbstractFileListFilter; +import org.springframework.integration.file.filters.AcceptOnceFileListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.SimplePatternFileListFilter; /** * @author Mark Fisher @@ -47,8 +54,8 @@ public class FileListFilterFactoryBeanTests { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); TestFilter testFilter = new TestFilter(); factory.setFilterReference(testFilter); - EntryListFilter result = factory.getObject(); - assertFalse(result instanceof CompositeEntryListFilter); + FileListFilter result = factory.getObject(); + assertFalse(result instanceof CompositeFileListFilter); assertSame(testFilter, result); } @@ -58,10 +65,10 @@ public class FileListFilterFactoryBeanTests { TestFilter testFilter = new TestFilter(); factory.setFilterReference(testFilter); factory.setPreventDuplicates(Boolean.TRUE); - EntryListFilter result = factory.getObject(); - assertTrue(result instanceof CompositeEntryListFilter); + FileListFilter result = factory.getObject(); + assertTrue(result instanceof CompositeFileListFilter); Collection filters = (Collection) new DirectFieldAccessor(result).getPropertyValue("fileFilters"); - assertTrue(filters.iterator().next() instanceof AcceptOnceEntryFileListFilter); + assertTrue(filters.iterator().next() instanceof AcceptOnceFileListFilter); assertTrue(filters.contains(testFilter)); } @@ -71,8 +78,8 @@ public class FileListFilterFactoryBeanTests { TestFilter testFilter = new TestFilter(); factory.setFilterReference(testFilter); factory.setPreventDuplicates(Boolean.FALSE); - EntryListFilter result = factory.getObject(); - assertFalse(result instanceof CompositeEntryListFilter); + FileListFilter result = factory.getObject(); + assertFalse(result instanceof CompositeFileListFilter); assertSame(testFilter, result); } @@ -81,12 +88,12 @@ public class FileListFilterFactoryBeanTests { public void filenamePatternAndPreventDuplicatesNull() throws Exception { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); factory.setFilenamePattern("foo"); - EntryListFilter result = factory.getObject(); - assertTrue(result instanceof CompositeEntryListFilter); - Collection> filters = (Collection>) + FileListFilter result = factory.getObject(); + assertTrue(result instanceof CompositeFileListFilter); + Collection> filters = (Collection>) new DirectFieldAccessor(result).getPropertyValue("fileFilters"); - Iterator> iterator = filters.iterator(); - assertTrue(iterator.next() instanceof AcceptOnceEntryFileListFilter); + Iterator> iterator = filters.iterator(); + assertTrue(iterator.next() instanceof AcceptOnceFileListFilter); assertThat(iterator.next(), is(SimplePatternFileListFilter.class)); } @@ -96,12 +103,12 @@ public class FileListFilterFactoryBeanTests { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); factory.setFilenamePattern(("foo")); factory.setPreventDuplicates(Boolean.TRUE); - EntryListFilter result = factory.getObject(); - assertTrue(result instanceof CompositeEntryListFilter); - Collection> filters = (Collection>) + FileListFilter result = factory.getObject(); + assertTrue(result instanceof CompositeFileListFilter); + Collection> filters = (Collection>) new DirectFieldAccessor(result).getPropertyValue("fileFilters"); - Iterator> iterator = filters.iterator(); - assertTrue(iterator.next() instanceof AcceptOnceEntryFileListFilter); + Iterator> iterator = filters.iterator(); + assertTrue(iterator.next() instanceof AcceptOnceFileListFilter); assertThat(iterator.next(), is(SimplePatternFileListFilter.class)); } @@ -110,13 +117,13 @@ public class FileListFilterFactoryBeanTests { FileListFilterFactoryBean factory = new FileListFilterFactoryBean(); factory.setFilenamePattern(("foo")); factory.setPreventDuplicates(Boolean.FALSE); - EntryListFilter result = factory.getObject(); - assertFalse(result instanceof CompositeEntryListFilter); + FileListFilter result = factory.getObject(); + assertFalse(result instanceof CompositeFileListFilter); assertThat(result, is(SimplePatternFileListFilter.class)); } - private static class TestFilter extends AbstractEntryListFilter { + private static class TestFilter extends AbstractFileListFilter { @Override public boolean accept(File file) { return true; diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingNamespaceTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingNamespaceTests.java index 73c2de30f0..39007ea385 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingNamespaceTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingNamespaceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,25 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.file.locking; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.io.File; + 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.integration.endpoint.SourcePollingChannelAdapter; import org.springframework.integration.file.FileReadingMessageSource; -import org.springframework.integration.file.entries.CompositeEntryListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.io.File; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - /** * @author Iwein Fuld */ @@ -65,7 +67,7 @@ public class FileLockingNamespaceTests { @Test public void shouldSetCustomLockerProperly() { assertThat(extractFromScanner("locker", customLockingSource), is(StubLocker.class)); - assertThat(extractFromScanner("filter", customLockingSource), is(CompositeEntryListFilter.class)); + assertThat(extractFromScanner("filter", customLockingSource), is(CompositeFileListFilter.class)); } private Object extractFromScanner(String propertyName, FileReadingMessageSource source) { @@ -75,7 +77,7 @@ public class FileLockingNamespaceTests { @Test public void shouldSetNioLockerProperly() { assertThat(extractFromScanner("locker", nioLockingSource), is(NioFileLocker.class)); - assertThat(extractFromScanner("filter", nioLockingSource), is(CompositeEntryListFilter.class)); + assertThat(extractFromScanner("filter", nioLockingSource), is(CompositeFileListFilter.class)); } public static class StubLocker extends AbstractFileLockerFilter { diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingWithMultipleSourcesIntegrationTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingWithMultipleSourcesIntegrationTests.java index 45ac321826..c838bc8208 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingWithMultipleSourcesIntegrationTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/FileLockingWithMultipleSourcesIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.file.locking; import static org.hamcrest.CoreMatchers.nullValue; @@ -26,6 +27,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.integration.file.FileReadingMessageSource; @@ -37,51 +39,51 @@ import org.springframework.test.context.ContextConfiguration; @ContextConfiguration @RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class) public class FileLockingWithMultipleSourcesIntegrationTests { - private static File workdir; - @BeforeClass - public static void setupWorkDirectory() throws Exception { - workdir = new File( - new File(System.getProperty("java.io.tmpdir")), - FileLockingWithMultipleSourcesIntegrationTests.class.getSimpleName() - ); - workdir.mkdir(); - } + private static File workdir; - @Autowired - @Qualifier("fileSource1") - private FileReadingMessageSource fileSource1; + @BeforeClass + public static void setupWorkDirectory() throws Exception { + workdir = new File(new File(System.getProperty("java.io.tmpdir")), + FileLockingWithMultipleSourcesIntegrationTests.class.getSimpleName()); + workdir.mkdir(); + } - @Autowired - @Qualifier("fileSource2") - private FileReadingMessageSource fileSource2; + @Autowired + @Qualifier("fileSource1") + private FileReadingMessageSource fileSource1; - @Autowired - @Qualifier("fileSource2") - private FileReadingMessageSource fileSource3; + @Autowired + @Qualifier("fileSource2") + private FileReadingMessageSource fileSource2; - @Before - public void cleanoutWorkDir() { - for (File file : workdir.listFiles()) { - file.delete(); - } - } + @Autowired + @Qualifier("fileSource2") + private FileReadingMessageSource fileSource3; - @Test - public void filePickedUpOnceWithDistinctFilters() throws IOException { - File testFile = new File(workdir, "test"); - testFile.createNewFile(); - assertThat(fileSource1.receive(), hasPayload(testFile)); - assertThat(fileSource2.receive(), nullValue()); - FileChannelCache.closeChannelFor(testFile); - } + @Before + public void cleanoutWorkDir() { + for (File file : workdir.listFiles()) { + file.delete(); + } + } + + @Test + public void filePickedUpOnceWithDistinctFilters() throws IOException { + File testFile = new File(workdir, "test"); + testFile.createNewFile(); + assertThat(fileSource1.receive(), hasPayload(testFile)); + assertThat(fileSource2.receive(), nullValue()); + FileChannelCache.closeChannelFor(testFile); + } + + @Test + public void filePickedUpTwiceWithSharedFilter() throws Exception { + File testFile = new File(workdir, "test"); + testFile.createNewFile(); + assertThat(fileSource1.receive(), hasPayload(testFile)); + assertThat(fileSource3.receive(), hasPayload(testFile)); + FileChannelCache.closeChannelFor(testFile); + } - @Test - public void filePickedUpTwiceWithSharedFilter() throws Exception { - File testFile = new File(workdir, "test"); - testFile.createNewFile(); - assertThat(fileSource1.receive(), hasPayload(testFile)); - assertThat(fileSource3.receive(), hasPayload(testFile)); - FileChannelCache.closeChannelFor(testFile); - } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java index 1e38e3ff9b..7a87f179c9 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/locking/NioFileLockerTests.java @@ -13,20 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.file.locking; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.springframework.integration.file.entries.EntryListFilter; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import org.springframework.integration.file.filters.FileListFilter; /** * @author Iwein Fuld @@ -49,20 +51,20 @@ public class NioFileLockerTests { NioFileLocker filter = new NioFileLocker(); File testFile = new File(workdir, "test0"); testFile.createNewFile(); - assertThat(filter.filterEntries(workdir.listFiles()).get(0), is(testFile)); + assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile)); filter.lock(testFile); - assertThat(filter.filterEntries(workdir.listFiles()).get(0), is(testFile)); + assertThat(filter.filterFiles(workdir.listFiles()).get(0), is(testFile)); } @Test public void fileNotListedWhenLockedByOtherFilter() throws IOException { NioFileLocker filter1 = new NioFileLocker(); - EntryListFilter filter2 = new NioFileLocker(); + FileListFilter filter2 = new NioFileLocker(); File testFile = new File(workdir, "test1"); testFile.createNewFile(); - assertThat(filter1.filterEntries(workdir.listFiles()).get(0), is(testFile)); + assertThat(filter1.filterFiles(workdir.listFiles()).get(0), is(testFile)); filter1.lock(testFile); - assertThat(filter2.filterEntries(workdir.listFiles()), is((List)new ArrayList())); + assertThat(filter2.filterFiles(workdir.listFiles()), is((List) new ArrayList())); } } diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/patternMatchingFileListFilterTests.xml b/spring-integration-file/src/test/java/org/springframework/integration/file/patternMatchingFileListFilterTests.xml index bb05f65365..5f546f01df 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/patternMatchingFileListFilterTests.xml +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/patternMatchingFileListFilterTests.xml @@ -8,7 +8,7 @@ --> - + diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java index 1ae78b1254..17233791eb 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpInboundRemoteFileSystemSynchronizer.java @@ -104,7 +104,7 @@ public class FtpInboundRemoteFileSystemSynchronizer extends AbstractInboundRemot FtpClientPool.class.getSimpleName() + " returned a 'null' client. " + "This is most likely a bug in the pool implementation."); - Collection fileList = this.filter.filterEntries(client.listFiles()); + Collection fileList = this.filter.filterFiles(client.listFiles()); try { for (FTPFile ftpFile : fileList) { if ((ftpFile != null) && ftpFile.isFile()) { diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java index 4f7a9be6e5..16c6548184 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java @@ -28,9 +28,9 @@ import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; import org.springframework.core.io.ResourceLoader; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; -import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.PatternMatchingFileListFilter; import org.springframework.util.StringUtils; /** @@ -62,7 +62,7 @@ public class FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean protected volatile Resource localDirectoryResource; - protected volatile EntryListFilter filter; + protected volatile FileListFilter filter; protected volatile int clientMode = FTPClient.ACTIVE_LOCAL_DATA_CONNECTION_MODE; @@ -113,7 +113,7 @@ public class FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean this.localWorkingDirectory = localWorkingDirectory; } - public void setFilter(EntryListFilter filter) { + public void setFilter(FileListFilter filter) { this.filter = filter; } @@ -155,11 +155,11 @@ public class FtpRemoteFileSystemSynchronizingMessageSourceFactoryBean } this.localDirectoryResource = this.fromText(this.localWorkingDirectory); FtpFileEntryNameExtractor fileEntryNameExtractor = new FtpFileEntryNameExtractor(); - CompositeEntryListFilter compositeFtpFileListFilter = new CompositeEntryListFilter(); + CompositeFileListFilter compositeFtpFileListFilter = new CompositeFileListFilter(); if (StringUtils.hasText(this.filenamePattern)) { - PatternMatchingEntryListFilter ftpFilePatternMatchingEntryListFilter = - new PatternMatchingEntryListFilter(fileEntryNameExtractor, filenamePattern); - compositeFtpFileListFilter.addFilter(ftpFilePatternMatchingEntryListFilter); + PatternMatchingFileListFilter ftpFilePatternMatchingFileListFilter = + new PatternMatchingFileListFilter(fileEntryNameExtractor, filenamePattern); + compositeFtpFileListFilter.addFilter(ftpFilePatternMatchingFileListFilter); } if (this.filter != null) { compositeFtpFileListFilter.addFilter(this.filter); diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/FtpParserInboundTests-context.xml b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/FtpParserInboundTests-context.xml index 689b4441aa..598ec6f102 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/FtpParserInboundTests-context.xml +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/FtpParserInboundTests-context.xml @@ -62,7 +62,7 @@ - + diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java index d643157dd8..416fc3f864 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/config/SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean.java @@ -16,16 +16,18 @@ package org.springframework.integration.sftp.config; -import com.jcraft.jsch.ChannelSftp; +import java.io.File; + import org.apache.commons.lang.SystemUtils; + import org.springframework.beans.factory.config.AbstractFactoryBean; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; import org.springframework.core.io.ResourceLoader; -import org.springframework.integration.file.entries.CompositeEntryListFilter; -import org.springframework.integration.file.entries.EntryListFilter; -import org.springframework.integration.file.entries.PatternMatchingEntryListFilter; +import org.springframework.integration.file.filters.CompositeFileListFilter; +import org.springframework.integration.file.filters.FileListFilter; +import org.springframework.integration.file.filters.PatternMatchingFileListFilter; import org.springframework.integration.sftp.QueuedSftpSessionPool; import org.springframework.integration.sftp.SftpEntryNameExtractor; import org.springframework.integration.sftp.SftpSessionFactory; @@ -33,7 +35,7 @@ import org.springframework.integration.sftp.impl.SftpInboundRemoteFileSystemSync import org.springframework.integration.sftp.impl.SftpInboundRemoteFileSystemSynchronizingMessageSource; import org.springframework.util.StringUtils; -import java.io.File; +import com.jcraft.jsch.ChannelSftp; /** * Factory bean to hide the fairly complex configuration possibilities for an SFTP endpoint @@ -55,7 +57,7 @@ public class SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean private volatile String filenamePattern; - private volatile EntryListFilter filter; + private volatile FileListFilter filter; private int port = 22; @@ -92,7 +94,7 @@ public class SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean this.filenamePattern = filenamePattern; } - public void setFilter(EntryListFilter filter) { + public void setFilter(FileListFilter filter) { this.filter = filter; } @@ -170,10 +172,10 @@ public class SftpRemoteFileSystemSynchronizingMessageSourceFactoryBean // remote predicates SftpEntryNameExtractor sftpEntryNameExtractor = new SftpEntryNameExtractor(); - CompositeEntryListFilter compositeFtpFileListFilter = new CompositeEntryListFilter(); + CompositeFileListFilter compositeFtpFileListFilter = new CompositeFileListFilter(); if (StringUtils.hasText(this.filenamePattern)) { - PatternMatchingEntryListFilter ftpFilePatternMatchingEntryListFilter = - new PatternMatchingEntryListFilter(sftpEntryNameExtractor, filenamePattern); + PatternMatchingFileListFilter ftpFilePatternMatchingEntryListFilter = + new PatternMatchingFileListFilter(sftpEntryNameExtractor, filenamePattern); compositeFtpFileListFilter.addFilter(ftpFilePatternMatchingEntryListFilter); } if (this.filter != null) { diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java index cde8fbacbc..5aaa661441 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/impl/SftpInboundRemoteFileSystemSynchronizer.java @@ -120,7 +120,7 @@ public class SftpInboundRemoteFileSystemSynchronizer extends AbstractInboundRemo ChannelSftp channelSftp = session.getChannel(); Collection beforeFilter = channelSftp.ls(remotePath); ChannelSftp.LsEntry[] entries = (beforeFilter == null) ? new ChannelSftp.LsEntry[0] : beforeFilter.toArray(new ChannelSftp.LsEntry[beforeFilter.size()]); - Collection files = this.filter.filterEntries(entries); + Collection files = this.filter.filterFiles(entries); for (ChannelSftp.LsEntry lsEntry : files) { if ((lsEntry != null) && !lsEntry.getAttrs().isDir() && !lsEntry.getAttrs().isLink()) { copyFromRemoteToLocalDirectory(session, lsEntry, this.localDirectory); diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests-inbound-all.xml b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests-inbound-all.xml index 5bf980fd50..f03a3d35a2 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests-inbound-all.xml +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests-inbound-all.xml @@ -56,7 +56,7 @@ - + diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests.java index 832ba8e4ed..180afa4b08 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/SftpParserTests.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.sftp; import static junit.framework.Assert.assertTrue; @@ -22,13 +23,12 @@ import java.io.File; import org.junit.After; import org.junit.Before; import org.junit.Test; + import org.springframework.beans.factory.BeanCreationException; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author Oleg Zhurakousky - * */ public class SftpParserTests { @@ -44,11 +44,13 @@ public class SftpParserTests { assertTrue(new File("target/foo").exists()); assertTrue(!new File("target/bar").exists()); } + @Test(expected=BeanCreationException.class) public void testLocalFilesAutoCreationFalse() throws Exception{ assertTrue(!new File("target/bar").exists()); new ClassPathXmlApplicationContext("SftpParserTests-inbound-all-fail.xml", this.getClass()); } + @Test public void testLocalFilesAreFound() throws Exception{ assertTrue(new File("target").exists()); @@ -60,4 +62,5 @@ public class SftpParserTests { public void cleanUp() throws Exception{ new File("target/foo").delete(); } + }