diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 5059d39691..1eee75d9f0 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -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> 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> mergeNamedList(List listA, List listB) { + Map> mapped = new HashMap>(); + for (Object item : (List) listA) { + Map map = (Map) item; + String name = (String) map.get("name"); + mapped.put(name, map); + } + + List> mergedList = new ArrayList>(); + for (Object item : (List) listB) { + Map mapB = (Map) item; + String name = (String) mapB.get("name"); + Map mapA = mapped.get(name); + + Map mergedMap = mergWallStat(mapA, mapB); + mergedList.add(mergedMap); + } + + return mergedList; + } + public List> getSqlStatDataList(Object datasource) { List> result = new ArrayList>(); Map sqlStatMap = DruidDataSourceUtils.getSqlStatMap(datasource); diff --git a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java index 6b11d50961..acbae8fb3c 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java @@ -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 toMap() { - return Collections.singletonMap("invokeCount", invokeCount); + Map map = new HashMap(); + map.put("invokeCount", invokeCount); + return map; } } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 6b347dc8ba..703f0c35cd 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -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> tables = new LinkedHashMap>(); + List> tables = new ArrayList>(); for (Map.Entry entry : this.tableStats.entrySet()) { - tables.put(entry.getKey(), entry.getValue().toMap()); + Map statMap = entry.getValue().toMap(); + statMap.put("name", entry.getKey()); + tables.add(statMap); } info.put("tables", tables); } { - Map> functions = new LinkedHashMap>(); + List> functions = new ArrayList>(); for (Map.Entry entry : this.functionStats.entrySet()) { - functions.put(entry.getKey(), entry.getValue().toMap()); + Map 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; } }