1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
public class AviaterRegexFilter implements CanalEventFilter<String> {
private static final String SPLIT = ","; private static final String PATTERN_SPLIT = "|"; private static final String FILTER_EXPRESSION = "regex(pattern,target)"; private static final RegexFunction regexFunction = new RegexFunction(); private final Expression exp = AviatorEvaluator.compile(FILTER_EXPRESSION, true); static { AviatorEvaluator.addFunction(regexFunction); }
private static final Comparator<String> COMPARATOR = new StringComparator();
final private String pattern; final private boolean defaultEmptyValue;
public AviaterRegexFilter(String pattern){ this(pattern, true); }
public AviaterRegexFilter(String pattern, boolean defaultEmptyValue){ this.defaultEmptyValue = defaultEmptyValue; List<String> list = null; if (StringUtils.isEmpty(pattern)) { list = new ArrayList<>(); } else { String[] ss = StringUtils.split(pattern, SPLIT); list = Arrays.asList(ss); }
list.sort(COMPARATOR); list = completionPattern(list); this.pattern = StringUtils.join(list, PATTERN_SPLIT); }
public boolean filter(String filtered) throws CanalFilterException { if (StringUtils.isEmpty(pattern)) { return defaultEmptyValue; }
if (StringUtils.isEmpty(filtered)) { return defaultEmptyValue; }
Map<String, Object> env = new HashMap<>(); env.put("pattern", pattern); env.put("target", filtered.toLowerCase()); return (Boolean) exp.execute(env); }
private static class StringComparator implements Comparator<String> {
@Override public int compare(String str1, String str2) { return Integer.compare(str2.length(), str1.length()); } }
private List<String> completionPattern(List<String> patterns) { List<String> result = new ArrayList<>(); for (String pattern : patterns) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("^"); stringBuilder.append(pattern); stringBuilder.append("$"); result.add(stringBuilder.toString()); } return result; }
@Override public String toString() { return pattern; }
}
|