diff --git a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java index 0f3023420d..8dc1c633d7 100644 --- a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java +++ b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java @@ -207,6 +207,7 @@ public class WebStatFilter implements Filter { } webAppStat.computeUserAgent(userAgent); + webAppStat.incrementSessionCount(); } sessionStat.setUserAgent(userAgent); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java index ac829818cd..dd3e43d2cc 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java @@ -46,6 +46,7 @@ public class WebAppStat { private final AtomicInteger runningCount = new AtomicInteger(); private final AtomicInteger concurrentMax = new AtomicInteger(); private final AtomicLong requestCount = new AtomicLong(0); + private final AtomicLong sessionCount = new AtomicLong(0); private final AtomicLong jdbcFetchRowCount = new AtomicLong(); private final AtomicLong jdbcUpdateCount = new AtomicLong(); @@ -130,6 +131,7 @@ public class WebAppStat { concurrentMax.set(0); requestCount.set(0); requestCount.set(0); + sessionCount.set(0); jdbcFetchRowCount.set(0); jdbcUpdateCount.set(0); @@ -356,6 +358,14 @@ public class WebAppStat { } } + public void incrementSessionCount() { + sessionCount.incrementAndGet(); + } + + public long getSessionCount() { + return sessionCount.get(); + } + public void addJdbcFetchRowCount(long delta) { this.jdbcFetchRowCount.addAndGet(delta); } @@ -455,6 +465,7 @@ public class WebAppStat { data.put("RunningCount", this.getRunningCount()); data.put("ConcurrentMax", this.getConcurrentMax()); data.put("RequestCount", this.getRequestCount()); + data.put("SessionCount", this.getSessionCount()); data.put("JdbcCommitCount", this.getJdbcCommitCount()); data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); diff --git a/src/main/java/com/alibaba/druid/util/MapComparator.java b/src/main/java/com/alibaba/druid/util/MapComparator.java index 7e0ff4a20a..878cf8c67c 100644 --- a/src/main/java/com/alibaba/druid/util/MapComparator.java +++ b/src/main/java/com/alibaba/druid/util/MapComparator.java @@ -29,7 +29,7 @@ public class MapComparator implements Compar private boolean isDesc; private K orderByKey; - public MapComparator(K orderByKey, boolean isDesc) { + public MapComparator(K orderByKey, boolean isDesc){ this.orderByKey = orderByKey; this.isDesc = isDesc; } @@ -58,19 +58,23 @@ public class MapComparator implements Compar private Object getValueByKey(Map map, K key) { if (key instanceof String) { String keyStr = (String) key; + if (keyStr.matches(".+\\[[0-9]+\\]")) { Object value = map.get(keyStr.substring(0, keyStr.indexOf("["))); + if (value == null) return null; + Integer index = StringUtils.subStringToInteger(keyStr, "[", "]"); if (value.getClass().isArray() && Array.getLength(value) >= index) { return Array.get(value, index); } + return null; } } return map.get(key); } - public int compare_0(Map o1, Map o2) { + private int compare_0(Map o1, Map o2) { Object v1 = getValueByKey(o1, orderByKey); Object v2 = getValueByKey(o2, orderByKey); diff --git a/src/main/resources/support/http/resources/js/common.js b/src/main/resources/support/http/resources/js/common.js index 3641f3e9b7..b957d4a825 100644 --- a/src/main/resources/support/http/resources/js/common.js +++ b/src/main/resources/support/http/resources/js/common.js @@ -41,9 +41,9 @@ druid.common = function () { buildFooter : function() { var html = ''; + ' powered by AlibabaTech & sandzhang & melin'+ + ' '+ + ''; $(document.body).append(html); }, diff --git a/src/main/resources/support/http/resources/webapp.html b/src/main/resources/support/http/resources/webapp.html index b395a63988..9037e290cc 100644 --- a/src/main/resources/support/http/resources/webapp.html +++ b/src/main/resources/support/http/resources/webapp.html @@ -28,6 +28,7 @@ "RunningCount", "ConcurrentMax", "RequestCount", + "SessionCount", "JdbcCommitCount", "JdbcRollbackCount", diff --git a/src/main/resources/support/http/resources/weburi.html b/src/main/resources/support/http/resources/weburi.html index 6b445e01a2..9295409150 100644 --- a/src/main/resources/support/http/resources/weburi.html +++ b/src/main/resources/support/http/resources/weburi.html @@ -23,9 +23,10 @@ URI RequestCount RequestTime - RunningCount + Running Concurrent - JdbcCount + JdbcCount + JdbcError JdbcTime JdbcCommit JdbcRollback @@ -75,6 +76,7 @@ html += "" + stat.RunningCount + ""; html += "" + stat.ConcurrentMax + ""; html += "" + stat.JdbcExecuteCount + ""; + html += "" + stat.JdbcExecuteErrorCount + ""; html += "" + stat.JdbcExecuteTimeMillis + ""; html += "" + stat.JdbcCommitCount + ""; html += "" + stat.JdbcRollbackCount + ""; diff --git a/src/test/java/com/alibaba/druid/util/MapComparatorTest.java b/src/test/java/com/alibaba/druid/util/MapComparatorTest.java new file mode 100644 index 0000000000..f69fe13938 --- /dev/null +++ b/src/test/java/com/alibaba/druid/util/MapComparatorTest.java @@ -0,0 +1,166 @@ +/* + * 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.util; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MapComparatorTest extends TestCase { + + private String orderByKey = "orderby"; + + public void test_comparator_date() throws Exception { + test_comparator_date_0(true); + test_comparator_date_0(false); + } + + public void test_comparator_String() throws Exception { + test_comparator_string_0(true); + test_comparator_string_0(false); + } + + public void test_comparator_number() throws Exception { + test_comparator_number_0(true); + test_comparator_number_0(false); + } + + public void test_comparator_array() throws Exception { + test_comparator_array_0(true); + test_comparator_array_0(false); + } + + private void test_comparator_array_0(boolean desc) throws Exception { + String orderByKey = "orderby"; + long now = System.currentTimeMillis(); + MapComparator comparator = new MapComparator(orderByKey + "[0]", desc); + + Map map1 = new HashMap(); + Map map2 = new HashMap(); + + map1.put(orderByKey, new Date[] { new Date(now) }); + map2.put(orderByKey, new Date[] { new Date(now - 1) }); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map2.put(orderByKey, new Date[] { new Date(now) }); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + map2.put(orderByKey, new Date[] { new Date(now + 1) }); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map2.put(orderByKey, null); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, new Date[] { new Date(now) }); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, null); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + } + + private void test_comparator_date_0(boolean desc) throws Exception { + long now = System.currentTimeMillis(); + MapComparator comparator = new MapComparator(orderByKey, desc); + + Map map1 = new HashMap(); + Map map2 = new HashMap(); + + map1.put(orderByKey, new Date(now)); + map2.put(orderByKey, new Date(now - 1)); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map2.put(orderByKey, new Date(now)); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + map2.put(orderByKey, new Date(now + 1)); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map2.put(orderByKey, null); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, new Date(now)); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, null); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + } + + private void test_comparator_string_0(boolean desc) throws Exception { + MapComparator comparator = new MapComparator(orderByKey, desc); + + Map map1 = new HashMap(); + Map map2 = new HashMap(); + + map1.put(orderByKey, "opq"); + map2.put(orderByKey, "xyz"); + Assert.assertEquals(desc, comparator.compare(map1, map2) > 0); + + map2.put(orderByKey, "opq"); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + map2.put(orderByKey, "abc"); + Assert.assertEquals(desc, comparator.compare(map1, map2) < 0); + + map2.put(orderByKey, null); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, "opq"); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, null); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + } + + private void test_comparator_number_0(boolean desc) throws Exception { + MapComparator comparator = new MapComparator(orderByKey, desc); + double baseNumber = 100.123; + + Map map1 = new HashMap(); + Map map2 = new HashMap(); + + map1.put(orderByKey, baseNumber); + map2.put(orderByKey, baseNumber - 1); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map2.put(orderByKey, baseNumber); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + + map2.put(orderByKey, baseNumber + 1); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map2.put(orderByKey, null); + Assert.assertEquals(!desc, comparator.compare(map1, map2) > 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, baseNumber); + Assert.assertEquals(!desc, comparator.compare(map1, map2) < 0); + + map1.put(orderByKey, null); + map2.put(orderByKey, null); + Assert.assertEquals(true, comparator.compare(map1, map2) == 0); + } +}