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