FileDocCategorySizeDatePackage
FindFilter.javaAPI DocExample1563Thu Mar 08 13:20:10 GMT 2001None

FindFilter.java

import java.io.*;
import org.apache.regexp.*;
import com.darwinsys.util.Debug;

/** Class to encapsulate the filtration for Find.
 * For now just setTTTFilter() methods. Really needs to be a real
 * data structure to allow complex things like
 *		-n "*.html" -a \( -size < 0 -o mtime < 5 \).
 * @version $Id: FindFilter.java,v 1.3 2001/03/08 18:20:10 ian Exp $
 */
public class FindFilter implements FilenameFilter {
	boolean sizeSet;
	int size;
	String name;
	RE nameRE;

	public FindFilter() {
	}

	void setSizeFilter(String sizeFilter) {
		size = Integer.parseInt(sizeFilter);
		sizeSet = true;
	}

	/** Convert the given shell wildcard pattern into internal form (an RE) */
	void setNameFilter(String nameFilter) {
		name = nameFilter;
		StringBuffer sb = new StringBuffer('^');
		for (int i = 0; i < nameFilter.length(); i++) {
			char c = nameFilter.charAt(i);
			switch(c) {
				case '.':	sb.append("\\."); break;
				case '*':	sb.append(".*"); break;
				case '?':	sb.append('.'); break;
				default:	sb.append(c); break;
			}
		}
		sb.append('$');
		Debug.println("name", "RE=\"" + sb + "\".");
		try {
			nameRE = new RE(sb.toString());
		} catch (RESyntaxException ex) {
			System.err.println("For shame! " + ex);
		}
	}

	/** Do the filtering. For now, only filter on name */
	public boolean accept(File dir, String fileName) {
		File f = new File(dir, fileName);
		if (f.isDirectory()) {
			return true;	// allow recursion
		}

		if (name != null) {
			return nameRE.match(fileName);
		}

		// TODO size handling.

		// Catchall
		return false;
	}
}