In principle, searching a directory for a file that matches a particular pattern is fairly easy. I already have a mechanism in place to search a file, so all I have to do is search a list of files. As you can see in Figure 5-3, the algorithm is recursive.
Listing 5-13 implements this design by taking advantage of the existing frame-works. It searches through subdirectories, looking for files that happen to contain the regex pattern I described.
01 /**
02 * Searches through the given directory and finds
03 * the specified files, based the searchPattern that describes
04 * its content. Returns matching files in an ArrayList. This
05 * method searches recursively through the file system.
06 * @param the File currentFile the directory, or file, to start
07 * searching in
08 * @param the String fileExtension, if any, of the file
09 * @param the String searchPattern, the regex that describes
10 * the file content we're looking for
11 * @param the int flags and flags we want to apply to the regex
12 * pattern.
13 * @throws IOException if there's an IO problem
14 *
15 * @return ArrayList containing <code>File</code> objects,
16 * or an empty ArrayList, if no matches are found
17 */
18 public static ArrayList searchDirs(
19 File currentFile,
20 String fileExtension,
21 String searchPattern,
22 int flags
23 ) throws IOException
24 {
25 ArrayList retval = new ArrayList();
26 if (!currentFile.isDirectory())
27 {
28 Map tmp = searchFile(
29 currentFile.getPath(),
30 searchPattern,flags);
31 //if anything was found, add the file
32 if (tmp.size() > 0)
33 {
34 retval.add(currentFile);
35 this.log.finest("added " + currentFile);
36 }
37 }
38 else
39 { //step through subdirectories
40 File subs[] =
41 currentFile.listFiles(
42 newLocalFileFilter(fileExtension));
43 if (subs != null)
44 {
45 //if the recursive search found anything, add it
46 for (int i=0; i < subs.length; i++)
47 {
48 ArrayList tmp=null;
49 tmp =searchDirs(
50 subs[i],
51 fileExtension,
52 searchPattern,
53 flags);
54 if (tmp.size() > 0)
55 {
56 log.info(subs[i].getPath());
57 retval.addAll(tmp);
58 }
59 }
60 }
61 }
62 return retval;
63 }
64 /**
65 * private filtering class, so that file
66 * searches can be more efficient
67 */
68 private static class LocalFileFilter implements FileFilter{
69 private String extension;
70 LocalFileFilter()
71 {
72 this(null);
73 }
74 LocalFileFilter(String extension)
75 {
76 this.extension = extension;
77 }
78 /**
79 * true if the current file meets the criteria
80 * @param the file pathname to check
81 *
82 * @return true if the file has the extension, or
83 * equals null, or the file is a directory.
84 * Else, returns false.
85 */
86 public boolean accept(File pathname){
87 boolean retval = false;
88 if (extension == null)
89 {
90 retval = true;
91 }
92 else
93 {
94 String tmp = pathname.getPath();
95 if (tmp.endsWith(extension)) retval = true;
96 if (pathname.isDirectory()) retval = true;
97 }
98 return retval;
99 }
100 }