package pex.permissions;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExpMatcher implements PermissionMatcher {
protected static Pattern rangeExpression = Pattern.compile("(\\d+)-(\\d+)");
protected static HashMap<String, Pattern> patternCache = new HashMap<String, Pattern>();
@Override
public boolean isMatches(String expression, String permission) {
Pattern permissionMatcher = patternCache.get(expression);
if (permissionMatcher == null) {
patternCache.put(expression, permissionMatcher = createPattern(expression));
}
return permissionMatcher.matcher(permission).matches();
}
protected Pattern createPattern(String expression) {
return Pattern.compile(prepareRegexp(expression), Pattern.CASE_INSENSITIVE);
}
public static String prepareRegexp(String expression) {
if (expression.startsWith("-")) {
expression = expression.substring(1);
}
if (expression.startsWith("#")) {
expression = expression.substring(1);
}
String regexp = expression.replace(".", "\\.").replace("*", "(.*)");
try {
Matcher rangeMatcher = rangeExpression.matcher(regexp);
while (rangeMatcher.find()) {
StringBuilder range = new StringBuilder();
int from = Integer.parseInt(rangeMatcher.group(1));
int to = Integer.parseInt(rangeMatcher.group(2));
if (from > to) {
int temp = from;
from = to;
to = temp;
} // swap them
range.append("(");
for (int i = from; i <= to; i++) {
range.append(i);
if (i < to) {
range.append("|");
}
}
range.append(")");
regexp = regexp.replace(rangeMatcher.group(0), range.toString());
}
} catch (Throwable e) {
}
return regexp;
}
}