improve wall filter

This commit is contained in:
wenshao
2013-04-05 20:10:25 +08:00
parent e6b1426426
commit 1e307461a4
3 changed files with 40 additions and 9 deletions
@@ -217,6 +217,11 @@ public final class DruidStatManagerFacade {
set.addAll((Set) valueA);
set.addAll((Set) valueB);
newMap.put(key, set);
} else if (valueA instanceof List && valueB instanceof List) {
List<Map<String, Object>> mergedList = mergeNamedList((List) valueA, (List) valueB);
newMap.put(key, mergedList);
} else if (valueA instanceof String && valueB instanceof String && valueA.equals(valueB) && "name".equals(key)) {
newMap.put(key, valueA);
} else {
Object sum = SQLEvalVisitorUtils.add(valueA, valueB);
newMap.put(key, sum);
@@ -227,6 +232,27 @@ public final class DruidStatManagerFacade {
return newMap;
}
private static List<Map<String, Object>> mergeNamedList(List listA, List listB) {
Map<String, Map<String, Object>> mapped = new HashMap<String, Map<String, Object>>();
for (Object item : (List) listA) {
Map<String, Object> map = (Map<String, Object>) item;
String name = (String) map.get("name");
mapped.put(name, map);
}
List<Map<String, Object>> mergedList = new ArrayList<Map<String, Object>>();
for (Object item : (List) listB) {
Map<String, Object> mapB = (Map<String, Object>) item;
String name = (String) mapB.get("name");
Map<String, Object> mapA = mapped.get(name);
Map<String, Object> mergedMap = mergWallStat(mapA, mapB);
mergedList.add(mergedMap);
}
return mergedList;
}
public List<Map<String, Object>> getSqlStatDataList(Object datasource) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
Map<?, ?> sqlStatMap = DruidDataSourceUtils.getSqlStatMap(datasource);
@@ -15,7 +15,7 @@
*/
package com.alibaba.druid.wall;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
@@ -42,7 +42,9 @@ public class WallFunctionStat {
}
public Map<String, Object> toMap() {
return Collections.<String, Object>singletonMap("invokeCount", invokeCount);
Map<String, Object> map = new HashMap<String, Object>();
map.put("invokeCount", invokeCount);
return map;
}
}
@@ -18,7 +18,6 @@ package com.alibaba.druid.wall;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -620,21 +619,25 @@ public abstract class WallProvider {
info.put("syntaxErrrorCount", this.getSyntaxErrorCount());
{
Map<String, Map<String, Object>> tables = new LinkedHashMap<String, Map<String, Object>>();
List<Map<String, Object>> tables = new ArrayList<Map<String, Object>>();
for (Map.Entry<String, WallTableStat> entry : this.tableStats.entrySet()) {
tables.put(entry.getKey(), entry.getValue().toMap());
Map<String, Object> statMap = entry.getValue().toMap();
statMap.put("name", entry.getKey());
tables.add(statMap);
}
info.put("tables", tables);
}
{
Map<String, Map<String, Object>> functions = new LinkedHashMap<String, Map<String, Object>>();
List<Map<String, Object>> functions = new ArrayList<Map<String, Object>>();
for (Map.Entry<String, WallFunctionStat> entry : this.functionStats.entrySet()) {
functions.put(entry.getKey(), entry.getValue().toMap());
Map<String, Object> statMap = entry.getValue().toMap();
statMap.put("name", entry.getKey());
functions.add(statMap);
}
info.put("functions", functions);
}
info.put("whiteList", this.getWhiteList());
info.put("blackList", this.getBlackList());
//info.put("whiteList", this.getWhiteList());
//info.put("blackList", this.getBlackList());
return info;
}
}