package railo.commons.io.res.util;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import railo.commons.io.SystemUtil;
import railo.commons.io.res.Resource;
import railo.commons.lang.StringUtil;
/**
* Wildcard Filter
*/
public class WildCardFilter implements ResourceAndResourceNameFilter {
private static final String specials="{}[]().+\\^$";
private static final boolean IS_WIN=SystemUtil.isWindows();
private final Pattern pattern;
private final PatternMatcher matcher=new Perl5Matcher();
private final String wildcard;
private boolean ignoreCase;
public WildCardFilter(String wildcard) throws MalformedPatternException {
this(wildcard,IS_WIN);
}
/**
* @param wildcard
* @throws MalformedPatternException
*/
public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException {
this.wildcard=wildcard;
StringBuilder sb = new StringBuilder(wildcard.length());
int len=wildcard.length();
for(int i=0;i<len;i++) {
char c = wildcard.charAt(i);
if(c == '*')sb.append(".*");
else if(c == '?') sb.append('.');
else if(specials.indexOf(c)!=-1)sb.append('\\').append(c);
else sb.append(c);
}
this.ignoreCase=ignoreCase;
pattern=new Perl5Compiler().compile(ignoreCase?StringUtil.toLowerCase(sb.toString()):sb.toString());
}
@Override
public boolean accept(Resource file) {
return matcher.matches(ignoreCase?StringUtil.toLowerCase(file.getName()):file.getName(), pattern);
}
public boolean accept(Resource parent, String name) {
//print.out("accept:"+name);
return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern);
}
public boolean accept(String name) {
return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern);
}
@Override
public String toString() {
return "Wildcardfilter:"+wildcard;
}
}