image-20250602185546888

1. CanalEventFilter

1
2
3
4
5
6
7
8
9
/**
* 数据过滤机制
*
* @author jianghang 2012-7-20 下午03:51:27
*/
public interface CanalEventFilter<T> {

boolean filter(T event) throws CanalFilterException;
}

2. AviaterELFilter

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
/**
* 基于aviater el表达式的匹配过滤
*
* @author jianghang 2012-7-23 上午10:46:32
*/
public class AviaterELFilter implements CanalEventFilter<CanalEntry.Entry> {

public static final String ROOT_KEY = "entry";
private String expression;

public AviaterELFilter(String expression){
this.expression = expression;
}

public boolean filter(CanalEntry.Entry entry) throws CanalFilterException {
if (StringUtils.isEmpty(expression)) {
return true;
}

Map<String, Object> env = new HashMap<>();
env.put(ROOT_KEY, entry);
return (Boolean) AviatorEvaluator.execute(expression, env);
}

}

3. AviaterRegexFilter

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
/**
* 基于aviater进行tableName正则匹配的过滤算法
*
* @author jianghang 2012-7-20 下午06:01:34
*/
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);
}

// 对pattern按照从长到短的排序
// 因为 foo|foot 匹配 foot 会出错,原因是 foot 匹配了 foo 之后,会返回 foo,但是 foo 的长度和 foot
// 的长度不一样
list.sort(COMPARATOR);
// 对pattern进行头尾完全匹配
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);
}

/**
* 修复正则表达式匹配的问题,因为使用了 oro 的 matches,会出现:
*
* <pre>
* foo|foot 匹配 foot 出错,原因是 foot 匹配了 foo 之后,会返回 foo,但是 foo 的长度和 foot 的长度不一样
* </pre>
*
* 因此此类对正则表达式进行了从长到短的排序
*
* @author zebin.xuzb 2012-10-22 下午2:02:26
* @version 1.0.0
*/
private static class StringComparator implements Comparator<String> {

@Override
public int compare(String str1, String str2) {
return Integer.compare(str2.length(), str1.length());
}
}

/**
* 修复正则表达式匹配的问题,即使按照长度递减排序,还是会出现以下问题:
*
* <pre>
* foooo|f.*t 匹配 fooooot 出错,原因是 fooooot 匹配了 foooo 之后,会将 fooo 和数据进行匹配,但是 foooo 的长度和 fooooot 的长度不一样
* </pre>
*
* 因此此类对正则表达式进行头尾完全匹配
*
* @author simon
* @version 1.0.0
*/

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;
}

}

4. AviaterSimpleFilter

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
/**
* 基于aviater进行tableName简单过滤计算,不支持正则匹配
*
* @author jianghang 2012-7-20 下午05:53:30
*/
public class AviaterSimpleFilter implements CanalEventFilter<String> {

private static final String SPLIT = ",";

private static final String FILTER_EXPRESSION = "include(list,target)";

private final Expression exp = AviatorEvaluator.compile(FILTER_EXPRESSION, true);

private final List<String> list;

public AviaterSimpleFilter(String filterExpression){
if (StringUtils.isEmpty(filterExpression)) {
list = new ArrayList<>();
} else {
String[] ss = filterExpression.toLowerCase().split(SPLIT);
list = Arrays.asList(ss);
}
}

public boolean filter(String filtered) throws CanalFilterException {
if (list.isEmpty()) {
return true;
}
if (StringUtils.isEmpty(filtered)) {
return true;
}
Map<String, Object> env = new HashMap<>();
env.put("list", list);
env.put("target", filtered.toLowerCase());
return (Boolean) exp.execute(env);
}

}


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.