001 /*
002 * Copyright 2001-2006 Geert Bevin <gbevin[remove] at uwyn dot com>
003 * Distributed under the terms of either:
004 * - the common development and distribution license (CDDL), v1.0; or
005 * - the GNU Lesser General Public License, v2.1 or later
006 * $Id: FileUtils.java 3108 2006-03-13 18:03:00Z gbevin $
007 */
008 package com.uwyn.jhighlight.tools;
009
010 import java.io.File;
011 import java.util.ArrayList;
012 import java.util.Iterator;
013 import java.util.regex.Pattern;
014
015 /**
016 * Collection of utility methods to work with files.
017 *
018 * @author Geert Bevin (gbevin[remove] at uwyn dot com)
019 * @version $Revision: 3108 $
020 * @since 1.0
021 */
022 public abstract class FileUtils
023 {
024 private FileUtils()
025 {
026 }
027
028 /**
029 * Recursively traverse a directory hierachy and obtain a list of all
030 * absolute file names.
031 * <p>Regular expression patterns can be provided to explicitly include
032 * and exclude certain file names.
033 *
034 * @param file the directory whose file hierarchy will be traversed
035 * @param included an array of regular expression patterns that will be
036 * used to determine which files should be included; or
037 * <p><code>null</code> if all files should be included
038 * @param excluded an array of regular expression patterns that will be
039 * used to determine which files should be excluded; or
040 * <p><code>null</code> if no files should be excluded
041 * @return the list of absolute file names
042 * @since 1.0
043 */
044 public static ArrayList getFileList(File file, Pattern[] included, Pattern[] excluded)
045 {
046 return getFileList(file, included, excluded, true);
047 }
048
049 private static ArrayList getFileList(File file, Pattern[] included, Pattern[] excluded, boolean root)
050 {
051 if (null == file)
052 {
053 return new ArrayList();
054 }
055
056 ArrayList filelist = new ArrayList();
057 if (file.isDirectory())
058 {
059 String[] list = file.list();
060 if (null != list)
061 {
062 String list_entry;
063 for (int i = 0; i < list.length; i++)
064 {
065 list_entry = list[i];
066
067 File next_file = new File(file.getAbsolutePath() + File.separator + list_entry);
068 ArrayList dir = getFileList(next_file, included, excluded, false);
069
070 Iterator dir_it = dir.iterator();
071 String file_name;
072 while (dir_it.hasNext())
073 {
074 file_name = (String)dir_it.next();
075
076 if (root)
077 {
078 // if the file is not accepted, don't process it further
079 if (!StringUtils.filter(file_name, included, excluded))
080 {
081 continue;
082 }
083
084 }
085 else
086 {
087 file_name = file.getName() + File.separator + file_name;
088 }
089
090 int filelist_size = filelist.size();
091 for (int j = 0; j < filelist_size; j++)
092 {
093 if (((String)filelist.get(j)).compareTo(file_name) > 0)
094 {
095 filelist.add(j, file_name);
096 break;
097 }
098 }
099 if (filelist.size() == filelist_size)
100 {
101 filelist.add(file_name);
102 }
103 }
104 }
105 }
106 }
107 else if (file.isFile())
108 {
109 String file_name = file.getName();
110
111 if (root)
112 {
113 if (StringUtils.filter(file_name, included, excluded))
114 {
115 filelist.add(file_name);
116 }
117 }
118 else
119 {
120 filelist.add(file_name);
121 }
122 }
123
124 return filelist;
125 }
126
127 public static String getExtension(String fileName)
128 {
129 if (null == fileName) throw new IllegalArgumentException("fileName can't be null.");
130
131 String ext = null;
132
133 int index = fileName.lastIndexOf('.');
134 if (index > 0 && index < fileName.length() - 1)
135 {
136 ext = fileName.substring(index+1).toLowerCase();
137 }
138
139 return ext;
140 }
141 }