diff --git a/pom.xml b/pom.xml
index 8bb15ad0e6..7cccdf2648 100644
--- a/pom.xml
+++ b/pom.xml
@@ -527,5 +527,11 @@
2.0.2
test
+
+ com.alibaba
+ fastjson
+ 1.1.29
+ test
+
diff --git a/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java
index 2a951b5c2c..545ad66345 100644
--- a/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java
+++ b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java
@@ -18,7 +18,9 @@ package com.alibaba.druid.util;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import com.alibaba.druid.stat.JdbcSqlStat;
@@ -75,4 +77,20 @@ public class JdbcSqlStatUtils {
return updater.get(stat);
}
}
+
+ public static long get(AtomicLong counter, boolean reset) {
+ if (reset) {
+ return counter.getAndSet(0);
+ } else {
+ return counter.get();
+ }
+ }
+
+ public static int get(AtomicInteger counter, boolean reset) {
+ if (reset) {
+ return counter.getAndSet(0);
+ } else {
+ return counter.get();
+ }
+ }
}
diff --git a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java
index 4b589b3f00..e8a3842425 100644
--- a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java
+++ b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.wall;
+import static com.alibaba.druid.util.JdbcSqlStatUtils.get;
+
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
@@ -47,4 +49,9 @@ public class WallFunctionStat {
return map;
}
+ public WallFunctionStatValue getStatValue(boolean reset) {
+ WallFunctionStatValue statValue = new WallFunctionStatValue();
+ statValue.setInvokeCount(get(this, invokeCountUpdater, reset));
+ return statValue;
+ }
}
diff --git a/src/main/java/com/alibaba/druid/wall/WallFunctionStatValue.java b/src/main/java/com/alibaba/druid/wall/WallFunctionStatValue.java
new file mode 100644
index 0000000000..db412373e2
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/wall/WallFunctionStatValue.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 1999-2011 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.druid.wall;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class WallFunctionStatValue {
+
+ private String name;
+ private long invokeCount;
+
+ public WallFunctionStatValue(){
+
+ }
+
+ public WallFunctionStatValue(String name){
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public long getInvokeCount() {
+ return invokeCount;
+ }
+
+ public void setInvokeCount(long invokeCount) {
+ this.invokeCount = invokeCount;
+ }
+
+ public Map toMap() {
+ Map map = new LinkedHashMap(2);
+ map.put("name", name);
+ 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 79ff7e4f04..a2d4c83530 100644
--- a/src/main/java/com/alibaba/druid/wall/WallProvider.java
+++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java
@@ -15,17 +15,19 @@
*/
package com.alibaba.druid.wall;
+import static com.alibaba.druid.util.JdbcSqlStatUtils.get;
+
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import com.alibaba.druid.sql.SQLUtils;
@@ -45,6 +47,11 @@ import com.alibaba.druid.wall.violation.SyntaxErrorViolation;
public abstract class WallProvider {
+ private final Map attributes = new ConcurrentHashMap(
+ 1,
+ 0.75f,
+ 1);
+
private LRUCache whiteList;
private LRUCache whiteMergedList;
@@ -92,6 +99,10 @@ public abstract class WallProvider {
this.dbType = dbType;
}
+ public Map getAttributes() {
+ return attributes;
+ }
+
public void reset() {
this.checkCount.set(0);
this.hardCheckCount.set(0);
@@ -238,6 +249,7 @@ public abstract class WallProvider {
if (wallStat == null) {
wallStat = new WallSqlStat(tableStats, functionStats, syntaxError);
whiteMergedList.put(mergedSql, wallStat);
+ wallStat.setSample(sql);
}
wallStat.incrementAndGetExecuteCount();
@@ -275,6 +287,7 @@ public abstract class WallProvider {
if (wallStat == null) {
wallStat = new WallSqlStat(tableStats, functionStats, violations, syntaxError);
blackMergedList.put(mergedSql, wallStat);
+ wallStat.setSample(sql);
}
wallStat.incrementAndGetExecuteCount();
@@ -332,34 +345,6 @@ public abstract class WallProvider {
return Collections. unmodifiableSet(hashSet);
}
- public List