Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Complete
-
4.3.7
Description
The test-case demonstrates the problem:
@Test public void patternThenModifiedFilters() throws IOException { try (ChainFileListFilter<File> chain = new ChainFileListFilter<>(File.class)) { chain.addFilter(new SimplePatternFileListFilter("*.txt")); chain.addFilter(new LastModifiedFileListFilter()); List<File> result = chain.filterFiles(files); assertEquals(1, result.size()); } }
Since LastModifiedFileListFilter isn't generic and expects only File[] it doesn't work as a nested filter in the ChainFileListFilter because generics erasure in Java makes cast to F[] in subsequent iteration useless.
As a workaround I suggest this:
public class ChainFileListFilter<F> extends CompositeFileListFilter<F> { private final Class<F> fileClass; public ChainFileListFilter(Class<F> fileClass) { this.fileClass = fileClass; } @Override public List<F> filterFiles(F[] files) { Assert.notNull(files, "'files' should not be null"); List<F> leftOver = Arrays.asList(files); for (FileListFilter<F> fileFilter : this.fileFilters) { @SuppressWarnings("unchecked") F[] fileArray = leftOver.toArray((F[]) Array.newInstance(this.fileClass, leftOver.size())); leftOver = fileFilter.filterFiles(fileArray); } return leftOver; } }
And it works even with an empty list, so we can revert the fail fast logic.
Any other suggestions are welcome!
Attachments
Issue Links
- relates to
-
INT-4215 CompositeFileListFilter runs all files through all filters
-
- Closed
-