001package org.unix4j.unix.find; 002 003import java.io.File; 004import java.io.FileFilter; 005import java.util.ArrayList; 006import java.util.List; 007 008/** 009 * A file filter that accepts a file only if all component filters accept the 010 * file. In other words, the composite filter performs an AND operation on the 011 * outcome of all component filters. 012 */ 013class CompositeFileFilter implements FileFilter { 014 015 private final List<FileFilter> componentFilters = new ArrayList<FileFilter>(); 016 017 public CompositeFileFilter() { 018 super(); 019 } 020 021 public void addIfNotNull(FileFilter filter) { 022 if (filter != null) { 023 add(filter); 024 } 025 } 026 public void add(FileFilter filter) { 027 componentFilters.add(filter); 028 } 029 030 public FileFilter simplify() { 031 if (componentFilters.isEmpty()) { 032 return new FileFilter() { 033 @Override 034 public boolean accept(File pathname) { 035 return true; 036 } 037 }; 038 } 039 if (componentFilters.size() == 1) { 040 return componentFilters.get(0); 041 } 042 return this; 043 } 044 045 @Override 046 public boolean accept(File file) { 047 for (final FileFilter filter : componentFilters) { 048 if (!filter.accept(file)) { 049 return false; 050 } 051 } 052 return true; 053 } 054 055}