package org.nutz.lang.socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class SocketActionTable {
private boolean[] nots;
private SocketAction[] aary;
private Pattern[] ptns;
private Map<String, SocketAction> map;
SocketActionTable(Map<String, SocketAction> actions) {
List<String> rl = new ArrayList<String>(actions.size());
List<SocketAction> al = new ArrayList<SocketAction>(actions.size());
map = new HashMap<String, SocketAction>();
// 建立正则式列表
for (String key : actions.keySet()) {
// key 为空 ,相当于全部匹配
if (key == null) {
rl.add("$:.*");
al.add(actions.get(key));
}
// 通过一个正则表达式匹配动作
else if (key.startsWith("$:")) {
rl.add(key.substring(2));
al.add(actions.get(key));
}
// 精确匹配动作
else {
map.put(key, actions.get(key));
}
}
// 处理正则式列表中的 "!"
nots = new boolean[rl.size()];
Arrays.fill(nots, false);
aary = new SocketAction[nots.length];
ptns = new Pattern[nots.length];
for (int i = 0; i < nots.length; i++) {
aary[i] = al.get(i);
if (rl.get(i).startsWith("!")) {
nots[i] = true;
ptns[i] = Pattern.compile(rl.get(i).substring(1));
} else {
ptns[i] = Pattern.compile(rl.get(i));
}
}
}
/**
* 根据输入的行,得到一个动作执行对象
*
* @param line
* 输入的行
* @return 动作执对象,null 表示没有动作可以匹配这一行
*/
public SocketAction get(String line) {
// 是否有精确匹配
SocketAction sa = map.get(line);
if (null != sa)
return sa;
// 用正则式匹配
for (int i = 0; i < nots.length; i++) {
if (ptns[i].matcher(line).find() && !nots[i]) {
return aary[i];
} else if (nots[i]) {
return aary[i];
}
}
// 啥都没有 -_-!
return null;
}
}