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}