// Copyright 2003, SLAC, Stanford, U.S.A
package org.freehep.util.io;

import java.io.File;
import java.io.FileFilter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Implements a standard file filter as is normally used in Unix and DOS. The
 * template characters are treated literally and are case sensitive with the
 * following exceptions:
 * <UL>
 * <LI>* matches zero or more consecutive characters
 * <LI>? matches exactly one character
 * <LI>\ causes the next character of the template to be treated literally. Use \\
 * for \, \* for * and \? for *.
 * </UL>
 * 
 * The template should specify slashes as a separator character (e.g. Unix
 * style).
 * 
 * @author Mark Donszelmann
 * @version $Id: StandardFileFilter.java 8584 2006-08-10 23:06:37Z duns $
 */
public class StandardFileFilter implements FileFilter {

    private Pattern pattern;

    /**
     * Create a standard file filter
     * 
     * @param template pattern to be used for file filtering
     */
    public StandardFileFilter(String template) {
        if (template.indexOf("/") < 0)
            template = "*/" + template;

        // convert pattern
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < template.length(); i++) {
            char ch = template.charAt(i);
            switch (ch) {
            case '?':
                s.append(".");
                break;
            case '*':
                s.append(".*");
                break;
            case '\\':
                s.append("\\");
                i++;
                s.append(template.charAt(i));
                break;
            case '.':
                s.append("\\.");
                break;
            case '^':
                s.append("\\^");
                break;
            case '+':
                s.append("\\+");
                break;
            case '$':
                s.append("\\$");
                break;
            case '{':
                s.append("\\{");
                break;
            case '(':
                s.append("\\(");
                break;
            case '[':
                s.append("\\[");
                break;
            case '|':
                s.append("\\|");
                break;
            default:
                s.append(ch);
                break;
            }
        }
        pattern = Pattern.compile(s.toString());
    }

    public boolean accept(File pathname) {
        String name = pathname.getPath().replaceAll("\\" + File.separator, "/");
        Matcher matcher = pattern.matcher(name);
        return matcher.matches();
    }
}
