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.util.List;
21
22 import org.apache.commons.io.FilenameUtils;
23
24 /**
25 * Filters files using the supplied wildcards.
26 * <p>
27 * This filter selects files, but not directories, based on one or more wildcards
28 * and using case-sensitive comparison.
29 * <p>
30 * The wildcard matcher uses the characters '?' and '*' to represent a
31 * single or multiple wildcard characters.
32 * This is the same as often found on Dos/Unix command lines.
33 * The extension check is case-sensitive.
34 * See {@link FilenameUtils#wildcardMatch} for more information.
35 * <p>
36 * For example:
37 * <pre>
38 * File dir = new File(".");
39 * FileFilter fileFilter = new WildcardFilter("*test*.java~*~");
40 * File[] files = dir.listFiles(fileFilter);
41 * for (int i = 0; i < files.length; i++) {
42 * System.out.println(files[i]);
43 * }
44 * </pre>
45 *
46 * @author Jason Anderson
47 * @version $Revision: 437680 $ $Date: 2006-08-28 13:57:00 +0200 (Mo, 28 Aug 2006) $
48 * @since Commons IO 1.1
49 * @deprecated Use WilcardFileFilter. Deprecated as this class performs directory
50 * filtering which it shouldn't do, but that can't be removed due to compatability.
51 */
52 public class WildcardFilter extends AbstractFileFilter {
53
54 /** The wildcards that will be used to match filenames. */
55 private String[] wildcards;
56
57 /**
58 * Construct a new case-sensitive wildcard filter for a single wildcard.
59 *
60 * @param wildcard the wildcard to match
61 * @throws IllegalArgumentException if the pattern is null
62 */
63 public WildcardFilter(String wildcard) {
64 if (wildcard == null) {
65 throw new IllegalArgumentException("The wildcard must not be null");
66 }
67 this.wildcards = new String[] { wildcard };
68 }
69
70 /**
71 * Construct a new case-sensitive wildcard filter for an array of wildcards.
72 *
73 * @param wildcards the array of wildcards to match
74 * @throws IllegalArgumentException if the pattern array is null
75 */
76 public WildcardFilter(String[] wildcards) {
77 if (wildcards == null) {
78 throw new IllegalArgumentException("The wildcard array must not be null");
79 }
80 this.wildcards = wildcards;
81 }
82
83 /**
84 * Construct a new case-sensitive wildcard filter for a list of wildcards.
85 *
86 * @param wildcards the list of wildcards to match
87 * @throws IllegalArgumentException if the pattern list is null
88 * @throws ClassCastException if the list does not contain Strings
89 */
90 public WildcardFilter(List wildcards) {
91 if (wildcards == null) {
92 throw new IllegalArgumentException("The wildcard list must not be null");
93 }
94 this.wildcards = (String[]) wildcards.toArray(new String[wildcards.size()]);
95 }
96
97 //-----------------------------------------------------------------------
98 /**
99 * Checks to see if the filename matches one of the wildcards.
100 *
101 * @param dir the file directory
102 * @param name the filename
103 * @return true if the filename matches one of the wildcards
104 */
105 public boolean accept(File dir, String name) {
106 if (dir != null && new File(dir, name).isDirectory()) {
107 return false;
108 }
109
110 for (int i = 0; i < wildcards.length; i++) {
111 if (FilenameUtils.wildcardMatch(name, wildcards[i])) {
112 return true;
113 }
114 }
115
116 return false;
117 }
118
119 /**
120 * Checks to see if the filename matches one of the wildcards.
121 *
122 * @param file the file to check
123 * @return true if the filename matches one of the wildcards
124 */
125 public boolean accept(File file) {
126 if (file.isDirectory()) {
127 return false;
128 }
129
130 for (int i = 0; i < wildcards.length; i++) {
131 if (FilenameUtils.wildcardMatch(file.getName(), wildcards[i])) {
132 return true;
133 }
134 }
135
136 return false;
137 }
138
139 }