1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17package org.apache.commons.io.filefilter;
18
19import java.io.File;
20import java.io.FileFilter;
21import java.io.FilenameFilter;
22import java.util.Date;
23
24/**
25 * Useful utilities for working with file filters. It provides access to all
26 * file filter implementations in this package so you don't have to import
27 * every class you use.
28 *
29 * @since Commons IO 1.0
30 * @version $Id: FileFilterUtils.java 609286 2008-01-06 10:01:26Z scolebourne $
31 *
32 * @author Stephen Colebourne
33 * @author Jeremias Maerki
34 * @author Masato Tezuka
35 * @author Rahul Akolkar
36 */
37public class FileFilterUtils {
38
39    /**
40     * FileFilterUtils is not normally instantiated.
41     */
42    public FileFilterUtils() {
43    }
44
45    //-----------------------------------------------------------------------
46    /**
47     * Returns a filter that returns true if the filename starts with the specified text.
48     *
49     * @param prefix  the filename prefix
50     * @return a prefix checking filter
51     */
52    public static IOFileFilter prefixFileFilter(String prefix) {
53        return new PrefixFileFilter(prefix);
54    }
55
56    /**
57     * Returns a filter that returns true if the filename ends with the specified text.
58     *
59     * @param suffix  the filename suffix
60     * @return a suffix checking filter
61     */
62    public static IOFileFilter suffixFileFilter(String suffix) {
63        return new SuffixFileFilter(suffix);
64    }
65
66    /**
67     * Returns a filter that returns true if the filename matches the specified text.
68     *
69     * @param name  the filename
70     * @return a name checking filter
71     */
72    public static IOFileFilter nameFileFilter(String name) {
73        return new NameFileFilter(name);
74    }
75
76    /**
77     * Returns a filter that checks if the file is a directory.
78     *
79     * @return file filter that accepts only directories and not files
80     */
81    public static IOFileFilter directoryFileFilter() {
82        return DirectoryFileFilter.DIRECTORY;
83    }
84
85    /**
86     * Returns a filter that checks if the file is a file (and not a directory).
87     *
88     * @return file filter that accepts only files and not directories
89     */
90    public static IOFileFilter fileFileFilter() {
91        return FileFileFilter.FILE;
92    }
93
94    //-----------------------------------------------------------------------
95    /**
96     * Returns a filter that ANDs the two specified filters.
97     *
98     * @param filter1  the first filter
99     * @param filter2  the second filter
100     * @return a filter that ANDs the two specified filters
101     */
102    public static IOFileFilter andFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
103        return new AndFileFilter(filter1, filter2);
104    }
105
106    /**
107     * Returns a filter that ORs the two specified filters.
108     *
109     * @param filter1  the first filter
110     * @param filter2  the second filter
111     * @return a filter that ORs the two specified filters
112     */
113    public static IOFileFilter orFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
114        return new OrFileFilter(filter1, filter2);
115    }
116
117    /**
118     * Returns a filter that NOTs the specified filter.
119     *
120     * @param filter  the filter to invert
121     * @return a filter that NOTs the specified filter
122     */
123    public static IOFileFilter notFileFilter(IOFileFilter filter) {
124        return new NotFileFilter(filter);
125    }
126
127    //-----------------------------------------------------------------------
128    /**
129     * Returns a filter that always returns true.
130     *
131     * @return a true filter
132     */
133    public static IOFileFilter trueFileFilter() {
134        return TrueFileFilter.TRUE;
135    }
136
137    /**
138     * Returns a filter that always returns false.
139     *
140     * @return a false filter
141     */
142    public static IOFileFilter falseFileFilter() {
143        return FalseFileFilter.FALSE;
144    }
145
146    //-----------------------------------------------------------------------
147    /**
148     * Returns an <code>IOFileFilter</code> that wraps the
149     * <code>FileFilter</code> instance.
150     *
151     * @param filter  the filter to be wrapped
152     * @return a new filter that implements IOFileFilter
153     */
154    public static IOFileFilter asFileFilter(FileFilter filter) {
155        return new DelegateFileFilter(filter);
156    }
157
158    /**
159     * Returns an <code>IOFileFilter</code> that wraps the
160     * <code>FilenameFilter</code> instance.
161     *
162     * @param filter  the filter to be wrapped
163     * @return a new filter that implements IOFileFilter
164     */
165    public static IOFileFilter asFileFilter(FilenameFilter filter) {
166        return new DelegateFileFilter(filter);
167    }
168
169    //-----------------------------------------------------------------------
170    /**
171     * Returns a filter that returns true if the file was last modified after
172     * the specified cutoff time.
173     *
174     * @param cutoff  the time threshold
175     * @return an appropriately configured age file filter
176     * @since Commons IO 1.2
177     */
178    public static IOFileFilter ageFileFilter(long cutoff) {
179        return new AgeFileFilter(cutoff);
180    }
181
182    /**
183     * Returns a filter that filters files based on a cutoff time.
184     *
185     * @param cutoff  the time threshold
186     * @param acceptOlder  if true, older files get accepted, if false, newer
187     * @return an appropriately configured age file filter
188     * @since Commons IO 1.2
189     */
190    public static IOFileFilter ageFileFilter(long cutoff, boolean acceptOlder) {
191        return new AgeFileFilter(cutoff, acceptOlder);
192    }
193
194    /**
195     * Returns a filter that returns true if the file was last modified after
196     * the specified cutoff date.
197     *
198     * @param cutoffDate  the time threshold
199     * @return an appropriately configured age file filter
200     * @since Commons IO 1.2
201     */
202    public static IOFileFilter ageFileFilter(Date cutoffDate) {
203        return new AgeFileFilter(cutoffDate);
204    }
205
206    /**
207     * Returns a filter that filters files based on a cutoff date.
208     *
209     * @param cutoffDate  the time threshold
210     * @param acceptOlder  if true, older files get accepted, if false, newer
211     * @return an appropriately configured age file filter
212     * @since Commons IO 1.2
213     */
214    public static IOFileFilter ageFileFilter(Date cutoffDate, boolean acceptOlder) {
215        return new AgeFileFilter(cutoffDate, acceptOlder);
216    }
217
218    /**
219     * Returns a filter that returns true if the file was last modified after
220     * the specified reference file.
221     *
222     * @param cutoffReference  the file whose last modification
223     *        time is usesd as the threshold age of the files
224     * @return an appropriately configured age file filter
225     * @since Commons IO 1.2
226     */
227    public static IOFileFilter ageFileFilter(File cutoffReference) {
228        return new AgeFileFilter(cutoffReference);
229    }
230
231    /**
232     * Returns a filter that filters files based on a cutoff reference file.
233     *
234     * @param cutoffReference  the file whose last modification
235     *        time is usesd as the threshold age of the files
236     * @param acceptOlder  if true, older files get accepted, if false, newer
237     * @return an appropriately configured age file filter
238     * @since Commons IO 1.2
239     */
240    public static IOFileFilter ageFileFilter(File cutoffReference, boolean acceptOlder) {
241        return new AgeFileFilter(cutoffReference, acceptOlder);
242    }
243
244    //-----------------------------------------------------------------------
245    /**
246     * Returns a filter that returns true if the file is bigger than a certain size.
247     *
248     * @param threshold  the file size threshold
249     * @return an appropriately configured SizeFileFilter
250     * @since Commons IO 1.2
251     */
252    public static IOFileFilter sizeFileFilter(long threshold) {
253        return new SizeFileFilter(threshold);
254    }
255
256    /**
257     * Returns a filter that filters based on file size.
258     *
259     * @param threshold  the file size threshold
260     * @param acceptLarger  if true, larger files get accepted, if false, smaller
261     * @return an appropriately configured SizeFileFilter
262     * @since Commons IO 1.2
263     */
264    public static IOFileFilter sizeFileFilter(long threshold, boolean acceptLarger) {
265        return new SizeFileFilter(threshold, acceptLarger);
266    }
267
268    /**
269     * Returns a filter that accepts files whose size is &gt;= minimum size
270     * and &lt;= maximum size.
271     *
272     * @param minSizeInclusive the minimum file size (inclusive)
273     * @param maxSizeInclusive the maximum file size (inclusive)
274     * @return an appropriately configured IOFileFilter
275     * @since Commons IO 1.3
276     */
277    public static IOFileFilter sizeRangeFileFilter(long minSizeInclusive, long maxSizeInclusive ) {
278        IOFileFilter minimumFilter = new SizeFileFilter(minSizeInclusive, true);
279        IOFileFilter maximumFilter = new SizeFileFilter(maxSizeInclusive + 1L, false);
280        return new AndFileFilter(minimumFilter, maximumFilter);
281    }
282
283    //-----------------------------------------------------------------------
284    /* Constructed on demand and then cached */
285    private static IOFileFilter cvsFilter;
286
287    /* Constructed on demand and then cached */
288    private static IOFileFilter svnFilter;
289
290    /**
291     * Decorates a filter to make it ignore CVS directories.
292     * Passing in <code>null</code> will return a filter that accepts everything
293     * except CVS directories.
294     *
295     * @param filter  the filter to decorate, null means an unrestricted filter
296     * @return the decorated filter, never null
297     * @since Commons IO 1.1 (method existed but had bug in 1.0)
298     */
299    public static IOFileFilter makeCVSAware(IOFileFilter filter) {
300        if (cvsFilter == null) {
301            cvsFilter = notFileFilter(
302                andFileFilter(directoryFileFilter(), nameFileFilter("CVS")));
303        }
304        if (filter == null) {
305            return cvsFilter;
306        } else {
307            return andFileFilter(filter, cvsFilter);
308        }
309    }
310
311    /**
312     * Decorates a filter to make it ignore SVN directories.
313     * Passing in <code>null</code> will return a filter that accepts everything
314     * except SVN directories.
315     *
316     * @param filter  the filter to decorate, null means an unrestricted filter
317     * @return the decorated filter, never null
318     * @since Commons IO 1.1
319     */
320    public static IOFileFilter makeSVNAware(IOFileFilter filter) {
321        if (svnFilter == null) {
322            svnFilter = notFileFilter(
323                andFileFilter(directoryFileFilter(), nameFileFilter(".svn")));
324        }
325        if (filter == null) {
326            return svnFilter;
327        } else {
328            return andFileFilter(filter, svnFilter);
329        }
330    }
331
332    //-----------------------------------------------------------------------
333    /**
334     * Decorates a filter so that it only applies to directories and not to files.
335     *
336     * @param filter  the filter to decorate, null means an unrestricted filter
337     * @return the decorated filter, never null
338     * @since Commons IO 1.3
339     */
340    public static IOFileFilter makeDirectoryOnly(IOFileFilter filter) {
341        if (filter == null) {
342            return DirectoryFileFilter.DIRECTORY;
343        }
344        return new AndFileFilter(DirectoryFileFilter.DIRECTORY, filter);
345    }
346
347    /**
348     * Decorates a filter so that it only applies to files and not to directories.
349     *
350     * @param filter  the filter to decorate, null means an unrestricted filter
351     * @return the decorated filter, never null
352     * @since Commons IO 1.3
353     */
354    public static IOFileFilter makeFileOnly(IOFileFilter filter) {
355        if (filter == null) {
356            return FileFileFilter.FILE;
357        }
358        return new AndFileFilter(FileFileFilter.FILE, filter);
359    }
360
361}
362