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  */
17 package org.apache.commons.io.filefilter;
18 
19 import java.io.File;
20 import java.io.FileFilter;
21 import java.io.FilenameFilter;
22 import 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  */
37 public class FileFilterUtils {
38 
39     /**
40      * FileFilterUtils is not normally instantiated.
41      */
FileFilterUtils()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      */
prefixFileFilter(String prefix)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      */
suffixFileFilter(String suffix)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      */
nameFileFilter(String name)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      */
directoryFileFilter()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      */
fileFileFilter()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      */
andFileFilter(IOFileFilter filter1, IOFileFilter filter2)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      */
orFileFilter(IOFileFilter filter1, IOFileFilter filter2)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      */
notFileFilter(IOFileFilter filter)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      */
trueFileFilter()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      */
falseFileFilter()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      */
asFileFilter(FileFilter filter)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      */
asFileFilter(FilenameFilter filter)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      */
ageFileFilter(long cutoff)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      */
ageFileFilter(long cutoff, boolean acceptOlder)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      */
ageFileFilter(Date cutoffDate)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      */
ageFileFilter(Date cutoffDate, boolean acceptOlder)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      */
ageFileFilter(File cutoffReference)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      */
ageFileFilter(File cutoffReference, boolean acceptOlder)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      */
sizeFileFilter(long threshold)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      */
sizeFileFilter(long threshold, boolean acceptLarger)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      */
sizeRangeFileFilter(long minSizeInclusive, long maxSizeInclusive )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      */
makeCVSAware(IOFileFilter filter)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      */
makeSVNAware(IOFileFilter filter)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      */
makeDirectoryOnly(IOFileFilter filter)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      */
makeFileOnly(IOFileFilter filter)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