• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.Serializable;
21 import java.util.List;
22 
23 import org.apache.commons.io.IOCase;
24 
25 /**
26  * Filters filenames for a certain name.
27  * <p>
28  * For example, to print all files and directories in the
29  * current directory whose name is <code>Test</code>:
30  *
31  * <pre>
32  * File dir = new File(".");
33  * String[] files = dir.list( new NameFileFilter("Test") );
34  * for ( int i = 0; i &lt; files.length; i++ ) {
35  *     System.out.println(files[i]);
36  * }
37  * </pre>
38  *
39  * @since Commons IO 1.0
40  * @version $Revision: 606381 $ $Date: 2007-12-22 02:03:16 +0000 (Sat, 22 Dec 2007) $
41  *
42  * @author Stephen Colebourne
43  * @author Federico Barbieri
44  * @author Serge Knystautas
45  * @author Peter Donald
46  */
47 public class NameFileFilter extends AbstractFileFilter implements Serializable {
48 
49     /** The filenames to search for */
50     private final String[] names;
51     /** Whether the comparison is case sensitive. */
52     private final IOCase caseSensitivity;
53 
54     /**
55      * Constructs a new case-sensitive name file filter for a single name.
56      *
57      * @param name  the name to allow, must not be null
58      * @throws IllegalArgumentException if the name is null
59      */
NameFileFilter(String name)60     public NameFileFilter(String name) {
61         this(name, null);
62     }
63 
64     /**
65      * Construct a new name file filter specifying case-sensitivity.
66      *
67      * @param name  the name to allow, must not be null
68      * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
69      * @throws IllegalArgumentException if the name is null
70      */
NameFileFilter(String name, IOCase caseSensitivity)71     public NameFileFilter(String name, IOCase caseSensitivity) {
72         if (name == null) {
73             throw new IllegalArgumentException("The wildcard must not be null");
74         }
75         this.names = new String[] {name};
76         this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
77     }
78 
79     /**
80      * Constructs a new case-sensitive name file filter for an array of names.
81      * <p>
82      * The array is not cloned, so could be changed after constructing the
83      * instance. This would be inadvisable however.
84      *
85      * @param names  the names to allow, must not be null
86      * @throws IllegalArgumentException if the names array is null
87      */
NameFileFilter(String[] names)88     public NameFileFilter(String[] names) {
89         this(names, null);
90     }
91 
92     /**
93      * Constructs a new name file filter for an array of names specifying case-sensitivity.
94      * <p>
95      * The array is not cloned, so could be changed after constructing the
96      * instance. This would be inadvisable however.
97      *
98      * @param names  the names to allow, must not be null
99      * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
100      * @throws IllegalArgumentException if the names array is null
101      */
NameFileFilter(String[] names, IOCase caseSensitivity)102     public NameFileFilter(String[] names, IOCase caseSensitivity) {
103         if (names == null) {
104             throw new IllegalArgumentException("The array of names must not be null");
105         }
106         this.names = names;
107         this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
108     }
109 
110     /**
111      * Constructs a new case-sensitive name file filter for a list of names.
112      *
113      * @param names  the names to allow, must not be null
114      * @throws IllegalArgumentException if the name list is null
115      * @throws ClassCastException if the list does not contain Strings
116      */
NameFileFilter(List<String> names)117     public NameFileFilter(List<String> names) {
118         this(names, null);
119     }
120 
121     /**
122      * Constructs a new name file filter for a list of names specifying case-sensitivity.
123      *
124      * @param names  the names to allow, must not be null
125      * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
126      * @throws IllegalArgumentException if the name list is null
127      * @throws ClassCastException if the list does not contain Strings
128      */
NameFileFilter(List<String> names, IOCase caseSensitivity)129     public NameFileFilter(List<String> names, IOCase caseSensitivity) {
130         if (names == null) {
131             throw new IllegalArgumentException("The list of names must not be null");
132         }
133         this.names = names.toArray(new String[names.size()]);
134         this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
135     }
136 
137     //-----------------------------------------------------------------------
138     /**
139      * Checks to see if the filename matches.
140      *
141      * @param file  the File to check
142      * @return true if the filename matches
143      */
144     @Override
accept(File file)145     public boolean accept(File file) {
146         String name = file.getName();
147         for (int i = 0; i < this.names.length; i++) {
148             if (caseSensitivity.checkEquals(name, names[i])) {
149                 return true;
150             }
151         }
152         return false;
153     }
154 
155     /**
156      * Checks to see if the filename matches.
157      *
158      * @param file  the File directory
159      * @param name  the filename
160      * @return true if the filename matches
161      */
162     @Override
accept(File file, String name)163     public boolean accept(File file, String name) {
164         for (int i = 0; i < names.length; i++) {
165             if (caseSensitivity.checkEquals(name, names[i])) {
166                 return true;
167             }
168         }
169         return false;
170     }
171 
172     /**
173      * Provide a String representaion of this file filter.
174      *
175      * @return a String representaion
176      */
177     @Override
toString()178     public String toString() {
179         StringBuffer buffer = new StringBuffer();
180         buffer.append(super.toString());
181         buffer.append("(");
182         if (names != null) {
183             for (int i = 0; i < names.length; i++) {
184                 if (i > 0) {
185                     buffer.append(",");
186                 }
187                 buffer.append(names[i]);
188             }
189         }
190         buffer.append(")");
191         return buffer.toString();
192     }
193 
194 }
195