From 456042c15171e59341b3ecb1b74d2c4b6fce81cc Mon Sep 17 00:00:00 2001 From: "shrek.wang" Date: Tue, 4 Sep 2012 15:04:16 +0800 Subject: [PATCH 01/13] fixes activeConnectionStackTrace.html didn't show data issue --- .../resources/activeConnectionStackTrace.html | 117 +++++++++--------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/src/main/resources/support/http/resources/activeConnectionStackTrace.html b/src/main/resources/support/http/resources/activeConnectionStackTrace.html index 92f0e5e7e8..5f5c3efe29 100644 --- a/src/main/resources/support/http/resources/activeConnectionStackTrace.html +++ b/src/main/resources/support/http/resources/activeConnectionStackTrace.html @@ -1,61 +1,66 @@ - - Druid ActiveConnection StackTrace - - - - - - - -
-

ActiveConnection StackTrace for Datasource - [View JSON API] -

-
- -
-
-
- + + + +
+

ActiveConnection StackTrace for Datasource + [View JSON API] +

+
+ +
+
+ - + for ( var i = 0; i < conntionStackTraceList.length; i++) { + if (i > 0) { + content.push("
"); + } + var conntionStackTrace = conntionStackTraceList[i]; + content.push(""); + } + $("#activeConnectionStackTraceDiv").html(content.join("")); + }, + dataType: "json" + }); + } + } + }(); + + $(document).ready(function() { + druid.activeConnectionStackTrace.init(); + }); + + From f2123801a879249d116defeff3245177cfafd22f Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Wed, 5 Sep 2012 20:02:25 +0800 Subject: [PATCH 02/13] =?UTF-8?q?1.=E4=BF=AE=E6=AD=A3=E4=BA=86jconsole?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E6=95=B0=E6=8D=AE=E6=BA=90=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=8F=AA=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=95=B0=E6=8D=AE=E6=BA=90=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E7=9A=84bug=E3=80=82=202.=E4=BF=AE=E6=94=B9=E4=BA=86j?= =?UTF-8?q?console=E7=95=8C=E9=9D=A2=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=88=86=E4=B8=BA=E4=B8=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E3=80=82=E6=95=B0=E6=8D=AE=E5=8C=BA=E5=92=8C=E7=89=88=E6=9D=83?= =?UTF-8?q?=E5=8C=BA=E3=80=82=203.=E7=BB=99jconsole=E7=9A=84sql=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=98=BE=E7=A4=BA=E5=8C=BA=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E8=A1=A8=E5=A4=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jconsole/DruidDataSourcePanel.java | 183 +++++--- .../support/jconsole/DruidDriverPanel.java | 109 ++--- .../druid/support/jconsole/DruidPanel.java | 354 ++++++++------- .../druid/support/jconsole/DruidSQLPanel.java | 404 +++++++++++++----- .../support/jconsole/model/ColumnGroup.java | 203 +++++++++ .../model/DruidTableCellRenderer.java | 36 ++ .../jconsole/model/DruidTableModel.java | 237 +++++----- .../jconsole/model/GroupableTableHeader.java | 77 ++++ .../model/GroupableTableHeaderUI.java | 236 ++++++++++ .../jconsole/model/RowHeaderTable.java | 314 +++++++------- .../jconsole/util/TableDataProcessor.java | 226 ++++++---- 11 files changed, 1625 insertions(+), 754 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java create mode 100644 src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java create mode 100644 src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java create mode 100644 src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java index 8dee034f71..7761b2d606 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java @@ -1,71 +1,112 @@ -/* - * 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.support.jconsole; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -import com.alibaba.druid.support.jconsole.model.DruidTableModel; -import com.alibaba.druid.support.jconsole.model.RowHeaderTable; -import com.alibaba.druid.support.jconsole.util.TableDataProcessor; -import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; - -/** - * 请求地址:/datasource.json - * - * 请求返回的json格式: - * {"ResultCode":1, - * "Content": - * [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql", - * "DriverClassName":"com.mysql.jdbc.Driver", - * "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root", - * "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"], - * "WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1, - * "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012", - * "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0, - * "LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker", - * "ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter", - * "TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true, - * "DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0, - * "PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0, - * "ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31, - * "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0, - * "TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0], - * "RemoveAbandoned":false - * }] - * } - * */ -public class DruidDataSourcePanel extends DruidPanel { - - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/datasource.json"; - private static final String KEY_WORD_IDENTITY = "Identity"; - - public DruidDataSourcePanel() { - super(); - this.url = REQUEST_URL; - } - @Override - protected void tableDataProcess( - ArrayList> data) { - ColumnData columnData = TableDataProcessor.row2col(data, KEY_WORD_IDENTITY); - tableModel = new DruidTableModel(columnData.getDatas()); - table.setModel(tableModel); - RowHeaderTable header = new RowHeaderTable( - columnData.getNames(),table,50,columnData.getCount()); - scrollPane.setRowHeaderView(header); - } -} +/* + * 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.support.jconsole; + +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.border.TitledBorder; + +import com.alibaba.druid.support.jconsole.model.DruidTableCellRenderer; +import com.alibaba.druid.support.jconsole.model.DruidTableModel; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; + +/** + * 请求地址:/datasource.json + * + * 请求返回的json格式: {"ResultCode":1, "Content": + * [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql", + * "DriverClassName":"com.mysql.jdbc.Driver", + * "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root", + * "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"], + * "WaitThreadCount" + * :0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1, + * "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime": + * "Tue Aug 21 21:22:33 CST 2012", + * "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout" + * :0,"TransactionQueryTimeout":0, + * "LoginTimeout":0,"ValidConnectionCheckerClassName" + * :"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker", + * "ExceptionSorterClassName" + * :"com.alibaba.druid.pool.vendor.MySqlExceptionSorter", + * "TestOnBorrow":false,"TestOnReturn" + * :false,"TestWhileIdle":true,"DefaultAutoCommit":true, + * "DefaultReadOnly":true,"LogicConnectCount" + * :93,"LogicCloseCount":93,"LogicConnectErrorCount":0, + * "PhysicalConnectCount":1, + * "PhysicalCloseCount":0,"PhysicalConnectErrorCount":0, + * "ExecuteCount":93,"ErrorCount" + * :0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31, + * "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0, + * "TransactionHistogram" + * :[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0], + * "RemoveAbandoned":false }] } + * */ +public class DruidDataSourcePanel extends DruidPanel { + + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/datasource.json"; + private static final String KEY_WORD_IDENTITY = "Identity"; + private JPanel contentPanel; + + public DruidDataSourcePanel() { + super(); + this.url = REQUEST_URL; + + } + + private void addTable(ColumnData columnData) { + ArrayList>> data + = columnData.getTableDatas(); + + int i = 0; + ArrayList ids = columnData.getNames(); + + for (ArrayList> listNow : data) { + + tableModel = new DruidTableModel(listNow); + table.setModel(tableModel); + + String id = ids.get(i); + JPanel panelNow = new JPanel(new BorderLayout()); + panelNow.setBorder((TitledBorder) BorderFactory + .createTitledBorder(KEY_WORD_IDENTITY + ":" + id)); + contentPanel.add(panelNow); + + panelNow.add(table.getTableHeader(),BorderLayout.NORTH); + panelNow.add(table); + table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); + + i++; + } + } + + @Override + protected void tableDataProcess( + ArrayList> data) { + ColumnData columnData = TableDataProcessor.mutilRow2col(data, + KEY_WORD_IDENTITY); + contentPanel = new JPanel(new GridLayout(0,1)); + addTable(columnData); + + scrollPane.setViewportView(contentPanel); + } +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java index 21f3fb613e..a202a17ce0 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java @@ -1,51 +1,58 @@ -/* - * 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.support.jconsole; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -import com.alibaba.druid.support.jconsole.model.DruidTableModel; - -/** - * 请求地址:/basic.json - * - * 请求返回的json格式: - * {"ResultCode":1,"Content": - * {"Version":"0.2.6","Drivers": - * ["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver", - * "com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"] - * } - * } - * */ -public class DruidDriverPanel extends DruidPanel { - - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/basic.json"; - - public DruidDriverPanel() { - super(); - url = REQUEST_URL; - } - - @Override - protected void tableDataProcess( - ArrayList> data) { - tableModel = new DruidTableModel(data); - table.setModel(tableModel); - } -} - +/* + * 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.support.jconsole; + +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import com.alibaba.druid.support.jconsole.model.DruidTableCellRenderer; +import com.alibaba.druid.support.jconsole.model.DruidTableModel; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; + +/** + * 请求地址:/basic.json + * + * 请求返回的json格式: + * {"ResultCode":1,"Content": + * {"Version":"0.2.6","Drivers": + * ["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver", + * "com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"] + * } + * } + * */ +public class DruidDriverPanel extends DruidPanel { + + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/basic.json"; + + public DruidDriverPanel() { + super(); + url = REQUEST_URL; + } + + @Override + protected void tableDataProcess( + ArrayList> data) { + ColumnData columnData = TableDataProcessor.row2col(data); + tableModel = new DruidTableModel(columnData.getDatas()); + table.setModel(tableModel); + table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); + + scrollPane.setViewportView(table); + } +} + diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java index a7882a9ddf..518c3d0f5f 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java @@ -1,164 +1,192 @@ -/* - * 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.support.jconsole; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.management.MBeanServerConnection; -import javax.management.ObjectName; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; - -import com.alibaba.druid.stat.DruidStatService; -import com.alibaba.druid.support.jconsole.model.DruidTableModel; -import com.alibaba.druid.support.json.JSONUtils; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; -import com.sun.tools.jconsole.JConsoleContext; - -public abstract class DruidPanel extends JPanel { - - private static final long serialVersionUID = 1L; - protected static final int RESP_SUCCESS_RESULT = 1; - protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; - protected static final String RESP_JSON_CONTENT_KEY = "Content"; - protected static final long DEFAULT_ACTIVE_TIME = 5*60*1000; - - protected static final int DRUID_TABLE_WIDTH = 600; - protected static final int DRUID_TABLE_HEIGHT = 500; - - protected JScrollPane scrollPane; - protected DruidTableModel tableModel; - protected JTable table; - protected String url; - - /** 界面刷新的间隔时间,单位为毫秒. */ - protected long activeTime; - protected long lastRefreshTime; - private final static Log LOG = LogFactory.getLog(DruidPanel.class); - - protected DruidPanel(long activeTime) { - this.activeTime = activeTime; - } - - protected DruidPanel() { - activeTime = DEFAULT_ACTIVE_TIME; - } - - @SuppressWarnings("unchecked") - protected ArrayList> parseData(Object respData) { - ArrayList> data = null; - if (respData instanceof Map) { - LinkedHashMap map = (LinkedHashMap)respData; - int rv = (Integer)map.get(RESP_JSON_RESULT_KEY); - - if (rv == RESP_SUCCESS_RESULT) { - Object content = map.get(RESP_JSON_CONTENT_KEY); - if (content instanceof List) { - data = (ArrayList>)content; - } else if (content instanceof Map) { - LinkedHashMap contentEle - = (LinkedHashMap)content; - data = new ArrayList>(); - data.add(contentEle); - } - } - } - return data; - } - - protected Object getData(String url,MBeanServerConnection conn) throws Exception { - Object o = null; - ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); - - String result = (String) conn.invoke(name, "service", - new String[] { url }, new String[] { String.class.getName() }); - o = JSONUtils.parse(result); - if (LOG.isDebugEnabled()) { - LOG.debug(o.toString()); - } - return o; - } - - protected abstract void tableDataProcess(ArrayList> data); - - protected void addOrRefreshTable(String url,MBeanServerConnection conn) throws Exception { - if (url != null) { - boolean needRefresh = false; - long timeNow = new Date().getTime(); - if (scrollPane == null) { - table = new JTable(); - - scrollPane = new JScrollPane(table); - scrollPane.setAutoscrolls(true); - GridBagLayout gridbag = new GridBagLayout(); - GridBagConstraints c = new GridBagConstraints(); - setLayout(gridbag); - - c.fill = GridBagConstraints.BOTH; - c.gridx = 0; - c.gridy = 0; - c.weightx = 9; - c.weighty = 9; - - gridbag.setConstraints(scrollPane, c); - - this.add(scrollPane); - needRefresh = true; - lastRefreshTime = timeNow; - } else { - if (lastRefreshTime + activeTime < timeNow) { - needRefresh = true; - lastRefreshTime = timeNow; - } - } - if (needRefresh) { - LOG.debug("refresh" + timeNow); - ArrayList> data = parseData(getData( - url, conn)); - if (data != null) { - tableDataProcess(data); - } - } - - } else { - // url不存在 - LOG.warn("url不存在"); - } - } - - protected Object doInBackground(JConsoleContext context) throws Exception { - doInBackground(context.getMBeanServerConnection()); - - return null; - } - - protected void doInBackground(MBeanServerConnection conn) { - - try { - addOrRefreshTable(url,conn); - } catch (Exception e) { - LOG.warn("", e); - } - } +/* + * 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.support.jconsole; + +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.border.TitledBorder; + +import com.alibaba.druid.stat.DruidStatService; +import com.alibaba.druid.support.jconsole.model.DruidTableModel; +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; +import com.sun.tools.jconsole.JConsoleContext; + +public abstract class DruidPanel extends JPanel { + + private static final long serialVersionUID = 1L; + protected static final int RESP_SUCCESS_RESULT = 1; + protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; + protected static final String RESP_JSON_CONTENT_KEY = "Content"; + protected static final long DEFAULT_ACTIVE_TIME = 5*60*1000; + private static final String COPYRIGHT_STRING = "powered by yunnysunny"; + + protected JScrollPane scrollPane; + protected DruidTableModel tableModel; + protected JTable table; + protected JPanel copyrightPanel; + protected String url; + + /** 界面刷新的间隔时间,单位为毫秒. */ + protected long activeTime; + protected long lastRefreshTime; + private final static Log LOG = LogFactory.getLog(DruidPanel.class); + + protected DruidPanel(long activeTime) { + this.activeTime = activeTime; + } + + protected DruidPanel() { + activeTime = DEFAULT_ACTIVE_TIME; + } + + @SuppressWarnings("unchecked") + protected ArrayList> parseData(Object respData) { + ArrayList> data = null; + if (respData instanceof Map) { + LinkedHashMap map = (LinkedHashMap)respData; + int rv = (Integer)map.get(RESP_JSON_RESULT_KEY); + + if (rv == RESP_SUCCESS_RESULT) { + Object content = map.get(RESP_JSON_CONTENT_KEY); + if (content instanceof List) { + data = (ArrayList>)content; + } else if (content instanceof Map) { + LinkedHashMap contentEle + = (LinkedHashMap)content; + data = new ArrayList>(); + data.add(contentEle); + } + } + } + return data; + } + + protected Object getData(String url,MBeanServerConnection conn) throws Exception { + Object o = null; + ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); + + String result = (String) conn.invoke(name, "service", + new String[] { url }, new String[] { String.class.getName() }); + o = JSONUtils.parse(result); + if (LOG.isDebugEnabled()) { + LOG.debug(o.toString()); + } + return o; + } + + protected abstract void tableDataProcess(ArrayList> data); + + protected void addOrRefreshTable(String url,MBeanServerConnection conn) throws Exception { + if (url != null) { + boolean needRefresh = false; + long timeNow = new Date().getTime(); + if (scrollPane == null) { + table = new JTable(); + + scrollPane = new JScrollPane(); + scrollPane.setAutoscrolls(true); + scrollPane.setBorder((TitledBorder)BorderFactory.createTitledBorder("数据区")); + + setLayout(null); + scrollPane.setBounds(10, 10, getWidth()-20, getHeight()-80); + + this.add(scrollPane); + + copyrightPanel = new JPanel(); + copyrightPanel.setBorder((TitledBorder)BorderFactory.createTitledBorder("版权区")); + JLabel authorInfo = new JLabel(COPYRIGHT_STRING); + copyrightPanel.add(authorInfo); + + this.add(copyrightPanel); + copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60); + + needRefresh = true; + lastRefreshTime = timeNow; + this.addComponentListener(new ComponentListener() { + + @Override + public void componentShown(ComponentEvent arg0) { + + } + + @Override + public void componentResized(ComponentEvent arg0) { + scrollPane.setBounds(10, 10, getWidth()-20, + getHeight()-80); + copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60); + } + + @Override + public void componentMoved(ComponentEvent arg0) { + + } + + @Override + public void componentHidden(ComponentEvent arg0) { + + } + }); + } else { + if (lastRefreshTime + activeTime < timeNow) { + needRefresh = true; + lastRefreshTime = timeNow; + } + } + if (needRefresh) { + LOG.debug("refresh" + timeNow); + ArrayList> data = parseData(getData( + url, conn)); + if (data != null) { + tableDataProcess(data); + } + } + + } else { + // url不存在 + LOG.warn("url不存在"); + } + } + + protected Object doInBackground(JConsoleContext context) throws Exception { + doInBackground(context.getMBeanServerConnection()); + + return null; + } + + protected void doInBackground(MBeanServerConnection conn) { + + try { + addOrRefreshTable(url,conn); + } catch (Exception e) { + LOG.warn("", e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java index 81ad7703c3..b3e6b88732 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java @@ -1,109 +1,295 @@ -/* - * 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.support.jconsole; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -import com.alibaba.druid.support.jconsole.model.DruidTableModel; -import com.alibaba.druid.support.jconsole.model.RowHeaderTable; -/** - * 请求地址 /sql.json - * - * 返回数据格式: - *
- * {
-    "ResultCode": 1,
-    "Content": [
-        {
-            "BatchSizeMax": 0,
-            "BatchSizeTotal": 0,
-            "ConcurrentMax": 1,
-            "DbType": "h2",
-            "EffectedRowCount": 18,
-            "EffectedRowCountHistogram": [
-                0,6,0,0,0,0
-            ],
-            "EffectedRowCountMax": 4,
-            "ErrorCount": 0,
-            "ExecuteAndResultHoldTimeHistogram": [
-                5,0,1,0,0,0,0,0
-            ],
-            "ExecuteAndResultSetHoldTime": 0,
-            "ExecuteCount": 6,
-            "FetchRowCount": 0,
-            "FetchRowCountHistogram": [
-                6,0,0,0,0,0
-            ],
-            "FetchRowCountMax": 0,
-            "Histogram": [
-                5,0,1,0,0,0,0,0
-            ],
-            "ID": 9,
-            "InTransactionCount": 6,
-            "LastSlowParameters": "[4]",
-            "LastTime": "2012-08-22 02:57:56",
-            "MaxTimespan": 18,
-            "MaxTimespanOccurTime": "2012-08-22 12:38:56",
-            "ResultSetHoldTime": 0,
-            "RunningCount": 0,
-            "SQL": "delete from acct_group_permission where group_id=?",
-            "TotalTime": 21
-        },
-     ]
-  }
-  
- * */ -public class DruidSQLPanel extends DruidPanel { - - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/sql.json"; - private static final ArrayList SHOW_LIST = new ArrayList() { - - private static final long serialVersionUID = 1L; - - { - add("SQL"); - add("ExecuteCount"); - add("TotalTime"); - add("InTransactionCount"); - add("ErrorCount"); - add("EffectedRowCount"); - add("FetchRowCount"); - add("RunningCount"); - add("ConcurrentMax"); - add("Histogram"); - add("EffectedRowCountHistogram"); - add("ExecuteAndResultHoldTimeHistogram"); - add("FetchRowCountHistogram"); - } - }; - - public DruidSQLPanel() { - super(); - this.url = REQUEST_URL; - } - - @Override - protected void tableDataProcess( - ArrayList> data) { - tableModel = new DruidTableModel(data,SHOW_LIST); - table.setModel(tableModel); - - RowHeaderTable header = new RowHeaderTable(table,20); - scrollPane.setRowHeaderView(header); - } -} +/* + * 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.support.jconsole; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingConstants; +import javax.swing.border.BevelBorder; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableColumnModel; + +import com.alibaba.druid.support.jconsole.model.ColumnGroup; +import com.alibaba.druid.support.jconsole.model.DruidTableModel; +import com.alibaba.druid.support.jconsole.model.GroupableTableHeader; +import com.alibaba.druid.support.jconsole.model.GroupableTableHeaderUI; +import com.alibaba.druid.support.jconsole.model.RowHeaderTable; +/** + * 请求地址 /sql.json + * + * 返回数据格式: + *
+ * {
+    "ResultCode": 1,
+    "Content": [
+        {
+            "BatchSizeMax": 0,
+            "BatchSizeTotal": 0,
+            "ConcurrentMax": 1,
+            "DbType": "h2",
+            "EffectedRowCount": 18,
+            "EffectedRowCountHistogram": [
+                0,6,0,0,0,0
+            ],
+            "EffectedRowCountMax": 4,
+            "ErrorCount": 0,
+            "ExecuteAndResultHoldTimeHistogram": [
+                5,0,1,0,0,0,0,0
+            ],
+            "ExecuteAndResultSetHoldTime": 0,
+            "ExecuteCount": 6,
+            "FetchRowCount": 0,
+            "FetchRowCountHistogram": [
+                6,0,0,0,0,0
+            ],
+            "FetchRowCountMax": 0,
+            "Histogram": [
+                5,0,1,0,0,0,0,0
+            ],
+            "ID": 9,
+            "InTransactionCount": 6,
+            "LastSlowParameters": "[4]",
+            "LastTime": "2012-08-22 02:57:56",
+            "MaxTimespan": 18,
+            "MaxTimespanOccurTime": "2012-08-22 12:38:56",
+            "ResultSetHoldTime": 0,
+            "RunningCount": 0,
+            "SQL": "delete from acct_group_permission where group_id=?",
+            "TotalTime": 21
+        },
+     ]
+  }
+  
+ * */ +public class DruidSQLPanel extends DruidPanel { + + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/sql.json"; + private static final ArrayList SHOW_LIST = new ArrayList() { + + private static final long serialVersionUID = 1L; + + { + add("SQL"); + add("ExecuteCount"); + add("TotalTime"); + add("InTransactionCount"); + add("ErrorCount"); + add("EffectedRowCount"); + add("FetchRowCount"); + add("RunningCount"); + add("ConcurrentMax"); + add("Histogram"); + add("EffectedRowCountHistogram"); + add("ExecuteAndResultHoldTimeHistogram"); + add("FetchRowCountHistogram"); + } + + }; + private static final ArrayList REAL_SHOW_LIST = new ArrayList() { + + private static final long serialVersionUID = 1L; + + { + add("SQL"); + add("ExecuteCount"); + add("TotalTime"); + add("InTransactionCount"); + add("ErrorCount"); + add("EffectedRowCount"); + add("FetchRowCount"); + add("RunningCount"); + add("ConcurrentMax"); + add("Histogram"); + add("EffectedRowCountHistogram"); + add("ExecuteAndResultHoldTimeHistogram"); + add("FetchRowCountHistogram"); + } + }; + private static final String HISOGRAM = "Histogram"; + private static final String Effected_RowCount_HISOGRAM = "EffectedRowCountHistogram"; + private static final String ExecuteAndResult_Hold_HISOGRAM = "ExecuteAndResultHoldTimeHistogram"; + private static final String FetchRowCount_HISOGRAM = "FetchRowCountHistogram"; + private static final ArrayList ARRAY_DATA_MAP = new ArrayList() { + private static final long serialVersionUID = 1L; + { + add(HISOGRAM); + add(Effected_RowCount_HISOGRAM); + add(ExecuteAndResult_Hold_HISOGRAM); + add(FetchRowCount_HISOGRAM); + } + }; + private static final int FIST_LIST_OFFSET = 9; + + private ColumnGroup groupHistogram; + private ColumnGroup groupEffectedRowCountHistogram; + private ColumnGroup groupExecuteAndResultHoldTimeHistogram; + private ColumnGroup groupFetchRowCountHistogram; + private ArrayList listHistogram; + private ArrayList listEffectedRowCountHistogram; + private ArrayList listExecuteAndResultHoldTimeHistogram; + private ArrayList listFetchRowCountHistogram; + + + public DruidSQLPanel() { + super(); + this.url = REQUEST_URL; + } + + private void addGroupData(String keyNow, int index) { +// System.out.println("keyNow:"+keyNow+"index:"+index); + if (HISOGRAM.equals(keyNow)) { + listHistogram.add(index); + } else if (Effected_RowCount_HISOGRAM.equals(keyNow)) { + listEffectedRowCountHistogram.add(index); + } else if (ExecuteAndResult_Hold_HISOGRAM.equals(keyNow)) { + listExecuteAndResultHoldTimeHistogram.add(index); + } else if (FetchRowCount_HISOGRAM.equals(keyNow)) { + listFetchRowCountHistogram.add(index); + } + } + + /** + * 数据预处理,将没有用到的数据删除掉,将牵扯到时间分布的数据拆分出来。 + * + * @param data 要处理的数据 + * @return 最终的处理结果 + */ + private ArrayList> preProcess( + ArrayList> data) { + groupHistogram = new ColumnGroup(HISOGRAM); + groupEffectedRowCountHistogram = new ColumnGroup(Effected_RowCount_HISOGRAM); + groupExecuteAndResultHoldTimeHistogram = new ColumnGroup(ExecuteAndResult_Hold_HISOGRAM); + groupFetchRowCountHistogram = new ColumnGroup(FetchRowCount_HISOGRAM); + listHistogram = new ArrayList(); + listEffectedRowCountHistogram = new ArrayList(); + listExecuteAndResultHoldTimeHistogram = new ArrayList(); + listFetchRowCountHistogram = new ArrayList(); + + ArrayList> newData + = new ArrayList>(); + int dataIndex = 0; + for (LinkedHashMap dataNow : data) { + //先把不需要显示的内容删除掉 + for (Iterator> it = dataNow.entrySet().iterator(); it.hasNext();) { + Entry entry = it.next(); + if (!SHOW_LIST.contains(entry.getKey())) { + it.remove(); + } + } +// if (dataIndex==0) +// System.out.println(dataNow.toString()); + int offset = FIST_LIST_OFFSET; + + for (String arrayKey:ARRAY_DATA_MAP) {//把数组数据显示为单个数据 + Object arrayData = dataNow.get(arrayKey); + + if (arrayData instanceof ArrayList) { + + dataNow.remove(arrayKey); + if (dataIndex == 0) { + REAL_SHOW_LIST.remove(arrayKey); + } + @SuppressWarnings("unchecked") + ArrayList arrayDataList = (ArrayList)arrayData; + for (int j=0,len=arrayDataList.size();j= 0)? + (int)Math.pow(10,j-1) + : 0; + int b = (int)Math.pow(10,j); + String newKey = arrayKey + "-" +a + "~" + b+"ms"; + + dataNow.put(newKey, arrayDataList.get(j)); + if (dataIndex == 0) { + REAL_SHOW_LIST.add(newKey); + int index = offset+j; + addGroupData(arrayKey,index); + if (j == len -1) { + offset = index+1; + } + } + } + } else { + + } + + }//end of foreach ARRAY_DATA_MAP + dataIndex ++; + newData.add(dataNow); + } + + return newData; + } + + private void addTableGroup() { + + TableColumnModel cm = table.getColumnModel(); +// System.out.println(SHOW_LIST.size()); + for(int i : listHistogram) { + groupHistogram.add(cm.getColumn(i)); + } + for (int j: listEffectedRowCountHistogram) { + groupEffectedRowCountHistogram.add(cm.getColumn(j)); + } + for (int x : listExecuteAndResultHoldTimeHistogram) { + groupExecuteAndResultHoldTimeHistogram.add(cm.getColumn(x)); + } + for (int y : listFetchRowCountHistogram) { + groupFetchRowCountHistogram.add(cm.getColumn(y)); + } + + GroupableTableHeader header = (GroupableTableHeader) table. getTableHeader(); + header.addColumnGroup(groupHistogram); + header.addColumnGroup(groupEffectedRowCountHistogram); + header.addColumnGroup(groupExecuteAndResultHoldTimeHistogram); + header.addColumnGroup(groupFetchRowCountHistogram); + header.setUI(new GroupableTableHeaderUI()); + } + + @Override + protected void tableDataProcess( + ArrayList> data) { + table = new JTable() { + private static final long serialVersionUID = 1L; + + @Override + protected JTableHeader createDefaultTableHeader() { + + return new GroupableTableHeader(columnModel); + } + }; + data = preProcess(data); +// System.out.println(SHOW_LIST); + tableModel = new DruidTableModel(data,REAL_SHOW_LIST); +// System.out.println(data.toString()); + table.setModel(tableModel); + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + addTableGroup(); + + RowHeaderTable header = new RowHeaderTable(table,20); + scrollPane.setRowHeaderView(header); + scrollPane.setViewportView(table); + JLabel jb = new JLabel("N",SwingConstants.CENTER); + jb.setBorder(new BevelBorder(BevelBorder.RAISED,null,null,null,null)); + scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,jb); + } +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java b/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java new file mode 100644 index 0000000000..3c3946d512 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java @@ -0,0 +1,203 @@ +package com.alibaba.druid.support.jconsole.model; + +import java.awt.Component; +import java.awt.Dimension; +import java.util.Enumeration; +import java.util.Vector; + +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.UIManager; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; + +public class ColumnGroup { + /**合并的JTableHeader的Renderer*/ + protected TableCellRenderer renderer=null; + /**合并的单元格的各个实际的最小单元格存储结构*/ + protected Vector vector=null; + /**合并后单元格显示的文本信息*/ + protected String text=null; + /**合并的单元格内部两个最小JTableHeader的间隙,其实就是去掉线后那个Border*/ + private int margin = 0; + + public ColumnGroup(String text) { + this(null, text); + } + + public ColumnGroup(TableCellRenderer renderer, String text) { + if (renderer == null) { + this.renderer = new DefaultTableCellRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, + int row, int column) { + JTableHeader header = table.getTableHeader(); + if (header != null) { + setForeground(header.getForeground()); + setBackground(header.getBackground()); + setFont(header.getFont()); + } + setHorizontalAlignment(JLabel.CENTER); + this.setText((value == null) ? "" : value.toString()); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + return this; + } + }; + } else { + this.renderer = renderer; + } + this.text = text; + vector = new Vector(); + } + /** + * 增加单元格 + * @param obj + */ + public void add(Object obj) { + if (obj == null) + return; + vector.addElement(obj); + } + /** + * 根据JTable的某一列取得它的所有的包含列, + * @param column + * @param group + * @return + */ + public Vector getColumnGroups(TableColumn column, Vector group) { + //通过递归判断列到底属于那个ColumnGroup + group.addElement(this); + if (vector.contains(column)) + return group; + Enumeration enumeration = vector.elements(); + while (enumeration.hasMoreElements()) { + Object obj = enumeration.nextElement(); + if (obj instanceof ColumnGroup) { + @SuppressWarnings("unchecked") + Vector groups = ((ColumnGroup) obj).getColumnGroups(column, + (Vector) group.clone()); + if (groups != null) { + return groups; + } + } + } + return null; + } + + public TableCellRenderer getHeaderRenderer() { + return renderer; + } + + public Object getHeaderValue() { + return text; + } + /** + * 取得合并后的单元格的大小 + * @return + */ + public int getSize() { + return vector == null ? 0 : vector.size(); + } + /** + * 取得合并后的单元格的大小,这个方法需要计算,首先 + * 是取得一个没有合并的最小单元格的JTableHeader + * 的大小,通过Renderer取得组件 + * @return + */ + public Dimension getSize(JTable table) { + Component comp = renderer.getTableCellRendererComponent(table, + getHeaderValue(), false, false, -1, -1); + int height = comp.getPreferredSize().height; + int width = 0; + //宽度需要计算合并的还要加上间隙 + Enumeration enumeration = vector.elements(); + while (enumeration.hasMoreElements()) { + Object obj = enumeration.nextElement(); + if (obj instanceof TableColumn) { + TableColumn aColumn = (TableColumn) obj; + width += aColumn.getWidth(); + width += margin; + } else { + width += ((ColumnGroup) obj).getSize(table).width; + } + } + return new Dimension(width, height); + } + + public java.lang.String getText() { + return text; + } + + public boolean removeColumn(ColumnGroup ptg, TableColumn tc) { + boolean retFlag = false; + if (tc != null) { + for (int i = 0; i < ptg.vector.size(); i++) { + Object tmpObj = ptg.vector.get(i); + if (tmpObj instanceof ColumnGroup) { + retFlag = removeColumn((ColumnGroup) tmpObj, tc); + if (retFlag) { + break; + } + } else if (tmpObj instanceof TableColumn) { + if (tmpObj == tc) { + ptg.vector.remove(i); + retFlag = true; + break; + } + } + } + } + return retFlag; + } + + public boolean removeColumnGrp(ColumnGroup ptg, ColumnGroup tg) { + boolean retFlag = false; + if (tg != null) { + for (int i = 0; i < ptg.vector.size(); i++) { + Object tmpObj = ptg.vector.get(i); + if (tmpObj instanceof ColumnGroup) { + if (tmpObj == tg) { + ptg.vector.remove(i); + retFlag = true; + break; + } else { + retFlag = removeColumnGrp((ColumnGroup) tmpObj, tg); + if (retFlag) { + break; + } + + } + } else if (tmpObj instanceof TableColumn) { + break; + } + } + } + return retFlag; + } + + public void setColumnMargin(int margin) { + this.margin = margin; + Enumeration enumeration = vector.elements(); + while (enumeration.hasMoreElements()) { + Object obj = enumeration.nextElement(); + if (obj instanceof ColumnGroup) { + ((ColumnGroup) obj).setColumnMargin(margin); + } + } + } + + public void setHeaderRenderer(TableCellRenderer renderer) { + if (renderer != null) { + this.renderer = renderer; + } + } + + public void setText(java.lang.String newText) { + text = newText; + } +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java new file mode 100644 index 0000000000..7fb4c29bf3 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java @@ -0,0 +1,36 @@ +package com.alibaba.druid.support.jconsole.model; + +import java.awt.Color; +import java.awt.Component; + +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.TableCellRenderer; + +public class DruidTableCellRenderer extends JLabel implements TableCellRenderer +{ + + private static final long serialVersionUID = 1L; + + // This method is called each time a cell in a column + // using this renderer needs to be rendered. + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, boolean hasFocus, int row, int column) + { + + if ((column == 0)) + { + setBackground(Color.lightGray); + } + this.setOpaque(true); + + if (value != null) { + setText(value.toString()); + } else { + setText((row + 1)+""); + } + + // Since the renderer is a component, return itself + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java index 36f69fdfe3..08056ceb79 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java @@ -1,116 +1,121 @@ -/* - * 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.support.jconsole.model; - -import java.util.ArrayList; -import java.util.LinkedHashMap; - -import javax.swing.event.TableModelListener; -import javax.swing.table.TableModel; - -public class DruidTableModel implements TableModel { - private ArrayList> list; - private ArrayList showKeys; - - public DruidTableModel(ArrayList> list) { - super(); - this.list = list; - showKeys = null; - } - - public DruidTableModel(ArrayList> list, - ArrayList showKeys) { - super(); - this.list = list; - this.showKeys = showKeys; - } - - - @Override - public Class getColumnClass(int columnIndex) { - return String.class; - } - - @Override - public int getColumnCount() { - int colCount = 0; - if (showKeys != null) { - colCount = showKeys.size(); - } else if (list != null) { - int listLen = list.size(); - if (listLen > 0) { - colCount = list.get(0).size(); - } - } - return colCount; - } - - @Override - public String getColumnName(int columnIndex) { - if (showKeys != null && showKeys.size() > 0) { - return showKeys.get(columnIndex); - } - if (list != null && list.size() > 0) { - LinkedHashMap firstElement = list.get(0); - Object[] keys = firstElement.keySet().toArray(); - return keys[columnIndex].toString(); - } - return null; - } - - @Override - public int getRowCount() { - return list.size(); - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (list != null && rowIndex < list.size()) { - LinkedHashMap dataNow = list.get(rowIndex); - if (showKeys != null) { - int titleLen = showKeys.size(); - if (titleLen > 0 && columnIndex < titleLen) { - return dataNow.get(showKeys.get(columnIndex)); - } - } else { - Object[] values = dataNow.values().toArray(); - return values[columnIndex]; - } - } - return null; - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - - @Override - public void addTableModelListener(TableModelListener l) { - - } - - @Override - public void removeTableModelListener(TableModelListener l) { - - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - - } - -} +/* + * 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.support.jconsole.model; + +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +public class DruidTableModel implements TableModel { + private ArrayList> list; + private ArrayList showKeys; + + public DruidTableModel(ArrayList> list) { + super(); + this.list = list; + showKeys = null; + } + + public DruidTableModel(ArrayList> list, + ArrayList showKeys) { + super(); + this.list = list; + this.showKeys = showKeys; + } + + + @Override + public Class getColumnClass(int columnIndex) { + return String.class; + } + + @Override + public int getColumnCount() { + int colCount = 0; + if (showKeys != null) { + colCount = showKeys.size(); + } else if (list != null) { + int listLen = list.size(); + if (listLen > 0) { + colCount = list.get(0).size(); + } + } + return colCount; + } + + @Override + public String getColumnName(int columnIndex) { + if (showKeys != null && showKeys.size() > 0) { + String keyNow = showKeys.get(columnIndex); + if (keyNow != null) { + return keyNow.substring(keyNow.indexOf('-')+1, keyNow.length()); + } + } + if (list != null && list.size() > 0) { + LinkedHashMap firstElement = list.get(0); + Object[] keys = firstElement.keySet().toArray(); + return keys[columnIndex].toString(); + } + return null; + } + + @Override + public int getRowCount() { + return list.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (list != null && rowIndex < list.size()) {//没有超出最大行数 + LinkedHashMap dataNow = list.get(rowIndex); + if (showKeys != null) { + int titleLen = showKeys.size(); + if (titleLen > 0 && columnIndex < titleLen) { + return dataNow.get(showKeys.get(columnIndex)); + } + } else { + Object[] values = dataNow.values().toArray(); + if (columnIndex < values.length) { + return values[columnIndex]; + } + } + } + return null; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + @Override + public void addTableModelListener(TableModelListener l) { + + } + + @Override + public void removeTableModelListener(TableModelListener l) { + + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + + } + +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java new file mode 100644 index 0000000000..8664ac486c --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java @@ -0,0 +1,77 @@ +package com.alibaba.druid.support.jconsole.model; + +import java.util.Enumeration; +import java.util.Vector; + +import javax.swing.table.JTableHeader; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; + +public class GroupableTableHeader extends JTableHeader { + + private static final long serialVersionUID = 1L; + // private static final String uiClassID = "GroupableTableHeaderUI"; + protected Vector columnGroups = null; + + public GroupableTableHeader(TableColumnModel model) { + super(model); + setUI(new GroupableTableHeaderUI()); + setReorderingAllowed(false); + setRequestFocusEnabled(false); + } + + public void addColumnGroup(ColumnGroup g) { + if (columnGroups == null) { + columnGroups = new Vector(); + } + columnGroups.addElement(g); + } + + public void clearColumnGroups() { + columnGroups = null; + } + + public ColumnGroup[] getColumnGroups() { + ColumnGroup[] retg = null; + if (columnGroups.size() > 0) { + retg = new ColumnGroup[columnGroups.size()]; + columnGroups.copyInto(retg); + } + return retg; + } + + public Enumeration getColumnGroups(TableColumn col) { + if (columnGroups == null) { + return null; + } + Enumeration enum1 = columnGroups.elements(); + while (enum1.hasMoreElements()) { + ColumnGroup cGroup = (ColumnGroup) enum1.nextElement(); + Vector v_ret = cGroup.getColumnGroups(col, new Vector()); + if (v_ret != null) { + return v_ret.elements(); + } + } + return null; + } + + public boolean isFocusTraversable() { + return super.isFocusTraversable() && isRequestFocusEnabled(); + } + + public void setColumnMargin() { + if (columnGroups == null) { + return; + } + int columnMargin = getColumnModel().getColumnMargin(); + Enumeration enum1 = columnGroups.elements(); + while (enum1.hasMoreElements()) { + ColumnGroup cGroup = (ColumnGroup) enum1.nextElement(); + cGroup.setColumnMargin(columnMargin); + } + } + + public void setReorderingAllowed(boolean b) { + reorderingAllowed = b; + } +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java new file mode 100644 index 0000000000..e3595a6ac4 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java @@ -0,0 +1,236 @@ +package com.alibaba.druid.support.jconsole.model; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.UIManager; +import javax.swing.plaf.basic.BasicTableHeaderUI; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; + +public class GroupableTableHeaderUI extends BasicTableHeaderUI { + private int m_height; + + private Dimension createHeaderSize(long width) { + TableColumnModel columnModel = header.getColumnModel(); + width += columnModel.getColumnMargin() * columnModel.getColumnCount(); + if (width > Integer.MAX_VALUE) { + width = Integer.MAX_VALUE; + } + return new Dimension((int) width, getHeaderHeight()); + } + + private int getColCountUnderColGroup(ColumnGroup cg, int iCount) { + Vector v = cg.vector; + for (int i = 0; i < v.size(); i++) { + Object obj = v.elementAt(i); + if (obj instanceof ColumnGroup) { + iCount = getColCountUnderColGroup((ColumnGroup) obj, iCount); + } else { + iCount++; + } + } + return iCount; + } + + public int getHeaderHeight() { + int height = 0; + TableColumnModel columnModel = header.getColumnModel(); + for (int column = 0; column < columnModel.getColumnCount(); column++) { + TableColumn aColumn = columnModel.getColumn(column); + TableCellRenderer renderer = aColumn.getHeaderRenderer(); + if (renderer == null) { + renderer = new DefaultTableCellRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent( + JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + JTableHeader header = table.getTableHeader(); + if (header != null) { + setForeground(header.getForeground()); + setBackground(header.getBackground()); + setFont(header.getFont()); + } + setHorizontalAlignment(JLabel.CENTER); + setText((value == null) ? "" : value.toString()); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + return this; + } + }; + } + Component comp = renderer.getTableCellRendererComponent(header + .getTable(), aColumn.getHeaderValue(), false, false, -1, + column); + int cHeight = comp.getPreferredSize().height; + Enumeration enumeration = ((GroupableTableHeader) header) + .getColumnGroups(aColumn); + if (enumeration != null) { + while (enumeration.hasMoreElements()) { + ColumnGroup cGroup = (ColumnGroup) enumeration + .nextElement(); + cHeight += cGroup.getSize(header.getTable()).height; + } + } + height = Math.max(height, cHeight); + } + height = Math.max(height, m_height); + return height; + } + + @Override + public Dimension getPreferredSize(JComponent c) { + long width = 0; + Enumeration enumeration = header.getColumnModel().getColumns(); + while (enumeration.hasMoreElements()) { + TableColumn aColumn = enumeration.nextElement(); + width = width + aColumn.getWidth(); + } + + return createHeaderSize(width); + } + + @Override + public void paint(Graphics g, JComponent c) { + Rectangle clipBounds = g.getClipBounds(); + if (header.getColumnModel() == null) { + return; + } + ((GroupableTableHeader) header).setColumnMargin(); + int column = 0; + Dimension size = header.getSize(); + Rectangle cellRect = new Rectangle(0, 0, size.width, size.height); + Hashtable h = new Hashtable(); + int columnMargin = header.getColumnModel().getColumnMargin(); + Enumeration enumeration = header.getColumnModel().getColumns(); + while (enumeration.hasMoreElements()) { + cellRect.height = size.height; + cellRect.y = 0; + TableColumn aColumn = enumeration.nextElement(); + Enumeration cGroups = ((GroupableTableHeader) header) + .getColumnGroups(aColumn); + if (cGroups != null) { + int groupHeight = 0; + while (cGroups.hasMoreElements()) { + ColumnGroup cGroup = cGroups.nextElement(); + Rectangle groupRect = (Rectangle) h.get(cGroup); + if (groupRect == null) { + groupRect = new Rectangle(cellRect); + Dimension d = cGroup.getSize(header.getTable()); + if (!System.getProperty("java.vm.version").startsWith( + "1.2")) { + int iColCount = getColCountUnderColGroup(cGroup, 0); + groupRect.width = d.width - iColCount + * columnMargin; + } else { + groupRect.width = d.width; + } + groupRect.height = d.height; + h.put(cGroup, groupRect); + } + paintCell(g, groupRect, cGroup); + groupHeight += groupRect.height; + cellRect.height = size.height - groupHeight; + cellRect.y = groupHeight; + } + } + if (!System.getProperty("java.vm.version").startsWith("1.2")) { + cellRect.width = aColumn.getWidth(); + } else { + cellRect.width = aColumn.getWidth() + columnMargin; + } + + if (cellRect.intersects(clipBounds)) { + paintCell(g, cellRect, column); + } + cellRect.x += cellRect.width; + column++; + } + } + + private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) { + TableColumn aColumn = header.getColumnModel().getColumn(columnIndex); + TableCellRenderer renderer = aColumn.getHeaderRenderer(); + // + if (renderer == null) { + renderer = new DefaultTableCellRenderer() { + + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, + int row, int column) { + JTableHeader header = table.getTableHeader(); + if (header != null) { + setForeground(header.getForeground()); + setBackground(header.getBackground()); + setFont(header.getFont()); + } + setHorizontalAlignment(JLabel.CENTER); + setText((value == null) ? "" : value.toString()); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + return this; + } + }; + } + + String headerValue = aColumn.getHeaderValue().toString(); + Component component = renderer.getTableCellRendererComponent(header + .getTable(), headerValue, false, false, -1, columnIndex); + + rendererPane.add(component); + rendererPane.paintComponent(g, component, header, cellRect.x, + cellRect.y, cellRect.width, cellRect.height, true); + } + + private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) { + TableCellRenderer renderer = cGroup.getHeaderRenderer(); + // + if (renderer == null) { + renderer = new DefaultTableCellRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, + int row, int column) { + JTableHeader header = table.getTableHeader(); + if (header != null) { + setForeground(header.getForeground()); + setBackground(header.getBackground()); + setFont(header.getFont()); + } + setHorizontalAlignment(JLabel.CENTER); + setText((value == null) ? "" : value.toString()); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + return this; + } + }; + } + + String headerValue = cGroup.getHeaderValue().toString(); + Component component = renderer.getTableCellRendererComponent(header + .getTable(), headerValue, false, false, -1, -1); + + rendererPane.add(component); + rendererPane.paintComponent(g, component, header, cellRect.x, + cellRect.y, cellRect.width, cellRect.height, true); + } + + public void setHeaderHeight(int iHeight) { + m_height = iHeight; + } +} \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java b/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java index 0689652ebd..5a45c38838 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java @@ -1,157 +1,157 @@ -/* - * 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.support.jconsole.model; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.util.ArrayList; - -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.UIManager; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableCellRenderer; - -/** - * 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题 - */ -public class RowHeaderTable extends JTable -{ - private static final long serialVersionUID = 1L; - - /** - * 为JTable添加RowHeader, - * @param refTable 需要添加rowHeader的JTable - * @param columnWideth rowHeader的宽度 - */ - public RowHeaderTable(JTable refTable,int columnWidth){ - this(null,refTable,columnWidth,1); - } - - public RowHeaderTable(ArrayList title,JTable refTable,int columnWidth) { - this(title,refTable,columnWidth,1); - } - - public RowHeaderTable(ArrayList title,JTable refTable,int columnWidth,int rowSpan) { - super(new DefaultTableModel(refTable.getRowCount()/rowSpan,1)); - this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽 - this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth); - this.setDefaultRenderer(Object.class,new RowHeaderRenderer(title,refTable,this,rowSpan));//设置渲染器 - this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0)); - } -} -/** - * 用于显示RowHeader的JTable的渲染器,当选择某行时,该行颜色会发生变化 - */ -final class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener -{ - private static final long serialVersionUID = 1L; - private JTable reftable;//需要添加rowHeader的JTable - private JTable tableShow;//用于显示rowHeader的JTable - private ArrayList headerList; - private int rowHeightNow; - private int rowSpan; - - public RowHeaderRenderer(JTable reftable,JTable tableShow) { - this(null,reftable,tableShow,0); - } - - public RowHeaderRenderer(ArrayList headerList, - JTable reftable,JTable tableShow,int rowSpan) - { - this.headerList = headerList; - this.reftable = reftable; - this.tableShow=tableShow; - //增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化 - ListSelectionModel listModel=reftable.getSelectionModel(); - listModel.addListSelectionListener(this); - rowHeightNow = reftable.getRowCount()*reftable.getRowHeight(); - this.rowSpan = rowSpan; - if (rowSpan > 1) { - rowHeightNow = rowSpan*reftable.getRowHeight(); - } - } - public Component getTableCellRendererComponent(JTable table,Object obj, - boolean isSelected,boolean hasFocus,int row, int col) - { - int rowCountNow = reftable.getRowCount()/rowSpan; - ((DefaultTableModel)table.getModel()).setRowCount(rowCountNow); - JTableHeader header = reftable.getTableHeader(); - this.setOpaque(true); - setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型 - setHorizontalAlignment(CENTER);//让text居中显示 - setBackground(header.getBackground());//设置背景色为TableHeader的背景色 - if ( isSelect(row) ) //当选取单元格时,在row header上设置成选取颜色 - { - setForeground(Color.white); - setBackground(Color.lightGray); - } - else - { - setForeground(header.getForeground()); - } - setFont(header.getFont()); - if (row <= rowCountNow){ - showCol(row); - } - return this; - } - - private void showCol(int row) { - - String text = null; - if (headerList != null && row < headerList.size()) { - text = headerList.get(row); - } else { - text = String.valueOf(row+1); - } - if (rowSpan > 1) { - setText(text); - this.tableShow.setRowHeight(row, rowHeightNow); - } else { - setText(text); - } - - } - - public void valueChanged(ListSelectionEvent e){ - this.tableShow.repaint(); - } - private boolean isSelect(int row) - { - int[] sel = reftable.getSelectedRows(); - if (rowSpan <= 1) { - for ( int i=0,len = sel.length; i title,JTable refTable,int columnWidth) { + this(title,refTable,columnWidth,1); + } + + public RowHeaderTable(ArrayList title,JTable refTable,int columnWidth,int rowSpan) { + super(new DefaultTableModel(refTable.getRowCount()/rowSpan,1)); + this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽 + this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth); + this.setDefaultRenderer(Object.class,new RowHeaderRenderer(title,refTable,this,rowSpan));//设置渲染器 + this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0)); + } +} +/** + * 用于显示RowHeader的JTable的渲染器,当选择某行时,该行颜色会发生变化 + */ +final class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener +{ + private static final long serialVersionUID = 1L; + private JTable reftable;//需要添加rowHeader的JTable + private JTable tableShow;//用于显示rowHeader的JTable + private ArrayList headerList; + private int rowHeightNow; + private int rowSpan; + + public RowHeaderRenderer(JTable reftable,JTable tableShow) { + this(null,reftable,tableShow,0); + } + + public RowHeaderRenderer(ArrayList headerList, + JTable reftable,JTable tableShow,int rowSpan) + { + this.headerList = headerList; + this.reftable = reftable; + this.tableShow=tableShow; + //增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化 + ListSelectionModel listModel=reftable.getSelectionModel(); + listModel.addListSelectionListener(this); + rowHeightNow = reftable.getRowCount()*reftable.getRowHeight(); + this.rowSpan = rowSpan; + if (rowSpan > 1) { + rowHeightNow = rowSpan*reftable.getRowHeight(); + } + } + public Component getTableCellRendererComponent(JTable table,Object obj, + boolean isSelected,boolean hasFocus,int row, int col) + { + int rowCountNow = reftable.getRowCount()/rowSpan; + ((DefaultTableModel)table.getModel()).setRowCount(rowCountNow); + JTableHeader header = reftable.getTableHeader(); + this.setOpaque(true); + setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型 + setHorizontalAlignment(CENTER);//让text居中显示 + setBackground(header.getBackground());//设置背景色为TableHeader的背景色 + if ( isSelect(row) ) //当选取单元格时,在row header上设置成选取颜色 + { + setForeground(Color.white); + setBackground(Color.lightGray); + } + else + { + setForeground(header.getForeground()); + } + setFont(header.getFont()); + if (row <= rowCountNow){ + showCol(row); + } + return this; + } + + private void showCol(int row) { + + String text = null; + if (headerList != null && row < headerList.size()) { + text = headerList.get(row); + } else { + text = String.valueOf(row+1); + } + if (rowSpan > 1) { + setText(text); + this.tableShow.setRowHeight(row, rowHeightNow); + } else { + setText(text); + } + + } + + public void valueChanged(ListSelectionEvent e){ + this.tableShow.repaint(); + } + private boolean isSelect(int row) + { + int[] sel = reftable.getSelectedRows(); + if (rowSpan <= 1) { + for ( int i=0,len = sel.length; i> rowDatas, String keyword) { - ColumnData datas = new ColumnData(); - ArrayList> coldatas - = new ArrayList>(); - ArrayList colNames = new ArrayList(); - int rowCount = 0; - int colCount = 0; - for(LinkedHashMap row: rowDatas) { - String keyNow = row.remove(keyword).toString(); - colNames.add(keyNow); - rowCount ++; - - for(Map.Entry element : row.entrySet()) { - LinkedHashMap colData - = new LinkedHashMap(); - colData.put(COLUMN_KEY_NAME, element.getKey()); - colData.put(COLUMN_VALUE_NAME, element.getValue()); - coldatas.add(colData); - if (rowCount == 1) { - colCount++; - } - } - } - datas.setCount(colCount); - datas.setDatas(coldatas); - datas.setNames(colNames); - return datas; - } - - public static class ColumnData { - private ArrayList names; - private ArrayList> datas; - private int count; - - public ColumnData() { - super(); - } - - public ArrayList getNames() { - return names; - } - public void setNames(ArrayList names) { - this.names = names; - } - public ArrayList> getDatas() { - return datas; - } - public void setDatas(ArrayList> datas) { - this.datas = datas; - } - public int getCount() { - return count; - } - public void setCount(int count) { - this.count = count; - } - } -} +/* + * 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.support.jconsole.util; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +public final class TableDataProcessor { + private static final String COLUMN_KEY_NAME = "名称"; + private static final String COLUMN_VALUE_NAME = "值"; + private TableDataProcessor() { + + } + + public static ColumnData row2col( + ArrayList> rowDatas, String keyword) { + ColumnData datas = new ColumnData(); + ArrayList> coldatas + = new ArrayList>(); + ArrayList colNames = new ArrayList(); + int rowCount = 0; + int colCount = 0; + for(LinkedHashMap row: rowDatas) { + if (keyword != null) { + String keyNow = row.remove(keyword).toString(); + colNames.add(keyNow); + } + rowCount ++; + + for(Map.Entry element : row.entrySet()) { + LinkedHashMap colData + = new LinkedHashMap(); + colData.put(COLUMN_KEY_NAME, element.getKey()); + colData.put(COLUMN_VALUE_NAME, element.getValue()); + coldatas.add(colData); + if (rowCount == 1) { + colCount++; + } + } + } + datas.setCount(colCount); + datas.setDatas(coldatas); + datas.setNames(colNames); + return datas; + } + + public static ColumnData mutilRow2col( + ArrayList> rowDatas, String keyword) { + ColumnData datas = new ColumnData(); + ArrayList>> tableDatas + = new ArrayList>>(); + + ArrayList colNames = new ArrayList(); + int rowCount = 0; + + for(LinkedHashMap row: rowDatas) { + if (keyword != null) { + String keyNow = row.remove(keyword).toString(); + colNames.add(keyNow); + } + rowCount ++; + + ArrayList> coldatas + = new ArrayList>(); + for(Map.Entry element : row.entrySet()) { + LinkedHashMap colData + = new LinkedHashMap(); + colData.put(COLUMN_KEY_NAME, element.getKey()); + colData.put(COLUMN_VALUE_NAME, element.getValue()); + coldatas.add(colData); + + } + tableDatas.add(coldatas); + } + datas.setCount(rowCount); + datas.setTableDatas(tableDatas); + datas.setNames(colNames); + return datas; + } + + public static ColumnData row2col( + ArrayList> rowDatas) { + return row2col(rowDatas,null); + } + + public static class ColumnData { + private ArrayList names; + private ArrayList> datas; + private ArrayList>> tableDatas; + private int count; + + public ColumnData() { + super(); + } + + public ArrayList getNames() { + return names; + } + public void setNames(ArrayList names) { + this.names = names; + } + public ArrayList> getDatas() { + return datas; + } + public void setDatas(ArrayList> datas) { + this.datas = datas; + } + public int getCount() { + return count; + } + public void setCount(int count) { + this.count = count; + } + + public ArrayList>> getTableDatas() { + return tableDatas; + } + + public void setTableDatas( + ArrayList>> tableDatas) { + this.tableDatas = tableDatas; + } + + } +} From c42ed6ca8ce0bb917e858f92fd04967a744e18c4 Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sat, 8 Sep 2012 10:00:03 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86jconsole?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E9=83=A8=E5=88=86javadoc=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jconsole/DruidDataSourcePanel.java | 50 +++++----- .../druid/support/jconsole/DruidPanel.java | 54 ++++++++++- .../jconsole/model/DruidTableModel.java | 18 ++++ .../jconsole/util/TableDataProcessor.java | 94 +++++++++++++++++++ 4 files changed, 186 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java index 7761b2d606..bd300d8dcf 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java @@ -30,35 +30,29 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor; import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; /** - * 请求地址:/datasource.json + * service的请求地址:/datasource.json * - * 请求返回的json格式: {"ResultCode":1, "Content": - * [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql", - * "DriverClassName":"com.mysql.jdbc.Driver", - * "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root", - * "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"], - * "WaitThreadCount" - * :0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1, - * "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime": - * "Tue Aug 21 21:22:33 CST 2012", - * "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout" - * :0,"TransactionQueryTimeout":0, - * "LoginTimeout":0,"ValidConnectionCheckerClassName" - * :"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker", - * "ExceptionSorterClassName" - * :"com.alibaba.druid.pool.vendor.MySqlExceptionSorter", - * "TestOnBorrow":false,"TestOnReturn" - * :false,"TestWhileIdle":true,"DefaultAutoCommit":true, - * "DefaultReadOnly":true,"LogicConnectCount" - * :93,"LogicCloseCount":93,"LogicConnectErrorCount":0, - * "PhysicalConnectCount":1, - * "PhysicalCloseCount":0,"PhysicalConnectErrorCount":0, - * "ExecuteCount":93,"ErrorCount" - * :0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31, - * "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0, - * "TransactionHistogram" - * :[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0], - * "RemoveAbandoned":false }] } + * 请求service返回的json格式: + * {"ResultCode":1, + * "Content": + * [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql", + * "DriverClassName":"com.mysql.jdbc.Driver", + * "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root", + * "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"], + * "WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1, + * "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012", + * "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0, + * "LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker", + * "ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter", + * "TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true, + * "DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0, + * "PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0, + * "ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31, + * "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0, + * "TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0], + * "RemoveAbandoned":false + * }] + * } * */ public class DruidDataSourcePanel extends DruidPanel { diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java index 518c3d0f5f..54f97b36d0 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java @@ -39,34 +39,63 @@ import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.sun.tools.jconsole.JConsoleContext; +/** + * druid面板的抽象类 + * 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中 + */ public abstract class DruidPanel extends JPanel { private static final long serialVersionUID = 1L; + /** 成功的返回码 */ protected static final int RESP_SUCCESS_RESULT = 1; + /**返回码在json中的键名 */ protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; + /** 内容在json中的键名 */ protected static final String RESP_JSON_CONTENT_KEY = "Content"; + /** 默认面板刷新的间隔时间 */ protected static final long DEFAULT_ACTIVE_TIME = 5*60*1000; + /**版权信息字符串 */ private static final String COPYRIGHT_STRING = "powered by yunnysunny"; + /**滚动条面板*/ protected JScrollPane scrollPane; + /** 表格模板 */ protected DruidTableModel tableModel; + /** 表格 */ protected JTable table; + /** 版权面板 */ protected JPanel copyrightPanel; + /** json请求的地址 */ protected String url; /** 界面刷新的间隔时间,单位为毫秒. */ protected long activeTime; + /**上次刷新的时间*/ protected long lastRefreshTime; private final static Log LOG = LogFactory.getLog(DruidPanel.class); - + + /** + * 根据传入的刷新时间间隔来初始化. + * + * @param activeTime 刷新时间间隔 + */ protected DruidPanel(long activeTime) { this.activeTime = activeTime; - } + } + /** + * 初始化刷新时间间隔为默认值 + * */ protected DruidPanel() { activeTime = DEFAULT_ACTIVE_TIME; } + /** + * 解析调用service后得到JSON数据 + * + * @param respData 获取到的json对象 + * @return 返回解析后的数据 + */ @SuppressWarnings("unchecked") protected ArrayList> parseData(Object respData) { ArrayList> data = null; @@ -89,6 +118,14 @@ public abstract class DruidPanel extends JPanel { return data; } + /** + * 调用service,返回数据 + * + * @param url service的地址 + * @param conn MBeanServerConnection对象 + * @return 调用service后返回的数据 + * @throws Exception + */ protected Object getData(String url,MBeanServerConnection conn) throws Exception { Object o = null; ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); @@ -102,8 +139,21 @@ public abstract class DruidPanel extends JPanel { return o; } + /** + * 调用完service之后,各个子类对于解析后的数据的具体处理 + * + * @param data 解析后的数据 + */ protected abstract void tableDataProcess(ArrayList> data); + /** + * 如果是第一次调用,则生成表格对象;否则根据当前时间来和上次刷新时间的间隔, + * 是否大于对象初始化时设定的时间间隔来判断是否刷新表格数据。 + * + * @param url service的地址 + * @param conn MBeanServerConnection对象 + * @throws Exception + */ protected void addOrRefreshTable(String url,MBeanServerConnection conn) throws Exception { if (url != null) { boolean needRefresh = false; diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java index 08056ceb79..c9f4bae874 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java @@ -21,8 +21,15 @@ import java.util.LinkedHashMap; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; +/** + * 自定义duird监控数据表格模板类 + */ public class DruidTableModel implements TableModel { + + /** 数据内容. */ private ArrayList> list; + + /** 自定义列名集合. */ private ArrayList showKeys; public DruidTableModel(ArrayList> list) { @@ -44,6 +51,9 @@ public class DruidTableModel implements TableModel { return String.class; } + /* 如果设置了列名,就是列名的长度;否则返回数据的第一条LinkedHashmap的长度 + * @see javax.swing.table.TableModel#getColumnCount() + */ @Override public int getColumnCount() { int colCount = 0; @@ -58,6 +68,10 @@ public class DruidTableModel implements TableModel { return colCount; } + /* 如果设置了自定义列名,则使用自定义列名,并且在返回前拆除掉'-'前面的内容; + * 如果没有设置,则返回第一条内容的LinkedHashMap的键名。 + * @see javax.swing.table.TableModel#getColumnName(int) + */ @Override public String getColumnName(int columnIndex) { if (showKeys != null && showKeys.size() > 0) { @@ -79,6 +93,10 @@ public class DruidTableModel implements TableModel { return list.size(); } + /* 如果设置了自定义列名,则返回当前列数对应的列名在LinkedHashMap中对应的值; + * 否则,返回当前LinkedHashMap在当前列数位置对应的值。 + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ @Override public Object getValueAt(int rowIndex, int columnIndex) { if (list != null && rowIndex < list.size()) {//没有超出最大行数 diff --git a/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java b/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java index d76066b48e..e3b6e83cad 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java @@ -19,13 +19,32 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; +/** + * The Class TableDataProcessor. + */ public final class TableDataProcessor { + + /** The Constant COLUMN_KEY_NAME. */ private static final String COLUMN_KEY_NAME = "名称"; + + /** The Constant COLUMN_VALUE_NAME. */ private static final String COLUMN_VALUE_NAME = "值"; + + /** + * Instantiates a new table data processor. + */ private TableDataProcessor() { } + /** + * 将行数据转化为列数据 + * 由于json中的数据是按照一条条的记录返回的,而在显示的时候需要按照“名称”、“值”两列显示,所以要做转化。 + * + * @param rowDatas 原始数据 + * @param keyword 关键字,可以为null + * @return 生成的列数据的对象 + */ public static ColumnData row2col( ArrayList> rowDatas, String keyword) { ColumnData datas = new ColumnData(); @@ -58,6 +77,15 @@ public final class TableDataProcessor { return datas; } + /** + * 将行数据转化为多个表格中的列数据 + * 和{@link #row2col(ArrayList>, String)}类似, + * 只不过这里是返回多个表格数据 + * + * @param rowDatas 原始数据 + * @param keyword the keyword + * @return 生成的列数据的对象 + */ public static ColumnData mutilRow2col( ArrayList> rowDatas, String keyword) { ColumnData datas = new ColumnData(); @@ -92,44 +120,110 @@ public final class TableDataProcessor { return datas; } + /** + * 将行数据转化为列数据,这里只是调用了{@link #row2col(ArrayList>, String)}, + * 将第二个参数置为null。 + * + * @param rowDatas 原始数据 + * @return 生成的列数据的对象 + */ public static ColumnData row2col( ArrayList> rowDatas) { return row2col(rowDatas,null); } + /** + * The Class ColumnData. + */ public static class ColumnData { + + /** 关键字集合. */ private ArrayList names; + + /** 单个表格数据. */ private ArrayList> datas; + + /** 多个表格数据. */ private ArrayList>> tableDatas; + + /** 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数. */ private int count; + /** + * Instantiates a new column data. + */ public ColumnData() { super(); } + /** + * 获取关键字集合 + * + * @return the names + */ public ArrayList getNames() { return names; } + + /** + * 设置关键字集合 + * + * @param names the new names + */ public void setNames(ArrayList names) { this.names = names; } + + /** + * 获取单个表格数据 + * + * @return the datas + */ public ArrayList> getDatas() { return datas; } + + /** + * 设置单个表格数据 + * + * @param datas the datas + */ public void setDatas(ArrayList> datas) { this.datas = datas; } + + /** + * 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数 + * + * @return the count + */ public int getCount() { return count; } + + /** + * Sets the count. + * + * @param count the new count + */ public void setCount(int count) { this.count = count; } + /** + * 返回多个表格数据 + * + * @return the table datas + */ public ArrayList>> getTableDatas() { return tableDatas; } + /** + * 设置多个表格数据 + * + * @param tableDatas the table datas + */ public void setTableDatas( ArrayList>> tableDatas) { this.tableDatas = tableDatas; From 73f49d13f4761f0d727e4e3cd8e135d113f08eec Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Tue, 11 Sep 2012 13:40:32 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E4=BD=BF?= =?UTF-8?q?=E7=94=A8sqlite=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=87=BA?= =?UTF-8?q?=E7=8E=B0ResultSet=20closed=E5=BC=82=E5=B8=B8=E6=8A=9B=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pool/DruidPooledPreparedStatement.java | 2054 +++++++++-------- 1 file changed, 1031 insertions(+), 1023 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index 4f462272f1..95c4d02edf 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -1,1023 +1,1031 @@ -/* - * 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.pool; - -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.sql.Array; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Date; -import java.sql.NClob; -import java.sql.ParameterMetaData; -import java.sql.PreparedStatement; -import java.sql.Ref; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.RowId; -import java.sql.SQLException; -import java.sql.SQLXML; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.Arrays; -import java.util.Calendar; - -import com.alibaba.druid.pool.PreparedStatementPool.MethodType; -import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; -import com.alibaba.druid.util.OracleUtils; - -/** - * @author wenshao - */ -public class DruidPooledPreparedStatement extends DruidPooledStatement implements PreparedStatement { - - private final PreparedStatementHolder holder; - private final PreparedStatement stmt; - private final String sql; - - private int defaultMaxFieldSize; - private int defaultMaxRows; - private int defaultQueryTimeout; - private int defaultFetchDirection; - private int defaultFetchSize; - private int currentMaxFieldSize; - private int currentMaxRows; - private int currentQueryTimeout; - private int currentFetchDirection; - private int currentFetchSize; - - public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ - super(conn, holder.getStatement()); - this.stmt = holder.getStatement(); - this.holder = holder; - this.sql = holder.getKey().sql; - - // Remember the defaults - defaultMaxFieldSize = stmt.getMaxFieldSize(); - defaultMaxRows = stmt.getMaxRows(); - defaultQueryTimeout = stmt.getQueryTimeout(); - defaultFetchDirection = stmt.getFetchDirection(); - defaultFetchSize = stmt.getFetchSize(); - currentMaxFieldSize = defaultMaxFieldSize; - currentMaxRows = defaultMaxRows; - currentQueryTimeout = defaultQueryTimeout; - currentFetchDirection = defaultFetchDirection; - currentFetchSize = defaultFetchSize; - } - - public PreparedStatementHolder getPreparedStatementHolder() { - return holder; - } - - public int getHitCount() { - return holder.getHitCount(); - } - - public void setFetchSize(int rows) throws SQLException { - currentFetchSize = rows; - super.setFetchSize(rows); - } - - public void setFetchDirection(int direction) throws SQLException { - currentFetchDirection = direction; - super.setFetchDirection(direction); - } - - public void setMaxFieldSize(int max) throws SQLException { - currentMaxFieldSize = max; - super.setMaxFieldSize(max); - } - - public void setMaxRows(int max) throws SQLException { - currentMaxRows = max; - super.setMaxRows(max); - } - - public void setQueryTimeout(int seconds) throws SQLException { - currentQueryTimeout = seconds; - super.setQueryTimeout(seconds); - } - - public String getSql() { - return sql; - } - - public PreparedStatementKey getKey() { - return holder.getKey(); - } - - public PreparedStatement getRawPreparedStatement() { - return stmt; - } - - public PreparedStatement getRawStatement() { - return stmt; - } - - @Override - public void close() throws SQLException { - if (isClosed()) { - return; - } - - // Reset the defaults - if (defaultMaxFieldSize != currentMaxFieldSize) { - stmt.setMaxFieldSize(defaultMaxFieldSize); - currentMaxFieldSize = defaultMaxFieldSize; - } - if (defaultMaxRows != currentMaxRows) { - stmt.setMaxRows(defaultMaxRows); - currentMaxRows = defaultMaxRows; - } - if (defaultQueryTimeout != currentQueryTimeout) { - stmt.setQueryTimeout(defaultQueryTimeout); - currentQueryTimeout = defaultQueryTimeout; - } - if (defaultFetchDirection != currentFetchDirection) { - stmt.setFetchDirection(defaultFetchDirection); - currentFetchDirection = defaultFetchDirection; - } - if (defaultFetchSize != currentFetchSize) { - stmt.setFetchSize(defaultFetchSize); - currentFetchSize = defaultFetchSize; - } - - conn.closePoolableStatement(this); - } - - void closeInternal() throws SQLException { - super.close(); - } - - void setClosed(boolean value) { - this.closed = value; - } - - @Override - public ResultSet executeQuery() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - oracleSetRowPrefetch(); - - conn.beforeExecute(); - try { - ResultSet rs = stmt.executeQuery(); - - if (rs == null) { - return null; - } - - DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); - resultSetTrace.add(poolableResultSet); - - return poolableResultSet; - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public int executeUpdate() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - conn.beforeExecute(); - try { - return stmt.executeUpdate(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public void setNull(int parameterIndex, int sqlType) throws SQLException { - checkOpen(); - - try { - stmt.setNull(parameterIndex, sqlType); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBoolean(int parameterIndex, boolean x) throws SQLException { - checkOpen(); - - try { - stmt.setBoolean(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setByte(int parameterIndex, byte x) throws SQLException { - checkOpen(); - - try { - stmt.setByte(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setShort(int parameterIndex, short x) throws SQLException { - checkOpen(); - - try { - stmt.setShort(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setInt(int parameterIndex, int x) throws SQLException { - checkOpen(); - - try { - stmt.setInt(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setLong(int parameterIndex, long x) throws SQLException { - checkOpen(); - - try { - stmt.setLong(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setFloat(int parameterIndex, float x) throws SQLException { - checkOpen(); - - try { - stmt.setFloat(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDouble(int parameterIndex, double x) throws SQLException { - checkOpen(); - - try { - stmt.setDouble(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { - checkOpen(); - - try { - stmt.setBigDecimal(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setString(int parameterIndex, String x) throws SQLException { - checkOpen(); - - try { - stmt.setString(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBytes(int parameterIndex, byte[] x) throws SQLException { - checkOpen(); - - try { - stmt.setBytes(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDate(int parameterIndex, Date x) throws SQLException { - checkOpen(); - - try { - stmt.setDate(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTime(int parameterIndex, Time x) throws SQLException { - checkOpen(); - - try { - stmt.setTime(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { - checkOpen(); - - try { - stmt.setTimestamp(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - @Deprecated - public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setUnicodeStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void clearParameters() throws SQLException { - checkOpen(); - - try { - stmt.clearParameters(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x, targetSqlType); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public boolean execute() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - // oracleSetRowPrefetch(); - - conn.beforeExecute(); - try { - return stmt.execute(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - protected void oracleSetRowPrefetch() throws SQLException { - if (!conn.isOracle()) { - return; - } - - if (holder.getHitCount() == 0) { - return; - } - - int fetchRowPeak = holder.getFetchRowPeak(); - - if (fetchRowPeak < 0) { - return; - } - - if (holder.getDefaultRowPretch() == -1) { - int defaultRowPretch = OracleUtils.getRowPrefetch(this); - holder.setDefaultRowPretch(defaultRowPretch); - holder.setRowPrefetch(defaultRowPretch); - } - - int rowPrefetch; - - if (fetchRowPeak <= 1) { - rowPrefetch = 2; - } else if (fetchRowPeak > holder.getDefaultRowPretch()) { - rowPrefetch = holder.getDefaultRowPretch(); - } else { - rowPrefetch = fetchRowPeak + 1; - } - - if (rowPrefetch != holder.getRowPrefetch()) { - OracleUtils.setRowPrefetch(this, rowPrefetch); - holder.setRowPrefetch(rowPrefetch); - } - } - - @Override - public void addBatch() throws SQLException { - checkOpen(); - - try { - stmt.addBatch(); - } catch (Throwable t) { - throw checkException(t); - } - } - - public int[] executeBatch() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - conn.beforeExecute(); - try { - return stmt.executeBatch(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setRef(int parameterIndex, Ref x) throws SQLException { - checkOpen(); - - try { - stmt.setRef(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, Blob x) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Clob x) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setArray(int parameterIndex, Array x) throws SQLException { - checkOpen(); - - try { - stmt.setArray(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public ResultSetMetaData getMetaData() throws SQLException { - checkOpen(); - - try { - return stmt.getMetaData(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setDate(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setTime(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setTimestamp(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { - checkOpen(); - - try { - stmt.setNull(parameterIndex, sqlType, typeName); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setURL(int parameterIndex, URL x) throws SQLException { - checkOpen(); - - try { - stmt.setURL(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public ParameterMetaData getParameterMetaData() throws SQLException { - checkOpen(); - - try { - return stmt.getParameterMetaData(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setRowId(int parameterIndex, RowId x) throws SQLException { - checkOpen(); - - try { - stmt.setRowId(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNString(int parameterIndex, String value) throws SQLException { - checkOpen(); - - try { - stmt.setNString(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { - checkOpen(); - - try { - stmt.setNCharacterStream(parameterIndex, value, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, NClob value) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, inputStream, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { - checkOpen(); - - try { - stmt.setSQLXML(parameterIndex, xmlObject); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x, targetSqlType, scaleOrLength); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { - checkOpen(); - - try { - stmt.setNCharacterStream(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, inputStream); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - public static class PreparedStatementKey { - - private final String sql; - private final String catalog; - - protected final MethodType methodType; - - private final int resultSetType; - private final int resultSetConcurrency; - private final int resultSetHoldability; - private final int autoGeneratedKeys; - private final int[] columnIndexes; - private final String[] columnNames; - - public PreparedStatementKey(String sql, String catalog, MethodType methodType) throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency) throws SQLException{ - this(sql, catalog, methodType, resultSetType, resultSetConcurrency, 0, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) throws SQLException{ - this(sql, catalog, methodType, resultSetType, resultSetConcurrency, resultSetHoldability, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int autoGeneratedKeys) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, autoGeneratedKeys, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int[] columnIndexes) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, columnIndexes, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, String[] columnNames) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, null, columnNames); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency, int resultSetHoldability, int autoGeneratedKeys, - int[] columnIndexes, String[] columnNames) throws SQLException{ - if (sql == null) { - throw new SQLException("sql is null"); - } - - this.sql = sql; - this.catalog = catalog; - this.methodType = methodType; - this.resultSetType = resultSetType; - this.resultSetConcurrency = resultSetConcurrency; - this.resultSetHoldability = resultSetHoldability; - this.autoGeneratedKeys = autoGeneratedKeys; - this.columnIndexes = columnIndexes; - this.columnNames = columnNames; - } - - public int getResultSetType() { - return resultSetType; - } - - public int getResultSetConcurrency() { - return resultSetConcurrency; - } - - public int getResultSetHoldability() { - return resultSetHoldability; - } - - public boolean equals(Object object) { - PreparedStatementKey that = (PreparedStatementKey) object; - - if (!this.sql.equals(that.sql)) { - return false; - } - - if (this.catalog == null) { - if (that.catalog != null) { - return false; - } - } else { - if (!this.catalog.equals(that.catalog)) { - return false; - } - } - - if (this.methodType != that.methodType) { - return false; - } - - if (this.resultSetType != that.resultSetType) { - return false; - } - - if (this.resultSetConcurrency != that.resultSetConcurrency) { - return false; - } - - if (this.resultSetHoldability != that.resultSetHoldability) { - return false; - } - - if (this.autoGeneratedKeys != that.autoGeneratedKeys) { - return false; - } - - if (!Arrays.equals(columnIndexes, that.columnIndexes)) { - return false; - } - - if (!Arrays.equals(columnNames, that.columnNames)) { - return false; - } - - return true; - } - - public int hashCode() { - final int prime = 31; - int result = 1; - - result = prime * result + ((sql == null) ? 0 : sql.hashCode()); - result = prime * result + ((catalog == null) ? 0 : catalog.hashCode()); - result = prime * result + ((methodType == null) ? 0 : methodType.hashCode()); - - result = prime * result + resultSetConcurrency; - result = prime * result + resultSetHoldability; - result = prime * result + resultSetType; - - result = prime * result + autoGeneratedKeys; - - result = prime * result + Arrays.hashCode(columnIndexes); - result = prime * result + Arrays.hashCode(columnNames); - - return result; - } - - public String getSql() { - return sql; - } - - } - - @SuppressWarnings("unchecked") - public T unwrap(Class iface) throws SQLException { - if (iface == PreparedStatement.class) { - if (stmt instanceof PreparedStatementProxy) { - return stmt.unwrap(iface); - } - return (T) stmt; - } - - if (iface == PreparedStatementHolder.class) { - return (T) this.holder; - } - - return super.unwrap(iface); - } -} +/* + * 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.pool; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; +import java.sql.Ref; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.Calendar; + +import com.alibaba.druid.pool.PreparedStatementPool.MethodType; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; +import com.alibaba.druid.util.OracleUtils; + +/** + * @author wenshao + */ +public class DruidPooledPreparedStatement extends DruidPooledStatement implements PreparedStatement { + + private final PreparedStatementHolder holder; + private final PreparedStatement stmt; + private final String sql; + + private int defaultMaxFieldSize; + private int defaultMaxRows; + private int defaultQueryTimeout; + private int defaultFetchDirection; + private int defaultFetchSize; + private int currentMaxFieldSize; + private int currentMaxRows; + private int currentQueryTimeout; + private int currentFetchDirection; + private int currentFetchSize; + + private final static Log LOG = LogFactory.getLog(DruidPooledPreparedStatement.class); + + public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ + super(conn, holder.getStatement()); + this.stmt = holder.getStatement(); + this.holder = holder; + this.sql = holder.getKey().sql; + + // Remember the defaults + defaultMaxFieldSize = stmt.getMaxFieldSize(); + defaultMaxRows = stmt.getMaxRows(); + defaultQueryTimeout = stmt.getQueryTimeout(); + try { + defaultFetchDirection = stmt.getFetchDirection(); + }catch(Exception e) { + LOG.warn(e.getMessage(), e); + } + defaultFetchSize = stmt.getFetchSize(); + currentMaxFieldSize = defaultMaxFieldSize; + currentMaxRows = defaultMaxRows; + currentQueryTimeout = defaultQueryTimeout; + currentFetchDirection = defaultFetchDirection; + currentFetchSize = defaultFetchSize; + } + + public PreparedStatementHolder getPreparedStatementHolder() { + return holder; + } + + public int getHitCount() { + return holder.getHitCount(); + } + + public void setFetchSize(int rows) throws SQLException { + currentFetchSize = rows; + super.setFetchSize(rows); + } + + public void setFetchDirection(int direction) throws SQLException { + currentFetchDirection = direction; + super.setFetchDirection(direction); + } + + public void setMaxFieldSize(int max) throws SQLException { + currentMaxFieldSize = max; + super.setMaxFieldSize(max); + } + + public void setMaxRows(int max) throws SQLException { + currentMaxRows = max; + super.setMaxRows(max); + } + + public void setQueryTimeout(int seconds) throws SQLException { + currentQueryTimeout = seconds; + super.setQueryTimeout(seconds); + } + + public String getSql() { + return sql; + } + + public PreparedStatementKey getKey() { + return holder.getKey(); + } + + public PreparedStatement getRawPreparedStatement() { + return stmt; + } + + public PreparedStatement getRawStatement() { + return stmt; + } + + @Override + public void close() throws SQLException { + if (isClosed()) { + return; + } + + // Reset the defaults + if (defaultMaxFieldSize != currentMaxFieldSize) { + stmt.setMaxFieldSize(defaultMaxFieldSize); + currentMaxFieldSize = defaultMaxFieldSize; + } + if (defaultMaxRows != currentMaxRows) { + stmt.setMaxRows(defaultMaxRows); + currentMaxRows = defaultMaxRows; + } + if (defaultQueryTimeout != currentQueryTimeout) { + stmt.setQueryTimeout(defaultQueryTimeout); + currentQueryTimeout = defaultQueryTimeout; + } + if (defaultFetchDirection != currentFetchDirection) { + stmt.setFetchDirection(defaultFetchDirection); + currentFetchDirection = defaultFetchDirection; + } + if (defaultFetchSize != currentFetchSize) { + stmt.setFetchSize(defaultFetchSize); + currentFetchSize = defaultFetchSize; + } + + conn.closePoolableStatement(this); + } + + void closeInternal() throws SQLException { + super.close(); + } + + void setClosed(boolean value) { + this.closed = value; + } + + @Override + public ResultSet executeQuery() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + oracleSetRowPrefetch(); + + conn.beforeExecute(); + try { + ResultSet rs = stmt.executeQuery(); + + if (rs == null) { + return null; + } + + DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); + resultSetTrace.add(poolableResultSet); + + return poolableResultSet; + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public int executeUpdate() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + conn.beforeExecute(); + try { + return stmt.executeUpdate(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public void setNull(int parameterIndex, int sqlType) throws SQLException { + checkOpen(); + + try { + stmt.setNull(parameterIndex, sqlType); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBoolean(int parameterIndex, boolean x) throws SQLException { + checkOpen(); + + try { + stmt.setBoolean(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setByte(int parameterIndex, byte x) throws SQLException { + checkOpen(); + + try { + stmt.setByte(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setShort(int parameterIndex, short x) throws SQLException { + checkOpen(); + + try { + stmt.setShort(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setInt(int parameterIndex, int x) throws SQLException { + checkOpen(); + + try { + stmt.setInt(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setLong(int parameterIndex, long x) throws SQLException { + checkOpen(); + + try { + stmt.setLong(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setFloat(int parameterIndex, float x) throws SQLException { + checkOpen(); + + try { + stmt.setFloat(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDouble(int parameterIndex, double x) throws SQLException { + checkOpen(); + + try { + stmt.setDouble(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { + checkOpen(); + + try { + stmt.setBigDecimal(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setString(int parameterIndex, String x) throws SQLException { + checkOpen(); + + try { + stmt.setString(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBytes(int parameterIndex, byte[] x) throws SQLException { + checkOpen(); + + try { + stmt.setBytes(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDate(int parameterIndex, Date x) throws SQLException { + checkOpen(); + + try { + stmt.setDate(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTime(int parameterIndex, Time x) throws SQLException { + checkOpen(); + + try { + stmt.setTime(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { + checkOpen(); + + try { + stmt.setTimestamp(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + @Deprecated + public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setUnicodeStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void clearParameters() throws SQLException { + checkOpen(); + + try { + stmt.clearParameters(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x, targetSqlType); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public boolean execute() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + // oracleSetRowPrefetch(); + + conn.beforeExecute(); + try { + return stmt.execute(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + protected void oracleSetRowPrefetch() throws SQLException { + if (!conn.isOracle()) { + return; + } + + if (holder.getHitCount() == 0) { + return; + } + + int fetchRowPeak = holder.getFetchRowPeak(); + + if (fetchRowPeak < 0) { + return; + } + + if (holder.getDefaultRowPretch() == -1) { + int defaultRowPretch = OracleUtils.getRowPrefetch(this); + holder.setDefaultRowPretch(defaultRowPretch); + holder.setRowPrefetch(defaultRowPretch); + } + + int rowPrefetch; + + if (fetchRowPeak <= 1) { + rowPrefetch = 2; + } else if (fetchRowPeak > holder.getDefaultRowPretch()) { + rowPrefetch = holder.getDefaultRowPretch(); + } else { + rowPrefetch = fetchRowPeak + 1; + } + + if (rowPrefetch != holder.getRowPrefetch()) { + OracleUtils.setRowPrefetch(this, rowPrefetch); + holder.setRowPrefetch(rowPrefetch); + } + } + + @Override + public void addBatch() throws SQLException { + checkOpen(); + + try { + stmt.addBatch(); + } catch (Throwable t) { + throw checkException(t); + } + } + + public int[] executeBatch() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + conn.beforeExecute(); + try { + return stmt.executeBatch(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setRef(int parameterIndex, Ref x) throws SQLException { + checkOpen(); + + try { + stmt.setRef(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, Blob x) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Clob x) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setArray(int parameterIndex, Array x) throws SQLException { + checkOpen(); + + try { + stmt.setArray(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + checkOpen(); + + try { + return stmt.getMetaData(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setDate(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setTime(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setTimestamp(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { + checkOpen(); + + try { + stmt.setNull(parameterIndex, sqlType, typeName); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setURL(int parameterIndex, URL x) throws SQLException { + checkOpen(); + + try { + stmt.setURL(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public ParameterMetaData getParameterMetaData() throws SQLException { + checkOpen(); + + try { + return stmt.getParameterMetaData(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setRowId(int parameterIndex, RowId x) throws SQLException { + checkOpen(); + + try { + stmt.setRowId(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNString(int parameterIndex, String value) throws SQLException { + checkOpen(); + + try { + stmt.setNString(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { + checkOpen(); + + try { + stmt.setNCharacterStream(parameterIndex, value, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, NClob value) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, inputStream, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { + checkOpen(); + + try { + stmt.setSQLXML(parameterIndex, xmlObject); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x, targetSqlType, scaleOrLength); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { + checkOpen(); + + try { + stmt.setNCharacterStream(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, inputStream); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + public static class PreparedStatementKey { + + private final String sql; + private final String catalog; + + protected final MethodType methodType; + + private final int resultSetType; + private final int resultSetConcurrency; + private final int resultSetHoldability; + private final int autoGeneratedKeys; + private final int[] columnIndexes; + private final String[] columnNames; + + public PreparedStatementKey(String sql, String catalog, MethodType methodType) throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency) throws SQLException{ + this(sql, catalog, methodType, resultSetType, resultSetConcurrency, 0, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency, int resultSetHoldability) throws SQLException{ + this(sql, catalog, methodType, resultSetType, resultSetConcurrency, resultSetHoldability, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int autoGeneratedKeys) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, autoGeneratedKeys, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int[] columnIndexes) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, columnIndexes, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, String[] columnNames) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, null, columnNames); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency, int resultSetHoldability, int autoGeneratedKeys, + int[] columnIndexes, String[] columnNames) throws SQLException{ + if (sql == null) { + throw new SQLException("sql is null"); + } + + this.sql = sql; + this.catalog = catalog; + this.methodType = methodType; + this.resultSetType = resultSetType; + this.resultSetConcurrency = resultSetConcurrency; + this.resultSetHoldability = resultSetHoldability; + this.autoGeneratedKeys = autoGeneratedKeys; + this.columnIndexes = columnIndexes; + this.columnNames = columnNames; + } + + public int getResultSetType() { + return resultSetType; + } + + public int getResultSetConcurrency() { + return resultSetConcurrency; + } + + public int getResultSetHoldability() { + return resultSetHoldability; + } + + public boolean equals(Object object) { + PreparedStatementKey that = (PreparedStatementKey) object; + + if (!this.sql.equals(that.sql)) { + return false; + } + + if (this.catalog == null) { + if (that.catalog != null) { + return false; + } + } else { + if (!this.catalog.equals(that.catalog)) { + return false; + } + } + + if (this.methodType != that.methodType) { + return false; + } + + if (this.resultSetType != that.resultSetType) { + return false; + } + + if (this.resultSetConcurrency != that.resultSetConcurrency) { + return false; + } + + if (this.resultSetHoldability != that.resultSetHoldability) { + return false; + } + + if (this.autoGeneratedKeys != that.autoGeneratedKeys) { + return false; + } + + if (!Arrays.equals(columnIndexes, that.columnIndexes)) { + return false; + } + + if (!Arrays.equals(columnNames, that.columnNames)) { + return false; + } + + return true; + } + + public int hashCode() { + final int prime = 31; + int result = 1; + + result = prime * result + ((sql == null) ? 0 : sql.hashCode()); + result = prime * result + ((catalog == null) ? 0 : catalog.hashCode()); + result = prime * result + ((methodType == null) ? 0 : methodType.hashCode()); + + result = prime * result + resultSetConcurrency; + result = prime * result + resultSetHoldability; + result = prime * result + resultSetType; + + result = prime * result + autoGeneratedKeys; + + result = prime * result + Arrays.hashCode(columnIndexes); + result = prime * result + Arrays.hashCode(columnNames); + + return result; + } + + public String getSql() { + return sql; + } + + } + + @SuppressWarnings("unchecked") + public T unwrap(Class iface) throws SQLException { + if (iface == PreparedStatement.class) { + if (stmt instanceof PreparedStatementProxy) { + return stmt.unwrap(iface); + } + return (T) stmt; + } + + if (iface == PreparedStatementHolder.class) { + return (T) this.holder; + } + + return super.unwrap(iface); + } +} From 71ee73b0987f3e6f6ae20c0d420eeb262a65380a Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Wed, 12 Sep 2012 21:54:26 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pool/DruidPooledPreparedStatement.java | 18 +- .../jconsole/DruidDataSourcePanel.java | 118 ++--- .../support/jconsole/DruidDriverPanel.java | 44 +- .../druid/support/jconsole/DruidPanel.java | 274 ++++++------ .../druid/support/jconsole/DruidSQLPanel.java | 409 +++++++++--------- .../support/jconsole/model/ColumnGroup.java | 83 ++-- .../model/DruidTableCellRenderer.java | 26 +- .../jconsole/model/DruidTableModel.java | 201 ++++----- .../jconsole/model/GroupableTableHeader.java | 30 +- .../model/GroupableTableHeaderUI.java | 104 ++--- .../jconsole/model/RowHeaderTable.java | 194 ++++----- .../jconsole/util/TableDataProcessor.java | 404 +++++++++-------- 12 files changed, 957 insertions(+), 948 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index 95c4d02edf..9977fb9130 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -62,7 +62,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement private int currentQueryTimeout; private int currentFetchDirection; private int currentFetchSize; - + private final static Log LOG = LogFactory.getLog(DruidPooledPreparedStatement.class); public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ @@ -76,9 +76,9 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement defaultMaxRows = stmt.getMaxRows(); defaultQueryTimeout = stmt.getQueryTimeout(); try { - defaultFetchDirection = stmt.getFetchDirection(); - }catch(Exception e) { - LOG.warn(e.getMessage(), e); + defaultFetchDirection = stmt.getFetchDirection(); + } catch (Exception e) { + LOG.warn(e.getMessage(), e); } defaultFetchSize = stmt.getFetchSize(); currentMaxFieldSize = defaultMaxFieldSize; @@ -188,7 +188,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement conn.beforeExecute(); try { ResultSet rs = stmt.executeQuery(); - + if (rs == null) { return null; } @@ -469,7 +469,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement if (holder.getHitCount() == 0) { return; } - + int fetchRowPeak = holder.getFetchRowPeak(); if (fetchRowPeak < 0) { @@ -1012,7 +1012,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement } } - + @SuppressWarnings("unchecked") public T unwrap(Class iface) throws SQLException { if (iface == PreparedStatement.class) { @@ -1021,11 +1021,11 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement } return (T) stmt; } - + if (iface == PreparedStatementHolder.class) { return (T) this.holder; } - + return super.unwrap(iface); } } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java index bd300d8dcf..c630c9dd87 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java @@ -33,74 +33,74 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; * service的请求地址:/datasource.json * * 请求service返回的json格式: + *
  * {"ResultCode":1,
- * 		"Content":
- * 			[{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql",
- * 			"DriverClassName":"com.mysql.jdbc.Driver",
- * 			"URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root",
- * 			"FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"],
- * 			"WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1,
- * 			"PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012",
- * 			"InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0,
- * 			"LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
- * 			"ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
- * 			"TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true,
- * 			"DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0,
- * 			"PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0,
- * 			"ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31,
- * 			"PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0,
- * 			"TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0],
- * 			"RemoveAbandoned":false
- * 			}]
+ *      "Content":
+ *          [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql",
+ *          "DriverClassName":"com.mysql.jdbc.Driver",
+ *          "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root",
+ *          "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"],
+ *          "WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1,
+ *          "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012",
+ *          "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0,
+ *          "LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
+ *          "ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
+ *          "TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true,
+ *          "DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0,
+ *          "PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0,
+ *          "ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31,
+ *          "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0,
+ *          "TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0],
+ *          "RemoveAbandoned":false
+ *          }]
  * }
+ * 
+ * + * @author yunnysunny * */ public class DruidDataSourcePanel extends DruidPanel { - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/datasource.json"; - private static final String KEY_WORD_IDENTITY = "Identity"; - private JPanel contentPanel; + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/datasource.json"; + private static final String KEY_WORD_IDENTITY = "Identity"; + private JPanel contentPanel; - public DruidDataSourcePanel() { - super(); - this.url = REQUEST_URL; - - } + public DruidDataSourcePanel(){ + super(); + this.url = REQUEST_URL; - private void addTable(ColumnData columnData) { - ArrayList>> data - = columnData.getTableDatas(); + } - int i = 0; - ArrayList ids = columnData.getNames(); + private void addTable(ColumnData columnData) { + ArrayList>> data = columnData.getTableDatas(); - for (ArrayList> listNow : data) { - - tableModel = new DruidTableModel(listNow); - table.setModel(tableModel); - - String id = ids.get(i); - JPanel panelNow = new JPanel(new BorderLayout()); - panelNow.setBorder((TitledBorder) BorderFactory - .createTitledBorder(KEY_WORD_IDENTITY + ":" + id)); - contentPanel.add(panelNow); - - panelNow.add(table.getTableHeader(),BorderLayout.NORTH); - panelNow.add(table); - table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); - - i++; - } - } + int i = 0; + ArrayList ids = columnData.getNames(); - @Override - protected void tableDataProcess( - ArrayList> data) { - ColumnData columnData = TableDataProcessor.mutilRow2col(data, - KEY_WORD_IDENTITY); - contentPanel = new JPanel(new GridLayout(0,1)); - addTable(columnData); + for (ArrayList> listNow : data) { - scrollPane.setViewportView(contentPanel); - } + tableModel = new DruidTableModel(listNow); + table.setModel(tableModel); + + String id = ids.get(i); + JPanel panelNow = new JPanel(new BorderLayout()); + panelNow.setBorder((TitledBorder) BorderFactory.createTitledBorder(KEY_WORD_IDENTITY + ":" + id)); + contentPanel.add(panelNow); + + panelNow.add(table.getTableHeader(), BorderLayout.NORTH); + panelNow.add(table); + table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); + + i++; + } + } + + @Override + protected void tableDataProcess(ArrayList> data) { + ColumnData columnData = TableDataProcessor.mutilRow2col(data, KEY_WORD_IDENTITY); + contentPanel = new JPanel(new GridLayout(0, 1)); + addTable(columnData); + + scrollPane.setViewportView(contentPanel); + } } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java index a202a17ce0..b60c9f0fd0 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDriverPanel.java @@ -27,32 +27,34 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; * 请求地址:/basic.json * * 请求返回的json格式: + *
  * {"ResultCode":1,"Content":
- * 			{"Version":"0.2.6","Drivers":
- * 					["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver",
- * 					"com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"]
- * 			}
+ *          {"Version":"0.2.6","Drivers":
+ *                  ["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver",
+ *                  "com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"]
+ *          }
  * }
+ * 
+ * + * @author yunnysunny * */ public class DruidDriverPanel extends DruidPanel { - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/basic.json"; - - public DruidDriverPanel() { - super(); - url = REQUEST_URL; + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/basic.json"; + + public DruidDriverPanel(){ + super(); + url = REQUEST_URL; } - @Override - protected void tableDataProcess( - ArrayList> data) { - ColumnData columnData = TableDataProcessor.row2col(data); - tableModel = new DruidTableModel(columnData.getDatas()); - table.setModel(tableModel); - table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); - - scrollPane.setViewportView(table); - } -} + @Override + protected void tableDataProcess(ArrayList> data) { + ColumnData columnData = TableDataProcessor.row2col(data); + tableModel = new DruidTableModel(columnData.getDatas()); + table.setModel(tableModel); + table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer()); + scrollPane.setViewportView(table); + } +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java index 54f97b36d0..a34ad8561b 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java @@ -40,189 +40,187 @@ import com.alibaba.druid.support.logging.LogFactory; import com.sun.tools.jconsole.JConsoleContext; /** - * druid面板的抽象类 - * 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中 + * druid面板的抽象类 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中 + * + * @author yunnysunny */ public abstract class DruidPanel extends JPanel { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; /** 成功的返回码 */ - protected static final int RESP_SUCCESS_RESULT = 1; - /**返回码在json中的键名 */ - protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; + protected static final int RESP_SUCCESS_RESULT = 1; + /** 返回码在json中的键名 */ + protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; /** 内容在json中的键名 */ protected static final String RESP_JSON_CONTENT_KEY = "Content"; /** 默认面板刷新的间隔时间 */ - protected static final long DEFAULT_ACTIVE_TIME = 5*60*1000; - /**版权信息字符串 */ - private static final String COPYRIGHT_STRING = "powered by yunnysunny"; - - /**滚动条面板*/ - protected JScrollPane scrollPane; + protected static final long DEFAULT_ACTIVE_TIME = 5 * 60 * 1000; + /** 版权信息字符串 */ + private static final String COPYRIGHT_STRING = "powered by yunnysunny"; + + /** 滚动条面板 */ + protected JScrollPane scrollPane; /** 表格模板 */ - protected DruidTableModel tableModel; + protected DruidTableModel tableModel; /** 表格 */ - protected JTable table; + protected JTable table; /** 版权面板 */ - protected JPanel copyrightPanel; + protected JPanel copyrightPanel; /** json请求的地址 */ - protected String url; - + protected String url; + /** 界面刷新的间隔时间,单位为毫秒. */ - protected long activeTime; - /**上次刷新的时间*/ - protected long lastRefreshTime; - private final static Log LOG = LogFactory.getLog(DruidPanel.class); - + protected long activeTime; + /** 上次刷新的时间 */ + protected long lastRefreshTime; + private final static Log LOG = LogFactory.getLog(DruidPanel.class); + /** * 根据传入的刷新时间间隔来初始化. - * + * * @param activeTime 刷新时间间隔 */ - protected DruidPanel(long activeTime) { - this.activeTime = activeTime; - } - + protected DruidPanel(long activeTime){ + this.activeTime = activeTime; + } + /** * 初始化刷新时间间隔为默认值 - * */ - protected DruidPanel() { - activeTime = DEFAULT_ACTIVE_TIME; + */ + protected DruidPanel(){ + activeTime = DEFAULT_ACTIVE_TIME; } - + /** * 解析调用service后得到JSON数据 - * + * * @param respData 获取到的json对象 * @return 返回解析后的数据 */ @SuppressWarnings("unchecked") - protected ArrayList> parseData(Object respData) { - ArrayList> data = null; - if (respData instanceof Map) { - LinkedHashMap map = (LinkedHashMap)respData; - int rv = (Integer)map.get(RESP_JSON_RESULT_KEY); + protected ArrayList> parseData(Object respData) { + ArrayList> data = null; + if (respData instanceof Map) { + LinkedHashMap map = (LinkedHashMap) respData; + int rv = (Integer) map.get(RESP_JSON_RESULT_KEY); - if (rv == RESP_SUCCESS_RESULT) { - Object content = map.get(RESP_JSON_CONTENT_KEY); - if (content instanceof List) { - data = (ArrayList>)content; - } else if (content instanceof Map) { - LinkedHashMap contentEle - = (LinkedHashMap)content; - data = new ArrayList>(); - data.add(contentEle); - } - } - } - return data; + if (rv == RESP_SUCCESS_RESULT) { + Object content = map.get(RESP_JSON_CONTENT_KEY); + if (content instanceof List) { + data = (ArrayList>) content; + } else if (content instanceof Map) { + LinkedHashMap contentEle = (LinkedHashMap) content; + data = new ArrayList>(); + data.add(contentEle); + } + } + } + return data; } - + /** * 调用service,返回数据 - * + * * @param url service的地址 * @param conn MBeanServerConnection对象 * @return 调用service后返回的数据 - * @throws Exception + * @throws Exception */ - protected Object getData(String url,MBeanServerConnection conn) throws Exception { - Object o = null; - ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); - - String result = (String) conn.invoke(name, "service", - new String[] { url }, new String[] { String.class.getName() }); + protected Object getData(String url, MBeanServerConnection conn) throws Exception { + Object o = null; + ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); + + String result = (String) conn.invoke(name, "service", new String[] { url }, + new String[] { String.class.getName() }); o = JSONUtils.parse(result); if (LOG.isDebugEnabled()) { - LOG.debug(o.toString()); + LOG.debug(o.toString()); } return o; } - + /** * 调用完service之后,各个子类对于解析后的数据的具体处理 - * + * * @param data 解析后的数据 */ - protected abstract void tableDataProcess(ArrayList> data); - + protected abstract void tableDataProcess(ArrayList> data); + /** * 如果是第一次调用,则生成表格对象;否则根据当前时间来和上次刷新时间的间隔, * 是否大于对象初始化时设定的时间间隔来判断是否刷新表格数据。 - * + * * @param url service的地址 * @param conn MBeanServerConnection对象 * @throws Exception */ - protected void addOrRefreshTable(String url,MBeanServerConnection conn) throws Exception { - if (url != null) { - boolean needRefresh = false; - long timeNow = new Date().getTime(); - if (scrollPane == null) { - table = new JTable(); + protected void addOrRefreshTable(String url, MBeanServerConnection conn) throws Exception { + if (url != null) { + boolean needRefresh = false; + long timeNow = new Date().getTime(); + if (scrollPane == null) { + table = new JTable(); - scrollPane = new JScrollPane(); - scrollPane.setAutoscrolls(true); - scrollPane.setBorder((TitledBorder)BorderFactory.createTitledBorder("数据区")); - - setLayout(null); - scrollPane.setBounds(10, 10, getWidth()-20, getHeight()-80); + scrollPane = new JScrollPane(); + scrollPane.setAutoscrolls(true); + scrollPane.setBorder((TitledBorder) BorderFactory.createTitledBorder("数据区")); - this.add(scrollPane); - - copyrightPanel = new JPanel(); - copyrightPanel.setBorder((TitledBorder)BorderFactory.createTitledBorder("版权区")); - JLabel authorInfo = new JLabel(COPYRIGHT_STRING); - copyrightPanel.add(authorInfo); - - this.add(copyrightPanel); - copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60); - - needRefresh = true; - lastRefreshTime = timeNow; - this.addComponentListener(new ComponentListener() { - - @Override - public void componentShown(ComponentEvent arg0) { - - } - - @Override - public void componentResized(ComponentEvent arg0) { - scrollPane.setBounds(10, 10, getWidth()-20, - getHeight()-80); - copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60); - } - - @Override - public void componentMoved(ComponentEvent arg0) { - - } - - @Override - public void componentHidden(ComponentEvent arg0) { - - } - }); - } else { - if (lastRefreshTime + activeTime < timeNow) { - needRefresh = true; - lastRefreshTime = timeNow; - } - } - if (needRefresh) { - LOG.debug("refresh" + timeNow); - ArrayList> data = parseData(getData( - url, conn)); - if (data != null) { - tableDataProcess(data); - } - } + setLayout(null); + scrollPane.setBounds(10, 10, getWidth() - 20, getHeight() - 80); - } else { - // url不存在 - LOG.warn("url不存在"); - } + this.add(scrollPane); + + copyrightPanel = new JPanel(); + copyrightPanel.setBorder((TitledBorder) BorderFactory.createTitledBorder("版权区")); + JLabel authorInfo = new JLabel(COPYRIGHT_STRING); + copyrightPanel.add(authorInfo); + + this.add(copyrightPanel); + copyrightPanel.setBounds(10, getHeight() - 60, getWidth() - 20, 60); + + needRefresh = true; + lastRefreshTime = timeNow; + this.addComponentListener(new ComponentListener() { + + @Override + public void componentShown(ComponentEvent arg0) { + + } + + @Override + public void componentResized(ComponentEvent arg0) { + scrollPane.setBounds(10, 10, getWidth() - 20, getHeight() - 80); + copyrightPanel.setBounds(10, getHeight() - 60, getWidth() - 20, 60); + } + + @Override + public void componentMoved(ComponentEvent arg0) { + + } + + @Override + public void componentHidden(ComponentEvent arg0) { + + } + }); + } else { + if (lastRefreshTime + activeTime < timeNow) { + needRefresh = true; + lastRefreshTime = timeNow; + } + } + if (needRefresh) { + LOG.debug("refresh" + timeNow); + ArrayList> data = parseData(getData(url, conn)); + if (data != null) { + tableDataProcess(data); + } + } + + } else { + // url不存在 + LOG.warn("url不存在"); + } } protected Object doInBackground(JConsoleContext context) throws Exception { @@ -230,13 +228,13 @@ public abstract class DruidPanel extends JPanel { return null; } - + protected void doInBackground(MBeanServerConnection conn) { - + try { - addOrRefreshTable(url,conn); - } catch (Exception e) { - LOG.warn("", e); - } + addOrRefreshTable(url, conn); + } catch (Exception e) { + LOG.warn("", e); + } } -} \ No newline at end of file +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java index b3e6b88732..7bb07181ba 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.support.jconsole; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; @@ -33,6 +35,7 @@ import com.alibaba.druid.support.jconsole.model.DruidTableModel; import com.alibaba.druid.support.jconsole.model.GroupableTableHeader; import com.alibaba.druid.support.jconsole.model.GroupableTableHeaderUI; import com.alibaba.druid.support.jconsole.model.RowHeaderTable; + /** * 请求地址 /sql.json * @@ -79,217 +82,233 @@ import com.alibaba.druid.support.jconsole.model.RowHeaderTable; ] } + + @author yunnysunny * */ public class DruidSQLPanel extends DruidPanel { - private static final long serialVersionUID = 1L; - private static final String REQUEST_URL = "/sql.json"; - private static final ArrayList SHOW_LIST = new ArrayList() { + private static final long serialVersionUID = 1L; + private static final String REQUEST_URL = "/sql.json"; + private static final ArrayList SHOW_LIST = new ArrayList() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - { - add("SQL"); - add("ExecuteCount"); - add("TotalTime"); - add("InTransactionCount"); - add("ErrorCount"); - add("EffectedRowCount"); - add("FetchRowCount"); - add("RunningCount"); - add("ConcurrentMax"); - add("Histogram"); - add("EffectedRowCountHistogram"); - add("ExecuteAndResultHoldTimeHistogram"); - add("FetchRowCountHistogram"); - } + { + add("SQL"); + add("ExecuteCount"); + add("TotalTime"); + add("InTransactionCount"); + add("ErrorCount"); + add("EffectedRowCount"); + add("FetchRowCount"); + add("RunningCount"); + add("ConcurrentMax"); + add("Histogram"); + add("EffectedRowCountHistogram"); + add("ExecuteAndResultHoldTimeHistogram"); + add("FetchRowCountHistogram"); + } - }; - private static final ArrayList REAL_SHOW_LIST = new ArrayList() { + }; + private static final ArrayList REAL_SHOW_LIST = new ArrayList() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - { - add("SQL"); - add("ExecuteCount"); - add("TotalTime"); - add("InTransactionCount"); - add("ErrorCount"); - add("EffectedRowCount"); - add("FetchRowCount"); - add("RunningCount"); - add("ConcurrentMax"); - add("Histogram"); - add("EffectedRowCountHistogram"); - add("ExecuteAndResultHoldTimeHistogram"); - add("FetchRowCountHistogram"); - } - }; - private static final String HISOGRAM = "Histogram"; - private static final String Effected_RowCount_HISOGRAM = "EffectedRowCountHistogram"; - private static final String ExecuteAndResult_Hold_HISOGRAM = "ExecuteAndResultHoldTimeHistogram"; - private static final String FetchRowCount_HISOGRAM = "FetchRowCountHistogram"; - private static final ArrayList ARRAY_DATA_MAP = new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(HISOGRAM); - add(Effected_RowCount_HISOGRAM); - add(ExecuteAndResult_Hold_HISOGRAM); - add(FetchRowCount_HISOGRAM); - } - }; - private static final int FIST_LIST_OFFSET = 9; + { + add("SQL"); + add("ExecuteCount"); + add("TotalTime"); + add("InTransactionCount"); + add("ErrorCount"); + add("EffectedRowCount"); + add("FetchRowCount"); + add("RunningCount"); + add("ConcurrentMax"); + add("Histogram"); + add("EffectedRowCountHistogram"); + add("ExecuteAndResultHoldTimeHistogram"); + add("FetchRowCountHistogram"); + } + }; + private static final String HISOGRAM = "Histogram"; + private static final String Effected_RowCount_HISOGRAM = "EffectedRowCountHistogram"; + private static final String ExecuteAndResult_Hold_HISOGRAM = "ExecuteAndResultHoldTimeHistogram"; + private static final String FetchRowCount_HISOGRAM = "FetchRowCountHistogram"; + private static final ArrayList ARRAY_DATA_MAP = new ArrayList() { - private ColumnGroup groupHistogram; - private ColumnGroup groupEffectedRowCountHistogram; - private ColumnGroup groupExecuteAndResultHoldTimeHistogram; - private ColumnGroup groupFetchRowCountHistogram; - private ArrayList listHistogram; - private ArrayList listEffectedRowCountHistogram; - private ArrayList listExecuteAndResultHoldTimeHistogram; - private ArrayList listFetchRowCountHistogram; - + private static final long serialVersionUID = 1L; + { + add(HISOGRAM); + add(Effected_RowCount_HISOGRAM); + add(ExecuteAndResult_Hold_HISOGRAM); + add(FetchRowCount_HISOGRAM); + } + }; + private static final int FIST_LIST_OFFSET = 9; - public DruidSQLPanel() { - super(); - this.url = REQUEST_URL; - } - - private void addGroupData(String keyNow, int index) { -// System.out.println("keyNow:"+keyNow+"index:"+index); - if (HISOGRAM.equals(keyNow)) { - listHistogram.add(index); - } else if (Effected_RowCount_HISOGRAM.equals(keyNow)) { - listEffectedRowCountHistogram.add(index); - } else if (ExecuteAndResult_Hold_HISOGRAM.equals(keyNow)) { - listExecuteAndResultHoldTimeHistogram.add(index); - } else if (FetchRowCount_HISOGRAM.equals(keyNow)) { - listFetchRowCountHistogram.add(index); - } - } - - /** - * 数据预处理,将没有用到的数据删除掉,将牵扯到时间分布的数据拆分出来。 - * - * @param data 要处理的数据 - * @return 最终的处理结果 - */ - private ArrayList> preProcess( - ArrayList> data) { - groupHistogram = new ColumnGroup(HISOGRAM); - groupEffectedRowCountHistogram = new ColumnGroup(Effected_RowCount_HISOGRAM); - groupExecuteAndResultHoldTimeHistogram = new ColumnGroup(ExecuteAndResult_Hold_HISOGRAM); - groupFetchRowCountHistogram = new ColumnGroup(FetchRowCount_HISOGRAM); - listHistogram = new ArrayList(); - listEffectedRowCountHistogram = new ArrayList(); - listExecuteAndResultHoldTimeHistogram = new ArrayList(); - listFetchRowCountHistogram = new ArrayList(); - - ArrayList> newData - = new ArrayList>(); - int dataIndex = 0; - for (LinkedHashMap dataNow : data) { - //先把不需要显示的内容删除掉 - for (Iterator> it = dataNow.entrySet().iterator(); it.hasNext();) { - Entry entry = it.next(); - if (!SHOW_LIST.contains(entry.getKey())) { - it.remove(); - } - } -// if (dataIndex==0) -// System.out.println(dataNow.toString()); - int offset = FIST_LIST_OFFSET; - - for (String arrayKey:ARRAY_DATA_MAP) {//把数组数据显示为单个数据 - Object arrayData = dataNow.get(arrayKey); - - if (arrayData instanceof ArrayList) { - - dataNow.remove(arrayKey); - if (dataIndex == 0) { - REAL_SHOW_LIST.remove(arrayKey); - } - @SuppressWarnings("unchecked") - ArrayList arrayDataList = (ArrayList)arrayData; - for (int j=0,len=arrayDataList.size();j= 0)? - (int)Math.pow(10,j-1) - : 0; - int b = (int)Math.pow(10,j); - String newKey = arrayKey + "-" +a + "~" + b+"ms"; - - dataNow.put(newKey, arrayDataList.get(j)); - if (dataIndex == 0) { - REAL_SHOW_LIST.add(newKey); - int index = offset+j; - addGroupData(arrayKey,index); - if (j == len -1) { - offset = index+1; - } - } - } - } else { - - } + private ColumnGroup groupHistogram; + private ColumnGroup groupEffectedRowCountHistogram; + private ColumnGroup groupExecuteAndResultHoldTimeHistogram; + private ColumnGroup groupFetchRowCountHistogram; + private ArrayList listHistogram; + private ArrayList listEffectedRowCountHistogram; + private ArrayList listExecuteAndResultHoldTimeHistogram; + private ArrayList listFetchRowCountHistogram; + private ArrayList ids; + private static final String JSON_ID_NAME = "ID"; - }//end of foreach ARRAY_DATA_MAP - dataIndex ++; - newData.add(dataNow); - } - - return newData; - } - - private void addTableGroup() { - - TableColumnModel cm = table.getColumnModel(); -// System.out.println(SHOW_LIST.size()); - for(int i : listHistogram) { - groupHistogram.add(cm.getColumn(i)); - } - for (int j: listEffectedRowCountHistogram) { - groupEffectedRowCountHistogram.add(cm.getColumn(j)); - } - for (int x : listExecuteAndResultHoldTimeHistogram) { - groupExecuteAndResultHoldTimeHistogram.add(cm.getColumn(x)); - } - for (int y : listFetchRowCountHistogram) { - groupFetchRowCountHistogram.add(cm.getColumn(y)); - } - - GroupableTableHeader header = (GroupableTableHeader) table. getTableHeader(); - header.addColumnGroup(groupHistogram); + public DruidSQLPanel(){ + super(); + this.url = REQUEST_URL; + } + + private void addGroupData(String keyNow, int index) { + // System.out.println("keyNow:"+keyNow+"index:"+index); + if (HISOGRAM.equals(keyNow)) { + listHistogram.add(index); + } else if (Effected_RowCount_HISOGRAM.equals(keyNow)) { + listEffectedRowCountHistogram.add(index); + } else if (ExecuteAndResult_Hold_HISOGRAM.equals(keyNow)) { + listExecuteAndResultHoldTimeHistogram.add(index); + } else if (FetchRowCount_HISOGRAM.equals(keyNow)) { + listFetchRowCountHistogram.add(index); + } + } + + /** + * 数据预处理,将没有用到的数据删除掉,将牵扯到时间分布的数据拆分出来。 + * + * @param data 要处理的数据 + * @return 最终的处理结果 + */ + private ArrayList> preProcess(ArrayList> data) { + groupHistogram = new ColumnGroup(HISOGRAM); + groupEffectedRowCountHistogram = new ColumnGroup(Effected_RowCount_HISOGRAM); + groupExecuteAndResultHoldTimeHistogram = new ColumnGroup(ExecuteAndResult_Hold_HISOGRAM); + groupFetchRowCountHistogram = new ColumnGroup(FetchRowCount_HISOGRAM); + listHistogram = new ArrayList(); + listEffectedRowCountHistogram = new ArrayList(); + listExecuteAndResultHoldTimeHistogram = new ArrayList(); + listFetchRowCountHistogram = new ArrayList(); + ids = new ArrayList(); + + ArrayList> newData = new ArrayList>(); + int dataIndex = 0; + for (LinkedHashMap dataNow : data) { + // 先把不需要显示的内容删除掉 + for (Iterator> it = dataNow.entrySet().iterator(); it.hasNext();) { + Entry entry = it.next(); + String key = entry.getKey(); + Object value = entry.getValue(); + if (JSON_ID_NAME.equals(key)) { + ids.add(value != null ? value.toString() : null); + } + if (!SHOW_LIST.contains(key)) { + it.remove(); + } + } + // if (dataIndex==0) + // System.out.println(dataNow.toString()); + int offset = FIST_LIST_OFFSET; + + for (String arrayKey : ARRAY_DATA_MAP) {// 把数组数据显示为单个数据 + Object arrayData = dataNow.get(arrayKey); + + if (arrayData instanceof ArrayList) { + + dataNow.remove(arrayKey); + if (dataIndex == 0) { + REAL_SHOW_LIST.remove(arrayKey); + } + @SuppressWarnings("unchecked") + ArrayList arrayDataList = (ArrayList) arrayData; + for (int j = 0, len = arrayDataList.size(); j < len; j++) { + int a = (j - 1 >= 0) ? (int) Math.pow(10, j - 1) : 0; + int b = (int) Math.pow(10, j); + String newKey = arrayKey + "-" + a + "~" + b + "ms"; + + dataNow.put(newKey, arrayDataList.get(j)); + if (dataIndex == 0) { + REAL_SHOW_LIST.add(newKey); + int index = offset + j; + addGroupData(arrayKey, index); + if (j == len - 1) { + offset = index + 1; + } + } + } + } else { + + } + + }// end of foreach ARRAY_DATA_MAP + dataIndex++; + newData.add(dataNow); + } + + return newData; + } + + private void addTableGroup() { + + TableColumnModel cm = table.getColumnModel(); + // System.out.println(SHOW_LIST.size()); + for (int i : listHistogram) { + groupHistogram.add(cm.getColumn(i)); + } + for (int j : listEffectedRowCountHistogram) { + groupEffectedRowCountHistogram.add(cm.getColumn(j)); + } + for (int x : listExecuteAndResultHoldTimeHistogram) { + groupExecuteAndResultHoldTimeHistogram.add(cm.getColumn(x)); + } + for (int y : listFetchRowCountHistogram) { + groupFetchRowCountHistogram.add(cm.getColumn(y)); + } + + GroupableTableHeader header = (GroupableTableHeader) table.getTableHeader(); + header.addColumnGroup(groupHistogram); header.addColumnGroup(groupEffectedRowCountHistogram); header.addColumnGroup(groupExecuteAndResultHoldTimeHistogram); header.addColumnGroup(groupFetchRowCountHistogram); header.setUI(new GroupableTableHeaderUI()); - } + } - @Override - protected void tableDataProcess( - ArrayList> data) { - table = new JTable() { - private static final long serialVersionUID = 1L; + @Override + protected void tableDataProcess(ArrayList> data) { + table = new JTable() { - @Override - protected JTableHeader createDefaultTableHeader() { + private static final long serialVersionUID = 1L; - return new GroupableTableHeader(columnModel); - } - }; - data = preProcess(data); -// System.out.println(SHOW_LIST); - tableModel = new DruidTableModel(data,REAL_SHOW_LIST); -// System.out.println(data.toString()); - table.setModel(tableModel); - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - addTableGroup(); - - RowHeaderTable header = new RowHeaderTable(table,20); - scrollPane.setRowHeaderView(header); - scrollPane.setViewportView(table); - JLabel jb = new JLabel("N",SwingConstants.CENTER); - jb.setBorder(new BevelBorder(BevelBorder.RAISED,null,null,null,null)); - scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,jb); - } + @Override + protected JTableHeader createDefaultTableHeader() { + + return new GroupableTableHeader(columnModel); + } + }; + data = preProcess(data); + // System.out.println(SHOW_LIST); + tableModel = new DruidTableModel(data, REAL_SHOW_LIST); + // System.out.println(data.toString()); + table.setModel(tableModel); + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + addTableGroup(); + table.addMouseListener(new MouseAdapter() { + + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) {// 点击几次,这里是双击事件 + int row = table.getSelectedRow(); + String id = ids.get(row); + System.out.println(id); + } + } + }); + + RowHeaderTable header = new RowHeaderTable(table, 20); + scrollPane.setRowHeaderView(header); + scrollPane.setViewportView(table); + JLabel jb = new JLabel("N", SwingConstants.CENTER); + jb.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null)); + scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, jb); + } } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java b/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java index 3c3946d512..efb70d517b 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/ColumnGroup.java @@ -4,7 +4,7 @@ import java.awt.Component; import java.awt.Dimension; import java.util.Enumeration; import java.util.Vector; - + import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; @@ -12,30 +12,31 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; - + public class ColumnGroup { - /**合并的JTableHeader的Renderer*/ - protected TableCellRenderer renderer=null; - /**合并的单元格的各个实际的最小单元格存储结构*/ - protected Vector vector=null; - /**合并后单元格显示的文本信息*/ - protected String text=null; - /**合并的单元格内部两个最小JTableHeader的间隙,其实就是去掉线后那个Border*/ - private int margin = 0; - - public ColumnGroup(String text) { + + /** 合并的JTableHeader的Renderer */ + protected TableCellRenderer renderer = null; + /** 合并的单元格的各个实际的最小单元格存储结构 */ + protected Vector vector = null; + /** 合并后单元格显示的文本信息 */ + protected String text = null; + /** 合并的单元格内部两个最小JTableHeader的间隙,其实就是去掉线后那个Border */ + private int margin = 0; + + public ColumnGroup(String text){ this(null, text); } - - public ColumnGroup(TableCellRenderer renderer, String text) { + + public ColumnGroup(TableCellRenderer renderer, String text){ if (renderer == null) { this.renderer = new DefaultTableCellRenderer() { + private static final long serialVersionUID = 1L; - + @Override - public Component getTableCellRendererComponent(JTable table, - Object value, boolean isSelected, boolean hasFocus, - int row, int column) { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { JTableHeader header = table.getTableHeader(); if (header != null) { setForeground(header.getForeground()); @@ -54,33 +55,35 @@ public class ColumnGroup { this.text = text; vector = new Vector(); } + /** * 增加单元格 + * * @param obj */ public void add(Object obj) { - if (obj == null) - return; + if (obj == null) return; vector.addElement(obj); } + /** * 根据JTable的某一列取得它的所有的包含列, + * * @param column * @param group * @return */ public Vector getColumnGroups(TableColumn column, Vector group) { - //通过递归判断列到底属于那个ColumnGroup + // 通过递归判断列到底属于那个ColumnGroup group.addElement(this); - if (vector.contains(column)) - return group; + if (vector.contains(column)) return group; Enumeration enumeration = vector.elements(); while (enumeration.hasMoreElements()) { Object obj = enumeration.nextElement(); if (obj instanceof ColumnGroup) { @SuppressWarnings("unchecked") Vector groups = ((ColumnGroup) obj).getColumnGroups(column, - (Vector) group.clone()); + (Vector) group.clone()); if (groups != null) { return groups; } @@ -88,33 +91,35 @@ public class ColumnGroup { } return null; } - + public TableCellRenderer getHeaderRenderer() { return renderer; } - + public Object getHeaderValue() { return text; } + /** * 取得合并后的单元格的大小 + * * @return */ public int getSize() { return vector == null ? 0 : vector.size(); } + /** - * 取得合并后的单元格的大小,这个方法需要计算,首先 - * 是取得一个没有合并的最小单元格的JTableHeader - * 的大小,通过Renderer取得组件 + * 取得合并后的单元格的大小,这个方法需要计算,首先 是取得一个没有合并的最小单元格的JTableHeader 的大小,
+ * 通过Renderer取得组件 + * * @return */ public Dimension getSize(JTable table) { - Component comp = renderer.getTableCellRendererComponent(table, - getHeaderValue(), false, false, -1, -1); + Component comp = renderer.getTableCellRendererComponent(table, getHeaderValue(), false, false, -1, -1); int height = comp.getPreferredSize().height; int width = 0; - //宽度需要计算合并的还要加上间隙 + // 宽度需要计算合并的还要加上间隙 Enumeration enumeration = vector.elements(); while (enumeration.hasMoreElements()) { Object obj = enumeration.nextElement(); @@ -128,11 +133,11 @@ public class ColumnGroup { } return new Dimension(width, height); } - + public java.lang.String getText() { return text; } - + public boolean removeColumn(ColumnGroup ptg, TableColumn tc) { boolean retFlag = false; if (tc != null) { @@ -154,7 +159,7 @@ public class ColumnGroup { } return retFlag; } - + public boolean removeColumnGrp(ColumnGroup ptg, ColumnGroup tg) { boolean retFlag = false; if (tg != null) { @@ -170,7 +175,7 @@ public class ColumnGroup { if (retFlag) { break; } - + } } else if (tmpObj instanceof TableColumn) { break; @@ -179,7 +184,7 @@ public class ColumnGroup { } return retFlag; } - + public void setColumnMargin(int margin) { this.margin = margin; Enumeration enumeration = vector.elements(); @@ -190,13 +195,13 @@ public class ColumnGroup { } } } - + public void setHeaderRenderer(TableCellRenderer renderer) { if (renderer != null) { this.renderer = renderer; } } - + public void setText(java.lang.String newText) { text = newText; } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java index 7fb4c29bf3..a55c2ca855 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableCellRenderer.java @@ -7,30 +7,30 @@ import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; -public class DruidTableCellRenderer extends JLabel implements TableCellRenderer -{ +/** + * @author yunnysunny + * */ +public class DruidTableCellRenderer extends JLabel implements TableCellRenderer { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - // This method is called each time a cell in a column + // This method is called each time a cell in a column // using this renderer needs to be rendered. - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, int row, int column) - { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, + int row, int column) { - if ((column == 0)) - { - setBackground(Color.lightGray); + if ((column == 0)) { + setBackground(Color.lightGray); } this.setOpaque(true); if (value != null) { - setText(value.toString()); + setText(value.toString()); } else { - setText((row + 1)+""); + setText((row + 1) + ""); } // Since the renderer is a component, return itself return this; } -} \ No newline at end of file +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java index c9f4bae874..62c9d88da5 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/DruidTableModel.java @@ -23,117 +23,120 @@ import javax.swing.table.TableModel; /** * 自定义duird监控数据表格模板类 + * + * @author yunnysunny */ public class DruidTableModel implements TableModel { - - /** 数据内容. */ - private ArrayList> list; - - /** 自定义列名集合. */ - private ArrayList showKeys; - public DruidTableModel(ArrayList> list) { - super(); - this.list = list; - showKeys = null; - } + /** 数据内容. */ + private ArrayList> list; - public DruidTableModel(ArrayList> list, - ArrayList showKeys) { - super(); - this.list = list; - this.showKeys = showKeys; - } + /** 自定义列名集合. */ + private ArrayList showKeys; + public DruidTableModel(ArrayList> list){ + super(); + this.list = list; + showKeys = null; + } - @Override - public Class getColumnClass(int columnIndex) { - return String.class; - } + public DruidTableModel(ArrayList> list, ArrayList showKeys){ + super(); + this.list = list; + this.showKeys = showKeys; + } - /* 如果设置了列名,就是列名的长度;否则返回数据的第一条LinkedHashmap的长度 - * @see javax.swing.table.TableModel#getColumnCount() - */ - @Override - public int getColumnCount() { - int colCount = 0; - if (showKeys != null) { - colCount = showKeys.size(); - } else if (list != null) { - int listLen = list.size(); - if (listLen > 0) { - colCount = list.get(0).size(); - } - } - return colCount; - } - - /* 如果设置了自定义列名,则使用自定义列名,并且在返回前拆除掉'-'前面的内容; - * 如果没有设置,则返回第一条内容的LinkedHashMap的键名。 - * @see javax.swing.table.TableModel#getColumnName(int) - */ - @Override - public String getColumnName(int columnIndex) { - if (showKeys != null && showKeys.size() > 0) { - String keyNow = showKeys.get(columnIndex); - if (keyNow != null) { - return keyNow.substring(keyNow.indexOf('-')+1, keyNow.length()); - } - } - if (list != null && list.size() > 0) { - LinkedHashMap firstElement = list.get(0); - Object[] keys = firstElement.keySet().toArray(); - return keys[columnIndex].toString(); - } - return null; - } + @Override + public Class getColumnClass(int columnIndex) { + return String.class; + } - @Override - public int getRowCount() { - return list.size(); - } + /* + * 如果设置了列名,就是列名的长度;否则返回数据的第一条LinkedHashmap的长度 + * @see javax.swing.table.TableModel#getColumnCount() + */ + @Override + public int getColumnCount() { + int colCount = 0; + if (showKeys != null) { + colCount = showKeys.size(); + } else if (list != null) { + int listLen = list.size(); + if (listLen > 0) { + colCount = list.get(0).size(); + } + } + return colCount; + } - /* 如果设置了自定义列名,则返回当前列数对应的列名在LinkedHashMap中对应的值; - * 否则,返回当前LinkedHashMap在当前列数位置对应的值。 - * @see javax.swing.table.TableModel#getValueAt(int, int) - */ - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (list != null && rowIndex < list.size()) {//没有超出最大行数 - LinkedHashMap dataNow = list.get(rowIndex); - if (showKeys != null) { - int titleLen = showKeys.size(); - if (titleLen > 0 && columnIndex < titleLen) { - return dataNow.get(showKeys.get(columnIndex)); - } - } else { - Object[] values = dataNow.values().toArray(); - if (columnIndex < values.length) { - return values[columnIndex]; - } - } - } - return null; - } + /* + * 如果设置了自定义列名,则使用自定义列名,并且在返回前拆除掉'-'前面的内容; + * 如果没有设置,则返回第一条内容的LinkedHashMap的键名。 + * @see javax.swing.table.TableModel#getColumnName(int) + */ + @Override + public String getColumnName(int columnIndex) { + if (showKeys != null && showKeys.size() > 0) { + String keyNow = showKeys.get(columnIndex); + if (keyNow != null) { + return keyNow.substring(keyNow.indexOf('-') + 1, keyNow.length()); + } + } + if (list != null && list.size() > 0) { + LinkedHashMap firstElement = list.get(0); + Object[] keys = firstElement.keySet().toArray(); + return keys[columnIndex].toString(); + } + return null; + } - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } + @Override + public int getRowCount() { + return list.size(); + } - @Override - public void addTableModelListener(TableModelListener l) { - - } + /* + * 如果设置了自定义列名,则返回当前列数对应的列名在LinkedHashMap中对应的值; + * 否则,返回当前LinkedHashMap在当前列数位置对应的值。 + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (list != null && rowIndex < list.size()) {// 没有超出最大行数 + LinkedHashMap dataNow = list.get(rowIndex); + if (showKeys != null) { + int titleLen = showKeys.size(); + if (titleLen > 0 && columnIndex < titleLen) { + return dataNow.get(showKeys.get(columnIndex)); + } + } else { + Object[] values = dataNow.values().toArray(); + if (columnIndex < values.length) { + return values[columnIndex]; + } + } + } + return null; + } - @Override - public void removeTableModelListener(TableModelListener l) { - - } + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - - } + @Override + public void addTableModelListener(TableModelListener l) { + + } + + @Override + public void removeTableModelListener(TableModelListener l) { + + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + + } } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java index 8664ac486c..3bd79c2df2 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeader.java @@ -2,35 +2,35 @@ package com.alibaba.druid.support.jconsole.model; import java.util.Enumeration; import java.util.Vector; - + import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; - + public class GroupableTableHeader extends JTableHeader { - private static final long serialVersionUID = 1L; - // private static final String uiClassID = "GroupableTableHeaderUI"; - protected Vector columnGroups = null; - - public GroupableTableHeader(TableColumnModel model) { + private static final long serialVersionUID = 1L; + // private static final String uiClassID = "GroupableTableHeaderUI"; + protected Vector columnGroups = null; + + public GroupableTableHeader(TableColumnModel model){ super(model); setUI(new GroupableTableHeaderUI()); setReorderingAllowed(false); setRequestFocusEnabled(false); } - + public void addColumnGroup(ColumnGroup g) { if (columnGroups == null) { columnGroups = new Vector(); } columnGroups.addElement(g); } - + public void clearColumnGroups() { columnGroups = null; } - + public ColumnGroup[] getColumnGroups() { ColumnGroup[] retg = null; if (columnGroups.size() > 0) { @@ -39,8 +39,8 @@ public class GroupableTableHeader extends JTableHeader { } return retg; } - - public Enumeration getColumnGroups(TableColumn col) { + + public Enumeration getColumnGroups(TableColumn col) { if (columnGroups == null) { return null; } @@ -54,11 +54,11 @@ public class GroupableTableHeader extends JTableHeader { } return null; } - + public boolean isFocusTraversable() { return super.isFocusTraversable() && isRequestFocusEnabled(); } - + public void setColumnMargin() { if (columnGroups == null) { return; @@ -70,7 +70,7 @@ public class GroupableTableHeader extends JTableHeader { cGroup.setColumnMargin(columnMargin); } } - + public void setReorderingAllowed(boolean b) { reorderingAllowed = b; } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java index e3595a6ac4..d98337d9b0 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/GroupableTableHeaderUI.java @@ -7,7 +7,7 @@ import java.awt.Rectangle; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; - + import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTable; @@ -18,10 +18,11 @@ import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; - + public class GroupableTableHeaderUI extends BasicTableHeaderUI { + private int m_height; - + private Dimension createHeaderSize(long width) { TableColumnModel columnModel = header.getColumnModel(); width += columnModel.getColumnMargin() * columnModel.getColumnCount(); @@ -30,7 +31,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } return new Dimension((int) width, getHeaderHeight()); } - + private int getColCountUnderColGroup(ColumnGroup cg, int iCount) { Vector v = cg.vector; for (int i = 0; i < v.size(); i++) { @@ -43,7 +44,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } return iCount; } - + public int getHeaderHeight() { int height = 0; TableColumnModel columnModel = header.getColumnModel(); @@ -52,12 +53,12 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { TableCellRenderer renderer = aColumn.getHeaderRenderer(); if (renderer == null) { renderer = new DefaultTableCellRenderer() { - private static final long serialVersionUID = 1L; - @Override - public Component getTableCellRendererComponent( - JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { JTableHeader header = table.getTableHeader(); if (header != null) { setForeground(header.getForeground()); @@ -71,16 +72,13 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } }; } - Component comp = renderer.getTableCellRendererComponent(header - .getTable(), aColumn.getHeaderValue(), false, false, -1, - column); + Component comp = renderer.getTableCellRendererComponent(header.getTable(), aColumn.getHeaderValue(), false, + false, -1, column); int cHeight = comp.getPreferredSize().height; - Enumeration enumeration = ((GroupableTableHeader) header) - .getColumnGroups(aColumn); + Enumeration enumeration = ((GroupableTableHeader) header).getColumnGroups(aColumn); if (enumeration != null) { while (enumeration.hasMoreElements()) { - ColumnGroup cGroup = (ColumnGroup) enumeration - .nextElement(); + ColumnGroup cGroup = (ColumnGroup) enumeration.nextElement(); cHeight += cGroup.getSize(header.getTable()).height; } } @@ -89,19 +87,19 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { height = Math.max(height, m_height); return height; } - + @Override public Dimension getPreferredSize(JComponent c) { long width = 0; Enumeration enumeration = header.getColumnModel().getColumns(); while (enumeration.hasMoreElements()) { - TableColumn aColumn = enumeration.nextElement(); + TableColumn aColumn = enumeration.nextElement(); width = width + aColumn.getWidth(); } - + return createHeaderSize(width); } - + @Override public void paint(Graphics g, JComponent c) { Rectangle clipBounds = g.getClipBounds(); @@ -114,26 +112,23 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { Rectangle cellRect = new Rectangle(0, 0, size.width, size.height); Hashtable h = new Hashtable(); int columnMargin = header.getColumnModel().getColumnMargin(); - Enumeration enumeration = header.getColumnModel().getColumns(); + Enumeration enumeration = header.getColumnModel().getColumns(); while (enumeration.hasMoreElements()) { cellRect.height = size.height; cellRect.y = 0; TableColumn aColumn = enumeration.nextElement(); - Enumeration cGroups = ((GroupableTableHeader) header) - .getColumnGroups(aColumn); + Enumeration cGroups = ((GroupableTableHeader) header).getColumnGroups(aColumn); if (cGroups != null) { int groupHeight = 0; while (cGroups.hasMoreElements()) { - ColumnGroup cGroup = cGroups.nextElement(); + ColumnGroup cGroup = cGroups.nextElement(); Rectangle groupRect = (Rectangle) h.get(cGroup); if (groupRect == null) { groupRect = new Rectangle(cellRect); Dimension d = cGroup.getSize(header.getTable()); - if (!System.getProperty("java.vm.version").startsWith( - "1.2")) { + if (!System.getProperty("java.vm.version").startsWith("1.2")) { int iColCount = getColCountUnderColGroup(cGroup, 0); - groupRect.width = d.width - iColCount - * columnMargin; + groupRect.width = d.width - iColCount * columnMargin; } else { groupRect.width = d.width; } @@ -151,7 +146,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } else { cellRect.width = aColumn.getWidth() + columnMargin; } - + if (cellRect.intersects(clipBounds)) { paintCell(g, cellRect, column); } @@ -159,7 +154,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { column++; } } - + private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) { TableColumn aColumn = header.getColumnModel().getColumn(columnIndex); TableCellRenderer renderer = aColumn.getHeaderRenderer(); @@ -167,12 +162,11 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { if (renderer == null) { renderer = new DefaultTableCellRenderer() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, boolean isSelected, boolean hasFocus, - int row, int column) { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { JTableHeader header = table.getTableHeader(); if (header != null) { setForeground(header.getForeground()); @@ -186,27 +180,26 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } }; } - + String headerValue = aColumn.getHeaderValue().toString(); - Component component = renderer.getTableCellRendererComponent(header - .getTable(), headerValue, false, false, -1, columnIndex); - + Component component = renderer.getTableCellRendererComponent(header.getTable(), headerValue, false, false, -1, + columnIndex); + rendererPane.add(component); - rendererPane.paintComponent(g, component, header, cellRect.x, - cellRect.y, cellRect.width, cellRect.height, true); + rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true); } - + private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) { TableCellRenderer renderer = cGroup.getHeaderRenderer(); // if (renderer == null) { renderer = new DefaultTableCellRenderer() { - private static final long serialVersionUID = 1L; - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, boolean isSelected, boolean hasFocus, - int row, int column) { + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { JTableHeader header = table.getTableHeader(); if (header != null) { setForeground(header.getForeground()); @@ -220,17 +213,16 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI { } }; } - + String headerValue = cGroup.getHeaderValue().toString(); - Component component = renderer.getTableCellRendererComponent(header - .getTable(), headerValue, false, false, -1, -1); - + Component component = renderer.getTableCellRendererComponent(header.getTable(), headerValue, false, false, -1, + -1); + rendererPane.add(component); - rendererPane.paintComponent(g, component, header, cellRect.x, - cellRect.y, cellRect.width, cellRect.height, true); + rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true); } - + public void setHeaderHeight(int iHeight) { m_height = iHeight; } -} \ No newline at end of file +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java b/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java index 5a45c38838..739f79af2e 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/model/RowHeaderTable.java @@ -33,125 +33,123 @@ import javax.swing.table.TableCellRenderer; /** * 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题 */ -public class RowHeaderTable extends JTable -{ - private static final long serialVersionUID = 1L; +public class RowHeaderTable extends JTable { - /** - * 为JTable添加RowHeader, - * @param refTable 需要添加rowHeader的JTable - * @param columnWideth rowHeader的宽度 - */ - public RowHeaderTable(JTable refTable,int columnWidth){ - this(null,refTable,columnWidth,1); - } - - public RowHeaderTable(ArrayList title,JTable refTable,int columnWidth) { - this(title,refTable,columnWidth,1); - } - - public RowHeaderTable(ArrayList title,JTable refTable,int columnWidth,int rowSpan) { - super(new DefaultTableModel(refTable.getRowCount()/rowSpan,1)); - this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽 - this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth); - this.setDefaultRenderer(Object.class,new RowHeaderRenderer(title,refTable,this,rowSpan));//设置渲染器 - this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0)); - } + private static final long serialVersionUID = 1L; + + /** + * 为JTable添加RowHeader, + * + * @param refTable 需要添加rowHeader的JTable + * @param columnWideth rowHeader的宽度 + */ + public RowHeaderTable(JTable refTable, int columnWidth){ + this(null, refTable, columnWidth, 1); + } + + public RowHeaderTable(ArrayList title, JTable refTable, int columnWidth){ + this(title, refTable, columnWidth, 1); + } + + public RowHeaderTable(ArrayList title, JTable refTable, int columnWidth, int rowSpan){ + super(new DefaultTableModel(refTable.getRowCount() / rowSpan, 1)); + this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 不可以调整列宽 + this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth); + this.setDefaultRenderer(Object.class, new RowHeaderRenderer(title, refTable, this, rowSpan));// 设置渲染器 + this.setPreferredScrollableViewportSize(new Dimension(columnWidth, 0)); + } } + /** * 用于显示RowHeader的JTable的渲染器,当选择某行时,该行颜色会发生变化 */ -final class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener -{ - private static final long serialVersionUID = 1L; - private JTable reftable;//需要添加rowHeader的JTable - private JTable tableShow;//用于显示rowHeader的JTable - private ArrayList headerList; - private int rowHeightNow; - private int rowSpan; - - public RowHeaderRenderer(JTable reftable,JTable tableShow) { - this(null,reftable,tableShow,0); - } - - public RowHeaderRenderer(ArrayList headerList, - JTable reftable,JTable tableShow,int rowSpan) - { - this.headerList = headerList; - this.reftable = reftable; - this.tableShow=tableShow; - //增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化 - ListSelectionModel listModel=reftable.getSelectionModel(); - listModel.addListSelectionListener(this); - rowHeightNow = reftable.getRowCount()*reftable.getRowHeight(); - this.rowSpan = rowSpan; - if (rowSpan > 1) { - rowHeightNow = rowSpan*reftable.getRowHeight(); - } +final class RowHeaderRenderer extends JLabel implements TableCellRenderer, ListSelectionListener { + + private static final long serialVersionUID = 1L; + private JTable reftable; // 需要添加rowHeader的JTable + private JTable tableShow; // 用于显示rowHeader的JTable + private ArrayList headerList; + private int rowHeightNow; + private int rowSpan; + + public RowHeaderRenderer(JTable reftable, JTable tableShow){ + this(null, reftable, tableShow, 0); } - public Component getTableCellRendererComponent(JTable table,Object obj, - boolean isSelected,boolean hasFocus,int row, int col) - { - int rowCountNow = reftable.getRowCount()/rowSpan; - ((DefaultTableModel)table.getModel()).setRowCount(rowCountNow); + + public RowHeaderRenderer(ArrayList headerList, JTable reftable, JTable tableShow, int rowSpan){ + this.headerList = headerList; + this.reftable = reftable; + this.tableShow = tableShow; + // 增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化 + ListSelectionModel listModel = reftable.getSelectionModel(); + listModel.addListSelectionListener(this); + rowHeightNow = reftable.getRowCount() * reftable.getRowHeight(); + this.rowSpan = rowSpan; + if (rowSpan > 1) { + rowHeightNow = rowSpan * reftable.getRowHeight(); + } + } + + public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, + int row, int col) { + int rowCountNow = reftable.getRowCount() / rowSpan; + ((DefaultTableModel) table.getModel()).setRowCount(rowCountNow); JTableHeader header = reftable.getTableHeader(); this.setOpaque(true); - setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型 - setHorizontalAlignment(CENTER);//让text居中显示 - setBackground(header.getBackground());//设置背景色为TableHeader的背景色 - if ( isSelect(row) ) //当选取单元格时,在row header上设置成选取颜色 + setBorder(UIManager.getBorder("TableHeader.cellBorder"));// 设置为TableHeader的边框类型 + setHorizontalAlignment(CENTER);// 让text居中显示 + setBackground(header.getBackground());// 设置背景色为TableHeader的背景色 + if (isSelect(row)) // 当选取单元格时,在row header上设置成选取颜色 { setForeground(Color.white); setBackground(Color.lightGray); + } else { + setForeground(header.getForeground()); } - else - { - setForeground(header.getForeground()); + setFont(header.getFont()); + if (row <= rowCountNow) { + showCol(row); } - setFont(header.getFont()); - if (row <= rowCountNow){ - showCol(row); - } return this; } - + private void showCol(int row) { - - String text = null; - if (headerList != null && row < headerList.size()) { - text = headerList.get(row); - } else { - text = String.valueOf(row+1); - } - if (rowSpan > 1) { - setText(text); - this.tableShow.setRowHeight(row, rowHeightNow); - } else { - setText(text); - } - + + String text = null; + if (headerList != null && row < headerList.size()) { + text = headerList.get(row); + } else { + text = String.valueOf(row + 1); + } + if (rowSpan > 1) { + setText(text); + this.tableShow.setRowHeight(row, rowHeightNow); + } else { + setText(text); + } + } - - public void valueChanged(ListSelectionEvent e){ - this.tableShow.repaint(); - } - private boolean isSelect(int row) - { + + public void valueChanged(ListSelectionEvent e) { + this.tableShow.repaint(); + } + + private boolean isSelect(int row) { int[] sel = reftable.getSelectedRows(); if (rowSpan <= 1) { - for ( int i=0,len = sel.length; i */ public final class TableDataProcessor { - - /** The Constant COLUMN_KEY_NAME. */ - private static final String COLUMN_KEY_NAME = "名称"; - - /** The Constant COLUMN_VALUE_NAME. */ - private static final String COLUMN_VALUE_NAME = "值"; - - /** - * Instantiates a new table data processor. - */ - private TableDataProcessor() { - - } - - /** - * 将行数据转化为列数据 - * 由于json中的数据是按照一条条的记录返回的,而在显示的时候需要按照“名称”、“值”两列显示,所以要做转化。 - * - * @param rowDatas 原始数据 - * @param keyword 关键字,可以为null - * @return 生成的列数据的对象 - */ - public static ColumnData row2col( - ArrayList> rowDatas, String keyword) { - ColumnData datas = new ColumnData(); - ArrayList> coldatas - = new ArrayList>(); - ArrayList colNames = new ArrayList(); - int rowCount = 0; - int colCount = 0; - for(LinkedHashMap row: rowDatas) { - if (keyword != null) { - String keyNow = row.remove(keyword).toString(); - colNames.add(keyNow); - } - rowCount ++; - - for(Map.Entry element : row.entrySet()) { - LinkedHashMap colData - = new LinkedHashMap(); - colData.put(COLUMN_KEY_NAME, element.getKey()); - colData.put(COLUMN_VALUE_NAME, element.getValue()); - coldatas.add(colData); - if (rowCount == 1) { - colCount++; - } - } - } - datas.setCount(colCount); - datas.setDatas(coldatas); - datas.setNames(colNames); - return datas; - } - - /** - * 将行数据转化为多个表格中的列数据 - * 和{@link #row2col(ArrayList>, String)}类似, - * 只不过这里是返回多个表格数据 - * - * @param rowDatas 原始数据 - * @param keyword the keyword - * @return 生成的列数据的对象 - */ - public static ColumnData mutilRow2col( - ArrayList> rowDatas, String keyword) { - ColumnData datas = new ColumnData(); - ArrayList>> tableDatas - = new ArrayList>>(); - - ArrayList colNames = new ArrayList(); - int rowCount = 0; - - for(LinkedHashMap row: rowDatas) { - if (keyword != null) { - String keyNow = row.remove(keyword).toString(); - colNames.add(keyNow); - } - rowCount ++; - - ArrayList> coldatas - = new ArrayList>(); - for(Map.Entry element : row.entrySet()) { - LinkedHashMap colData - = new LinkedHashMap(); - colData.put(COLUMN_KEY_NAME, element.getKey()); - colData.put(COLUMN_VALUE_NAME, element.getValue()); - coldatas.add(colData); - - } - tableDatas.add(coldatas); - } - datas.setCount(rowCount); - datas.setTableDatas(tableDatas); - datas.setNames(colNames); - return datas; - } - - /** - * 将行数据转化为列数据,这里只是调用了{@link #row2col(ArrayList>, String)}, - * 将第二个参数置为null。 - * - * @param rowDatas 原始数据 - * @return 生成的列数据的对象 - */ - public static ColumnData row2col( - ArrayList> rowDatas) { - return row2col(rowDatas,null); - } - - /** - * The Class ColumnData. - */ - public static class ColumnData { - - /** 关键字集合. */ - private ArrayList names; - - /** 单个表格数据. */ - private ArrayList> datas; - - /** 多个表格数据. */ - private ArrayList>> tableDatas; - - /** 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数. */ - private int count; - - /** - * Instantiates a new column data. - */ - public ColumnData() { - super(); - } - - /** - * 获取关键字集合 - * - * @return the names - */ - public ArrayList getNames() { - return names; - } - - /** - * 设置关键字集合 - * - * @param names the new names - */ - public void setNames(ArrayList names) { - this.names = names; - } - - /** - * 获取单个表格数据 - * - * @return the datas - */ - public ArrayList> getDatas() { - return datas; - } - - /** - * 设置单个表格数据 - * - * @param datas the datas - */ - public void setDatas(ArrayList> datas) { - this.datas = datas; - } - - /** - * 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数 - * - * @return the count - */ - public int getCount() { - return count; - } - - /** - * Sets the count. - * - * @param count the new count - */ - public void setCount(int count) { - this.count = count; - } - /** - * 返回多个表格数据 - * - * @return the table datas - */ - public ArrayList>> getTableDatas() { - return tableDatas; - } + /** 名称列的列名. */ + private static final String COLUMN_KEY_NAME = "名称"; - /** - * 设置多个表格数据 - * - * @param tableDatas the table datas - */ - public void setTableDatas( - ArrayList>> tableDatas) { - this.tableDatas = tableDatas; - } - - } + /** 内容列的列名. */ + private static final String COLUMN_VALUE_NAME = "值"; + + /** + * TableDataProcessor的构造函数 + */ + private TableDataProcessor(){ + + } + + /** + * 将行数据转化为列数据 由于json中的数据是按照一条条的记录返回的, + * 而在显示的时候需要按照“名称”、“值”两列显示,所以要做转化。 + * + * @param rowDatas 原始数据 + * @param keyword 关键字,可以为null + * @return 生成的列数据的对象 + */ + public static ColumnData row2col(ArrayList> rowDatas, String keyword) { + ColumnData datas = new ColumnData(); + ArrayList> coldatas = new ArrayList>(); + ArrayList colNames = new ArrayList(); + int rowCount = 0; + int colCount = 0; + for (LinkedHashMap row : rowDatas) { + if (keyword != null) { + String keyNow = row.remove(keyword).toString(); + colNames.add(keyNow); + } + rowCount++; + + for (Map.Entry element : row.entrySet()) { + LinkedHashMap colData = new LinkedHashMap(); + colData.put(COLUMN_KEY_NAME, element.getKey()); + colData.put(COLUMN_VALUE_NAME, element.getValue()); + coldatas.add(colData); + if (rowCount == 1) { + colCount++; + } + } + } + datas.setCount(colCount); + datas.setDatas(coldatas); + datas.setNames(colNames); + return datas; + } + + /** + * 将行数据转化为多个表格中的列数据 和{@link #row2col(ArrayList>, String)}类似, + * 只不过这里是返回多个表格数据 + * + * @param rowDatas 原始数据 + * @param keyword the keyword + * @return 生成的列数据的对象 + */ + public static ColumnData mutilRow2col(ArrayList> rowDatas, String keyword) { + ColumnData datas = new ColumnData(); + ArrayList>> tableDatas = new ArrayList>>(); + + ArrayList colNames = new ArrayList(); + int rowCount = 0; + + for (LinkedHashMap row : rowDatas) { + if (keyword != null) { + String keyNow = row.remove(keyword).toString(); + colNames.add(keyNow); + } + rowCount++; + + ArrayList> coldatas = new ArrayList>(); + for (Map.Entry element : row.entrySet()) { + LinkedHashMap colData = new LinkedHashMap(); + colData.put(COLUMN_KEY_NAME, element.getKey()); + colData.put(COLUMN_VALUE_NAME, element.getValue()); + coldatas.add(colData); + + } + tableDatas.add(coldatas); + } + datas.setCount(rowCount); + datas.setTableDatas(tableDatas); + datas.setNames(colNames); + return datas; + } + + /** + * 将行数据转化为列数据,这里只是调用了{@link #row2col(ArrayList>, String)}, + * 将第二个参数置为null。 + * + * @param rowDatas 原始数据 + * @return 生成的列数据的对象 + */ + public static ColumnData row2col(ArrayList> rowDatas) { + return row2col(rowDatas, null); + } + + /** + * The Class ColumnData. + */ + public static class ColumnData { + + /** 关键字集合. */ + private ArrayList names; + + /** 单个表格数据. */ + private ArrayList> datas; + + /** 多个表格数据. */ + private ArrayList>> tableDatas; + + /** 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数. */ + private int count; + + /** + * ColumnData构造函数 + */ + public ColumnData(){ + super(); + } + + /** + * 获取关键字集合 + * + * @return the names + */ + public ArrayList getNames() { + return names; + } + + /** + * 设置关键字集合 + * + * @param names the new names + */ + public void setNames(ArrayList names) { + this.names = names; + } + + /** + * 获取单个表格数据 + * + * @return the datas + */ + public ArrayList> getDatas() { + return datas; + } + + /** + * 设置单个表格数据 + * + * @param datas the datas + */ + public void setDatas(ArrayList> datas) { + this.datas = datas; + } + + /** + * 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数 + * + * @return the count + */ + public int getCount() { + return count; + } + + /** + * Sets the count. + * + * @param count the new count + */ + public void setCount(int count) { + this.count = count; + } + + /** + * 返回多个表格数据 + * + * @return the table datas + */ + public ArrayList>> getTableDatas() { + return tableDatas; + } + + /** + * 设置多个表格数据 + * + * @param tableDatas the table datas + */ + public void setTableDatas(ArrayList>> tableDatas) { + this.tableDatas = tableDatas; + } + + } } From a85d8faf4db0a1f92f10f9c8f642afcdb78eb627 Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sat, 15 Sep 2012 22:59:34 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=98=BE?= =?UTF-8?q?=E7=A4=BAsql=E8=AF=AD=E5=8F=A5=E8=AF=A6=E7=BB=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../druid/support/jconsole/DruidPanel.java | 98 ++---- .../druid/support/jconsole/DruidSQLPanel.java | 2 +- .../support/jconsole/DruidSqlDetailFrame.java | 313 ++++++++++++++++++ .../jconsole/util/TableDataProcessor.java | 69 +++- 4 files changed, 406 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java index a34ad8561b..945fd3eae5 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidPanel.java @@ -20,11 +20,8 @@ import java.awt.event.ComponentListener; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; import javax.management.MBeanServerConnection; -import javax.management.ObjectName; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; @@ -32,9 +29,8 @@ import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.TitledBorder; -import com.alibaba.druid.stat.DruidStatService; import com.alibaba.druid.support.jconsole.model.DruidTableModel; -import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.sun.tools.jconsole.JConsoleContext; @@ -46,34 +42,31 @@ import com.sun.tools.jconsole.JConsoleContext; */ public abstract class DruidPanel extends JPanel { - private static final long serialVersionUID = 1L; - /** 成功的返回码 */ - protected static final int RESP_SUCCESS_RESULT = 1; - /** 返回码在json中的键名 */ - protected static final String RESP_JSON_RESULT_KEY = "ResultCode"; - /** 内容在json中的键名 */ - protected static final String RESP_JSON_CONTENT_KEY = "Content"; + private static final long serialVersionUID = 1L; + /** 默认面板刷新的间隔时间 */ - protected static final long DEFAULT_ACTIVE_TIME = 5 * 60 * 1000; + protected static final long DEFAULT_ACTIVE_TIME = 5 * 60 * 1000; /** 版权信息字符串 */ - private static final String COPYRIGHT_STRING = "powered by yunnysunny"; + private static final String COPYRIGHT_STRING = "powered by yunnysunny"; /** 滚动条面板 */ - protected JScrollPane scrollPane; + protected JScrollPane scrollPane; /** 表格模板 */ - protected DruidTableModel tableModel; + protected DruidTableModel tableModel; /** 表格 */ - protected JTable table; + protected JTable table; /** 版权面板 */ - protected JPanel copyrightPanel; + protected JPanel copyrightPanel; /** json请求的地址 */ - protected String url; + protected String url; /** 界面刷新的间隔时间,单位为毫秒. */ - protected long activeTime; + protected long activeTime; /** 上次刷新的时间 */ - protected long lastRefreshTime; - private final static Log LOG = LogFactory.getLog(DruidPanel.class); + protected long lastRefreshTime; + /** 与界面管理的MBeanServerConnection对象 */ + protected MBeanServerConnection conn; + private final static Log LOG = LogFactory.getLog(DruidPanel.class); /** * 根据传入的刷新时间间隔来初始化. @@ -91,53 +84,7 @@ public abstract class DruidPanel extends JPanel { activeTime = DEFAULT_ACTIVE_TIME; } - /** - * 解析调用service后得到JSON数据 - * - * @param respData 获取到的json对象 - * @return 返回解析后的数据 - */ - @SuppressWarnings("unchecked") - protected ArrayList> parseData(Object respData) { - ArrayList> data = null; - if (respData instanceof Map) { - LinkedHashMap map = (LinkedHashMap) respData; - int rv = (Integer) map.get(RESP_JSON_RESULT_KEY); - - if (rv == RESP_SUCCESS_RESULT) { - Object content = map.get(RESP_JSON_CONTENT_KEY); - if (content instanceof List) { - data = (ArrayList>) content; - } else if (content instanceof Map) { - LinkedHashMap contentEle = (LinkedHashMap) content; - data = new ArrayList>(); - data.add(contentEle); - } - } - } - return data; - } - - /** - * 调用service,返回数据 - * - * @param url service的地址 - * @param conn MBeanServerConnection对象 - * @return 调用service后返回的数据 - * @throws Exception - */ - protected Object getData(String url, MBeanServerConnection conn) throws Exception { - Object o = null; - ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); - - String result = (String) conn.invoke(name, "service", new String[] { url }, - new String[] { String.class.getName() }); - o = JSONUtils.parse(result); - if (LOG.isDebugEnabled()) { - LOG.debug(o.toString()); - } - return o; - } + /** * 调用完service之后,各个子类对于解析后的数据的具体处理 @@ -154,7 +101,7 @@ public abstract class DruidPanel extends JPanel { * @param conn MBeanServerConnection对象 * @throws Exception */ - protected void addOrRefreshTable(String url, MBeanServerConnection conn) throws Exception { + protected void addOrRefreshTable(String url) throws Exception { if (url != null) { boolean needRefresh = false; long timeNow = new Date().getTime(); @@ -211,7 +158,8 @@ public abstract class DruidPanel extends JPanel { } if (needRefresh) { LOG.debug("refresh" + timeNow); - ArrayList> data = parseData(getData(url, conn)); + ArrayList> data = TableDataProcessor.parseData(TableDataProcessor.getData(url, + conn)); if (data != null) { tableDataProcess(data); } @@ -230,9 +178,13 @@ public abstract class DruidPanel extends JPanel { } protected void doInBackground(MBeanServerConnection conn) { - + if (conn == null) { + LOG.warn("MBeanServerConnection is null"); + return; + } try { - addOrRefreshTable(url, conn); + this.conn = conn; + addOrRefreshTable(url); } catch (Exception e) { LOG.warn("", e); } diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java index 7bb07181ba..6c65ed27c1 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidSQLPanel.java @@ -299,7 +299,7 @@ public class DruidSQLPanel extends DruidPanel { if (e.getClickCount() == 2) {// 点击几次,这里是双击事件 int row = table.getSelectedRow(); String id = ids.get(row); - System.out.println(id); + new DruidSqlDetailFrame(id,conn); } } }); diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java new file mode 100644 index 0000000000..0b236749be --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java @@ -0,0 +1,313 @@ +package com.alibaba.druid.support.jconsole; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.GridLayout; +import java.awt.Toolkit; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +import javax.management.MBeanServerConnection; +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.border.TitledBorder; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableColumn; + +import com.alibaba.druid.support.jconsole.model.DruidTableCellRenderer; +import com.alibaba.druid.support.jconsole.model.DruidTableModel; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor; +import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + +/** + * sql语句的详细信息 + * + * 调用服务地址:/sql-{id}.json + * 返回信息: + *
+ * {
+    "ResultCode": 1,
+    "Content": {
+            "ExecuteCount": 15,
+            "ReadStringLength": 0,
+            "LastSlowParameters": null,
+            "BlobOpenCount": 0,
+            "InputStreamOpenCount": 0,
+            "DbType": "mysql",
+            "DataSource": null,
+            "RunningCount": 0,
+            "parsedRelationships": "[]",
+            "ConcurrentMax": 1,
+            "LastErrorClass": null,
+            "MaxTimespan": 125,
+            "InTransactionCount": 0,
+            "ID": 3,
+            "parsedFields": "[]",
+            "EffectedRowCount": 0,
+            "BatchSizeTotal": 0,
+            "URL": null,
+            "ExecuteAndResultSetHoldTime": 0,
+            "LastErrorMessage": null,
+            "FetchRowCountHistogram": [
+                0,
+                0,
+                0,
+                0,
+                0,
+                0
+            ],
+            "FetchRowCountMax": 0,
+            "Histogram": [
+                0,
+                0,
+                13,
+                2,
+                0,
+                0,
+                0,
+                0
+            ],
+            "parsedOrderbycolumns": "[]",
+            "ErrorCount": 0,
+            "SQL": "DROP TABLE t_big",
+            "ClobOpenCount": 0,
+            "LastTime": "2012-09-14 21:35:10",
+            "File": null,
+            "LastErrorStackTrace": null,
+            "LastError": null,
+            "EffectedRowCountHistogram": [
+                15,
+                0,
+                0,
+                0,
+                0,
+                0
+            ],
+            "TotalTime": 742,
+            "formattedSql": "DROP TABLE t_big",
+            "Name": null,
+            "MaxTimespanOccurTime": "2012/09/14 09:35:00:758",
+            "parsedTable": "{t_big=Drop}",
+            "BatchSizeMax": 0,
+            "ReadBytesLength": 0,
+            "EffectedRowCountMax": 0,
+            "FetchRowCount": 0,
+            "parsedConditions": "[]",
+            "ResultSetHoldTime": 0,
+            "ReaderOpenCount": 0,
+            "ExecuteAndResultHoldTimeHistogram": [
+                0,
+                0,
+                13,
+                2,
+                0,
+                0,
+                0,
+                0
+            ],
+            "LastErrorTime": null
+        }
+    }
+ * 
+ * */ +public class DruidSqlDetailFrame extends JFrame { + + private static final long serialVersionUID = 1L; + private static final String BASE_URL = "/sql"; + private String id; + private MBeanServerConnection conn; + private static final ArrayList PARESE_TITLE_LIST = new ArrayList(){ + + private static final long serialVersionUID = 1L; + + { + add("parsedTable"); + add("parsedFields"); + add("parsedConditions"); + add("parsedRelationships"); + add("parsedOrderbycolumns"); + + } + }; + private static final ArrayList LAST_SLOW_TITLE_LIST= new ArrayList(){ + + private static final long serialVersionUID = 1L; + + { + add("MaxTimespan"); + add("MaxTimespanOccurTime"); + add("LastSlowParameters"); + } + }; + private static final ArrayList LAST_ERROR_TITLE_LIST= new ArrayList(){ + + private static final long serialVersionUID = 1L; + + { + add("LastErrorMessage"); + add("LastErrorClass"); + add("LastErrorTime"); + add("LastErrorStackTrace"); + } + }; + private static final ArrayList OTHER_ERROR_TITLE_LIST= new ArrayList(){ + + private static final long serialVersionUID = 1L; + + { + add("BatchSizeMax"); + add("BatchSizeTotal"); + add("BlobOpenCount"); + add("ClobOpenCount"); + add("ReaderOpenCount"); + add("InputStreamOpenCount"); + add("ReadStringLength"); + add("ReadBytesLength"); + } + }; + private ArrayList> parseData; + private ArrayList> lastSlowData; + private ArrayList> lastErrorData; + private ArrayList> otherData; + private int maxListLen; + private String formatSql; + private String sql; + + private static final int WIDTH = 620; + private static final int HEIGHT = 520; + private final static Log LOG = LogFactory.getLog(DruidSqlDetailFrame.class); + + public DruidSqlDetailFrame(String id, MBeanServerConnection conn) { + this.id = id; + this.conn = conn; + getMaxListLen(); + init(); + start(); + } + + private void getMaxListLen() { + maxListLen = PARESE_TITLE_LIST.size(); + int slowLen = LAST_SLOW_TITLE_LIST.size(); + int errLen = LAST_ERROR_TITLE_LIST.size(); + int otherLen = OTHER_ERROR_TITLE_LIST.size(); + if (maxListLen < slowLen) { + maxListLen = slowLen; + } + if (maxListLen < errLen) { + maxListLen = errLen; + } + if (maxListLen < otherLen) { + maxListLen = otherLen; + } + } + + private void init() { + String url = BASE_URL + "-" + id + ".json"; + + try { + ArrayList> data = TableDataProcessor.parseData(TableDataProcessor.getData(url,conn)); + if (data != null) { + LinkedHashMap contentEle = data.get(0); + formatSql = (String)contentEle.remove("formattedSql"); + int parseLen = PARESE_TITLE_LIST.size(); + int slowLen = LAST_SLOW_TITLE_LIST.size(); + int errLen = LAST_ERROR_TITLE_LIST.size(); + int otherLen = OTHER_ERROR_TITLE_LIST.size(); + LinkedHashMap parseDataEle = new LinkedHashMap(); + LinkedHashMap slowDataEle = new LinkedHashMap(); + LinkedHashMap errDataEle = new LinkedHashMap(); + LinkedHashMap otherDataEle = new LinkedHashMap(); + parseData = new ArrayList>(1); + lastSlowData = new ArrayList>(1); + lastErrorData = new ArrayList>(1); + otherData = new ArrayList>(1); + for (Iterator> it = contentEle.entrySet().iterator(); it.hasNext();) { + Entry entry = it.next(); + String key = entry.getKey(); + Object value = entry.getValue(); + for(int i=0;i> data) { + final JPanel content1 = new JPanel(); + content1.setLayout(new BorderLayout()); + content1.setBorder((TitledBorder)BorderFactory.createTitledBorder(title)); + contentPanel.add(content1); + + ColumnData colData = TableDataProcessor.row2col(data); + JTable table = new JTable(); + DruidTableModel tableModel = new DruidTableModel(colData.getDatas()); + table.setModel(tableModel); + + TableColumn col = table.getColumnModel().getColumn(0); + col.setCellRenderer(new DruidTableCellRenderer()); + + final JTableHeader header1 = table.getTableHeader(); + content1.add(header1,BorderLayout.NORTH); + content1.add(table); + } + + private void addComponentsToPane(Container pane) { + JScrollPane scrollPane = new JScrollPane(); + JPanel contentPanel = new JPanel(); + contentPanel.setLayout(new GridLayout(0,1)); + + final JTextArea sqlField = new JTextArea(formatSql,15,20); + final JScrollPane content1 = new JScrollPane (sqlField); + + content1.setBorder((TitledBorder)BorderFactory.createTitledBorder("SQL语句")); + contentPanel.add(content1); + + addTable(contentPanel,"解析信息",parseData); + addTable(contentPanel,"上次慢查询信息",lastSlowData); + addTable(contentPanel,"上次错误查询信息",lastErrorData); + addTable(contentPanel,"其他信息",otherData); + + scrollPane.setViewportView(contentPanel); + pane.add(scrollPane,BorderLayout.CENTER); + } + + private void start() { + addComponentsToPane(getContentPane()); + pack(); + setSize(WIDTH, HEIGHT); + double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); + double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight(); + + setLocation( (int) (width - getWidth()) / 2, + (int) (height - getHeight()) / 2); + setVisible(true); + } + +} diff --git a/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java b/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java index 57e22c9c5c..0c1a2641de 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/util/TableDataProcessor.java @@ -17,8 +17,17 @@ package com.alibaba.druid.support.jconsole.util; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; + +import com.alibaba.druid.stat.DruidStatService; +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + /** * 表格数据处理类 * @@ -27,10 +36,18 @@ import java.util.Map; public final class TableDataProcessor { /** 名称列的列名. */ - private static final String COLUMN_KEY_NAME = "名称"; + private static final String COLUMN_KEY_NAME = "名称"; /** 内容列的列名. */ - private static final String COLUMN_VALUE_NAME = "值"; + private static final String COLUMN_VALUE_NAME = "值"; + + /** 返回码在json中的键名 */ + private static final String RESP_JSON_RESULT_KEY = "ResultCode"; + /** 内容在json中的键名 */ + private static final String RESP_JSON_CONTENT_KEY = "Content"; + /** 成功的返回码 */ + protected static final int RESP_SUCCESS_RESULT = 1; + private final static Log LOG = LogFactory.getLog(TableDataProcessor.class); /** * TableDataProcessor的构造函数 @@ -124,6 +141,54 @@ public final class TableDataProcessor { public static ColumnData row2col(ArrayList> rowDatas) { return row2col(rowDatas, null); } + + /** + * 解析调用service后得到JSON数据 + * + * @param respData 获取到的json对象 + * @return 返回解析后的数据 + */ + @SuppressWarnings("unchecked") + public static ArrayList> parseData(Object respData) { + ArrayList> data = null; + if (respData instanceof Map) { + LinkedHashMap map = (LinkedHashMap) respData; + int rv = (Integer) map.get(RESP_JSON_RESULT_KEY); + + if (rv == RESP_SUCCESS_RESULT) { + Object content = map.get(RESP_JSON_CONTENT_KEY); + if (content instanceof List) { + data = (ArrayList>) content; + } else if (content instanceof Map) { + LinkedHashMap contentEle = (LinkedHashMap) content; + data = new ArrayList>(); + data.add(contentEle); + } + } + } + return data; + } + + /** + * 调用service,返回数据 + * + * @param url service的地址 + * @param conn MBeanServerConnection对象 + * @return 调用service后返回的数据 + * @throws Exception + */ + public static Object getData(String url, MBeanServerConnection conn) throws Exception { + Object o = null; + ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); + + String result = (String) conn.invoke(name, "service", new String[] { url }, + new String[] { String.class.getName() }); + o = JSONUtils.parse(result); + if (LOG.isDebugEnabled()) { + LOG.debug(o.toString()); + } + return o; + } /** * The Class ColumnData. From 3993377c611f4ecdc31186d6a8cc601ee5456550 Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sun, 16 Sep 2012 10:42:50 +0800 Subject: [PATCH 07/13] =?UTF-8?q?DruidSqlDetailFrame=E7=B1=BB=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E6=A0=87=E9=A2=98=E6=A0=8F=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E4=BA=86DruidSqlDetailFrame=E7=B1=BB?= =?UTF-8?q?=E7=9A=84javadoc=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/jconsole/DruidSqlDetailFrame.java | 261 +++++++++++------- 1 file changed, 167 insertions(+), 94 deletions(-) diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java index 0b236749be..37f4ad4f82 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidSqlDetailFrame.java @@ -27,6 +27,7 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; +// TODO: Auto-generated Javadoc /** * sql语句的详细信息 * @@ -117,82 +118,134 @@ import com.alibaba.druid.support.logging.LogFactory; } } * + * @author yunnysunny * */ public class DruidSqlDetailFrame extends JFrame { - private static final long serialVersionUID = 1L; - private static final String BASE_URL = "/sql"; - private String id; - private MBeanServerConnection conn; - private static final ArrayList PARESE_TITLE_LIST = new ArrayList(){ + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; - private static final long serialVersionUID = 1L; + /** service的地址的根路径. */ + private static final String BASE_URL = "/sql"; - { - add("parsedTable"); - add("parsedFields"); - add("parsedConditions"); - add("parsedRelationships"); - add("parsedOrderbycolumns"); + /** json中格式化sql的键名. */ + private static final String KEY_FORMAT_SQL = "formattedSql"; - } - }; - private static final ArrayList LAST_SLOW_TITLE_LIST= new ArrayList(){ + /** json中sql的键名. */ + private static final String KEY_SQL = "SQL"; - private static final long serialVersionUID = 1L; + /** sql语句的索引. */ + private String id; - { - add("MaxTimespan"); - add("MaxTimespanOccurTime"); - add("LastSlowParameters"); - } - }; - private static final ArrayList LAST_ERROR_TITLE_LIST= new ArrayList(){ + /** MBeanServerConnection对象. */ + private MBeanServerConnection conn; - private static final long serialVersionUID = 1L; + /** 解析信息内容表格的标题列. */ + private static final ArrayList PARESE_TITLE_LIST = new ArrayList() { - { - add("LastErrorMessage"); - add("LastErrorClass"); - add("LastErrorTime"); - add("LastErrorStackTrace"); - } - }; - private static final ArrayList OTHER_ERROR_TITLE_LIST= new ArrayList(){ + private static final long serialVersionUID = 1L; - private static final long serialVersionUID = 1L; + { + add("parsedTable"); + add("parsedFields"); + add("parsedConditions"); + add("parsedRelationships"); + add("parsedOrderbycolumns"); - { - add("BatchSizeMax"); - add("BatchSizeTotal"); - add("BlobOpenCount"); - add("ClobOpenCount"); - add("ReaderOpenCount"); - add("InputStreamOpenCount"); - add("ReadStringLength"); - add("ReadBytesLength"); - } - }; + } + }; + + /** 慢查询信息表格的标题列. */ + private static final ArrayList LAST_SLOW_TITLE_LIST = new ArrayList() { + + private static final long serialVersionUID = 1L; + + { + add("MaxTimespan"); + add("MaxTimespanOccurTime"); + add("LastSlowParameters"); + } + }; + + /** 错误信息表格的标题列. */ + private static final ArrayList LAST_ERROR_TITLE_LIST = new ArrayList() { + + private static final long serialVersionUID = 1L; + + { + add("LastErrorMessage"); + add("LastErrorClass"); + add("LastErrorTime"); + add("LastErrorStackTrace"); + } + }; + + /** 其他信息表格的标题列. */ + private static final ArrayList OTHER_ERROR_TITLE_LIST = new ArrayList() { + + private static final long serialVersionUID = 1L; + + { + add("BatchSizeMax"); + add("BatchSizeTotal"); + add("BlobOpenCount"); + add("ClobOpenCount"); + add("ReaderOpenCount"); + add("InputStreamOpenCount"); + add("ReadStringLength"); + add("ReadBytesLength"); + } + }; + + /** 解析信息数据. */ private ArrayList> parseData; + + /** 慢查询信息数据. */ private ArrayList> lastSlowData; + + /** 错误信息数据. */ private ArrayList> lastErrorData; + + /** 其他信息数据. */ private ArrayList> otherData; - private int maxListLen; - private String formatSql; - private String sql; - - private static final int WIDTH = 620; - private static final int HEIGHT = 520; - private final static Log LOG = LogFactory.getLog(DruidSqlDetailFrame.class); - - public DruidSqlDetailFrame(String id, MBeanServerConnection conn) { + + /** 各个数据表格中最大的数据列长度. */ + private int maxListLen; + + /** 格式化好的sql语句内容. */ + private String formatSql; + + /** 未格式化的sql语句内容. */ + private String sql; + + /** 窗体的宽度. */ + private static final int WIDTH = 800; + + /** 窗体的高度. */ + private static final int HEIGHT = 600; + + /** The Constant LOG. */ + private final static Log LOG = LogFactory.getLog(DruidSqlDetailFrame.class); + + /** + * Instantiates a new druid sql detail frame. + * + * @param id sql语句索引 + * @param conn MBeanServerConnection对象 + */ + public DruidSqlDetailFrame(String id, MBeanServerConnection conn){ this.id = id; this.conn = conn; getMaxListLen(); init(); start(); } - + + /** + * 获取各个数据表格中最大的数据列长度 + * + * @return the max list len + */ private void getMaxListLen() { maxListLen = PARESE_TITLE_LIST.size(); int slowLen = LAST_SLOW_TITLE_LIST.size(); @@ -208,15 +261,20 @@ public class DruidSqlDetailFrame extends JFrame { maxListLen = otherLen; } } - + + /** + * 初始化数据,得到四个表格的数据 + */ private void init() { String url = BASE_URL + "-" + id + ".json"; - + try { - ArrayList> data = TableDataProcessor.parseData(TableDataProcessor.getData(url,conn)); + ArrayList> data = TableDataProcessor.parseData(TableDataProcessor.getData(url, + conn)); if (data != null) { LinkedHashMap contentEle = data.get(0); - formatSql = (String)contentEle.remove("formattedSql"); + formatSql = (String) contentEle.remove(KEY_FORMAT_SQL); + sql = (String) contentEle.remove(KEY_SQL); int parseLen = PARESE_TITLE_LIST.size(); int slowLen = LAST_SLOW_TITLE_LIST.size(); int errLen = LAST_ERROR_TITLE_LIST.size(); @@ -233,11 +291,11 @@ public class DruidSqlDetailFrame extends JFrame { Entry entry = it.next(); String key = entry.getKey(); Object value = entry.getValue(); - for(int i=0;i> data) { + + /** + * 将表格添加到contentPanel对象内部。 + * + * @param contentPanel JPanel对象 + * @param 当前表格的标题 + * @param data 当前表格的数据 + */ + private void addTable(JPanel contentPanel, String title, ArrayList> data) { final JPanel content1 = new JPanel(); - content1.setLayout(new BorderLayout()); - content1.setBorder((TitledBorder)BorderFactory.createTitledBorder(title)); + content1.setLayout(new BorderLayout()); + content1.setBorder((TitledBorder) BorderFactory.createTitledBorder(title)); contentPanel.add(content1); - + ColumnData colData = TableDataProcessor.row2col(data); JTable table = new JTable(); DruidTableModel tableModel = new DruidTableModel(colData.getDatas()); table.setModel(tableModel); - + TableColumn col = table.getColumnModel().getColumn(0); col.setCellRenderer(new DruidTableCellRenderer()); - - final JTableHeader header1 = table.getTableHeader(); - content1.add(header1,BorderLayout.NORTH); - content1.add(table); + + final JTableHeader header1 = table.getTableHeader(); + content1.add(header1, BorderLayout.NORTH); + content1.add(table); } - + + /** + * 将各个界面添加到JFrame中 + * + * @param pane JFrame内部的Container对象 + */ private void addComponentsToPane(Container pane) { JScrollPane scrollPane = new JScrollPane(); JPanel contentPanel = new JPanel(); - contentPanel.setLayout(new GridLayout(0,1)); - - final JTextArea sqlField = new JTextArea(formatSql,15,20); - final JScrollPane content1 = new JScrollPane (sqlField); - - content1.setBorder((TitledBorder)BorderFactory.createTitledBorder("SQL语句")); - contentPanel.add(content1); - - addTable(contentPanel,"解析信息",parseData); - addTable(contentPanel,"上次慢查询信息",lastSlowData); - addTable(contentPanel,"上次错误查询信息",lastErrorData); - addTable(contentPanel,"其他信息",otherData); - + contentPanel.setLayout(new GridLayout(0, 1)); + + final JTextArea sqlField = new JTextArea(formatSql, 8, 20); + final JScrollPane content1 = new JScrollPane(sqlField); + + content1.setBorder((TitledBorder) BorderFactory.createTitledBorder("SQL语句")); + contentPanel.add(content1); + + addTable(contentPanel, "解析信息", parseData); + addTable(contentPanel, "上次慢查询信息", lastSlowData); + addTable(contentPanel, "上次错误查询信息", lastErrorData); + addTable(contentPanel, "其他信息", otherData); + scrollPane.setViewportView(contentPanel); - pane.add(scrollPane,BorderLayout.CENTER); + pane.add(scrollPane, BorderLayout.CENTER); } - + + /** + * 显示JFrame + */ private void start() { addComponentsToPane(getContentPane()); + setTitle("SQL:[" + sql + "]详情"); pack(); setSize(WIDTH, HEIGHT); - double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); - double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight(); - - setLocation( (int) (width - getWidth()) / 2, - (int) (height - getHeight()) / 2); + double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); + double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight(); + + setLocation((int) (width - getWidth()) / 2, (int) (height - getHeight()) / 2); setVisible(true); } From a79c70325a803a28845ceb23346cc72212e9e82a Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sun, 16 Sep 2012 21:51:21 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E5=B0=86DruidPooledPreparedStatement?= =?UTF-8?q?=E7=B1=BB=E7=9A=84sqlite=20bug=E6=94=B9=E5=8A=A8=E5=9B=9E?= =?UTF-8?q?=E6=BB=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pool/DruidPooledPreparedStatement.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index 9977fb9130..a3443bdec0 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -39,8 +39,6 @@ import java.util.Calendar; import com.alibaba.druid.pool.PreparedStatementPool.MethodType; import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.OracleUtils; /** @@ -63,8 +61,6 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement private int currentFetchDirection; private int currentFetchSize; - private final static Log LOG = LogFactory.getLog(DruidPooledPreparedStatement.class); - public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ super(conn, holder.getStatement()); this.stmt = holder.getStatement(); @@ -75,11 +71,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement defaultMaxFieldSize = stmt.getMaxFieldSize(); defaultMaxRows = stmt.getMaxRows(); defaultQueryTimeout = stmt.getQueryTimeout(); - try { - defaultFetchDirection = stmt.getFetchDirection(); - } catch (Exception e) { - LOG.warn(e.getMessage(), e); - } + defaultFetchDirection = stmt.getFetchDirection(); defaultFetchSize = stmt.getFetchSize(); currentMaxFieldSize = defaultMaxFieldSize; currentMaxRows = defaultMaxRows; @@ -188,7 +180,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement conn.beforeExecute(); try { ResultSet rs = stmt.executeQuery(); - + if (rs == null) { return null; } @@ -469,7 +461,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement if (holder.getHitCount() == 0) { return; } - + int fetchRowPeak = holder.getFetchRowPeak(); if (fetchRowPeak < 0) { @@ -1012,7 +1004,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement } } - + @SuppressWarnings("unchecked") public T unwrap(Class iface) throws SQLException { if (iface == PreparedStatement.class) { @@ -1021,11 +1013,11 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement } return (T) stmt; } - + if (iface == PreparedStatementHolder.class) { return (T) this.holder; } - + return super.unwrap(iface); } } From 741b18e72f40b08233e1499b553dcae57e470202 Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Tue, 18 Sep 2012 21:28:16 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E6=8D=AE=E6=BA=90=E6=97=B6=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E4=BF=A1=E6=81=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alibaba/druid/support/jconsole/DruidDataSourcePanel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java index c630c9dd87..2d66fd4e3f 100644 --- a/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java +++ b/src/main/java/com/alibaba/druid/support/jconsole/DruidDataSourcePanel.java @@ -22,6 +22,7 @@ import java.util.LinkedHashMap; import javax.swing.BorderFactory; import javax.swing.JPanel; +import javax.swing.JTable; import javax.swing.border.TitledBorder; import com.alibaba.druid.support.jconsole.model.DruidTableCellRenderer; @@ -78,7 +79,7 @@ public class DruidDataSourcePanel extends DruidPanel { ArrayList ids = columnData.getNames(); for (ArrayList> listNow : data) { - + JTable table = new JTable(); tableModel = new DruidTableModel(listNow); table.setModel(tableModel); From 3443c0304b135b0f66ab94b873a691be11fa25f6 Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sat, 22 Sep 2012 10:11:41 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E5=B0=86=E7=B1=BBDruidPooledPreparedStat?= =?UTF-8?q?ement=E7=9A=84=E6=8D=A2=E8=A1=8C=E6=96=B9=E5=BC=8F=E6=94=B9?= =?UTF-8?q?=E4=B8=BAlinux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 5a74b325ef28749a772c95ff67ed93fbd2785e0f Mon Sep 17 00:00:00 2001 From: yunnysunny Date: Sat, 22 Sep 2012 10:45:28 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E5=9B=9E=E6=BB=9ADruidPooledPreparedStat?= =?UTF-8?q?ement=E5=88=B0=E5=8E=86=E5=8F=B2=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pool/DruidPooledPreparedStatement.java | 2046 ++++++++--------- 1 file changed, 1023 insertions(+), 1023 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index a3443bdec0..4f462272f1 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -1,1023 +1,1023 @@ -/* - * 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.pool; - -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.sql.Array; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Date; -import java.sql.NClob; -import java.sql.ParameterMetaData; -import java.sql.PreparedStatement; -import java.sql.Ref; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.RowId; -import java.sql.SQLException; -import java.sql.SQLXML; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.Arrays; -import java.util.Calendar; - -import com.alibaba.druid.pool.PreparedStatementPool.MethodType; -import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; -import com.alibaba.druid.util.OracleUtils; - -/** - * @author wenshao - */ -public class DruidPooledPreparedStatement extends DruidPooledStatement implements PreparedStatement { - - private final PreparedStatementHolder holder; - private final PreparedStatement stmt; - private final String sql; - - private int defaultMaxFieldSize; - private int defaultMaxRows; - private int defaultQueryTimeout; - private int defaultFetchDirection; - private int defaultFetchSize; - private int currentMaxFieldSize; - private int currentMaxRows; - private int currentQueryTimeout; - private int currentFetchDirection; - private int currentFetchSize; - - public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ - super(conn, holder.getStatement()); - this.stmt = holder.getStatement(); - this.holder = holder; - this.sql = holder.getKey().sql; - - // Remember the defaults - defaultMaxFieldSize = stmt.getMaxFieldSize(); - defaultMaxRows = stmt.getMaxRows(); - defaultQueryTimeout = stmt.getQueryTimeout(); - defaultFetchDirection = stmt.getFetchDirection(); - defaultFetchSize = stmt.getFetchSize(); - currentMaxFieldSize = defaultMaxFieldSize; - currentMaxRows = defaultMaxRows; - currentQueryTimeout = defaultQueryTimeout; - currentFetchDirection = defaultFetchDirection; - currentFetchSize = defaultFetchSize; - } - - public PreparedStatementHolder getPreparedStatementHolder() { - return holder; - } - - public int getHitCount() { - return holder.getHitCount(); - } - - public void setFetchSize(int rows) throws SQLException { - currentFetchSize = rows; - super.setFetchSize(rows); - } - - public void setFetchDirection(int direction) throws SQLException { - currentFetchDirection = direction; - super.setFetchDirection(direction); - } - - public void setMaxFieldSize(int max) throws SQLException { - currentMaxFieldSize = max; - super.setMaxFieldSize(max); - } - - public void setMaxRows(int max) throws SQLException { - currentMaxRows = max; - super.setMaxRows(max); - } - - public void setQueryTimeout(int seconds) throws SQLException { - currentQueryTimeout = seconds; - super.setQueryTimeout(seconds); - } - - public String getSql() { - return sql; - } - - public PreparedStatementKey getKey() { - return holder.getKey(); - } - - public PreparedStatement getRawPreparedStatement() { - return stmt; - } - - public PreparedStatement getRawStatement() { - return stmt; - } - - @Override - public void close() throws SQLException { - if (isClosed()) { - return; - } - - // Reset the defaults - if (defaultMaxFieldSize != currentMaxFieldSize) { - stmt.setMaxFieldSize(defaultMaxFieldSize); - currentMaxFieldSize = defaultMaxFieldSize; - } - if (defaultMaxRows != currentMaxRows) { - stmt.setMaxRows(defaultMaxRows); - currentMaxRows = defaultMaxRows; - } - if (defaultQueryTimeout != currentQueryTimeout) { - stmt.setQueryTimeout(defaultQueryTimeout); - currentQueryTimeout = defaultQueryTimeout; - } - if (defaultFetchDirection != currentFetchDirection) { - stmt.setFetchDirection(defaultFetchDirection); - currentFetchDirection = defaultFetchDirection; - } - if (defaultFetchSize != currentFetchSize) { - stmt.setFetchSize(defaultFetchSize); - currentFetchSize = defaultFetchSize; - } - - conn.closePoolableStatement(this); - } - - void closeInternal() throws SQLException { - super.close(); - } - - void setClosed(boolean value) { - this.closed = value; - } - - @Override - public ResultSet executeQuery() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - oracleSetRowPrefetch(); - - conn.beforeExecute(); - try { - ResultSet rs = stmt.executeQuery(); - - if (rs == null) { - return null; - } - - DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); - resultSetTrace.add(poolableResultSet); - - return poolableResultSet; - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public int executeUpdate() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - conn.beforeExecute(); - try { - return stmt.executeUpdate(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public void setNull(int parameterIndex, int sqlType) throws SQLException { - checkOpen(); - - try { - stmt.setNull(parameterIndex, sqlType); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBoolean(int parameterIndex, boolean x) throws SQLException { - checkOpen(); - - try { - stmt.setBoolean(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setByte(int parameterIndex, byte x) throws SQLException { - checkOpen(); - - try { - stmt.setByte(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setShort(int parameterIndex, short x) throws SQLException { - checkOpen(); - - try { - stmt.setShort(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setInt(int parameterIndex, int x) throws SQLException { - checkOpen(); - - try { - stmt.setInt(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setLong(int parameterIndex, long x) throws SQLException { - checkOpen(); - - try { - stmt.setLong(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setFloat(int parameterIndex, float x) throws SQLException { - checkOpen(); - - try { - stmt.setFloat(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDouble(int parameterIndex, double x) throws SQLException { - checkOpen(); - - try { - stmt.setDouble(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { - checkOpen(); - - try { - stmt.setBigDecimal(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setString(int parameterIndex, String x) throws SQLException { - checkOpen(); - - try { - stmt.setString(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBytes(int parameterIndex, byte[] x) throws SQLException { - checkOpen(); - - try { - stmt.setBytes(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDate(int parameterIndex, Date x) throws SQLException { - checkOpen(); - - try { - stmt.setDate(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTime(int parameterIndex, Time x) throws SQLException { - checkOpen(); - - try { - stmt.setTime(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { - checkOpen(); - - try { - stmt.setTimestamp(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - @Deprecated - public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setUnicodeStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void clearParameters() throws SQLException { - checkOpen(); - - try { - stmt.clearParameters(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x, targetSqlType); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public boolean execute() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - // oracleSetRowPrefetch(); - - conn.beforeExecute(); - try { - return stmt.execute(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - protected void oracleSetRowPrefetch() throws SQLException { - if (!conn.isOracle()) { - return; - } - - if (holder.getHitCount() == 0) { - return; - } - - int fetchRowPeak = holder.getFetchRowPeak(); - - if (fetchRowPeak < 0) { - return; - } - - if (holder.getDefaultRowPretch() == -1) { - int defaultRowPretch = OracleUtils.getRowPrefetch(this); - holder.setDefaultRowPretch(defaultRowPretch); - holder.setRowPrefetch(defaultRowPretch); - } - - int rowPrefetch; - - if (fetchRowPeak <= 1) { - rowPrefetch = 2; - } else if (fetchRowPeak > holder.getDefaultRowPretch()) { - rowPrefetch = holder.getDefaultRowPretch(); - } else { - rowPrefetch = fetchRowPeak + 1; - } - - if (rowPrefetch != holder.getRowPrefetch()) { - OracleUtils.setRowPrefetch(this, rowPrefetch); - holder.setRowPrefetch(rowPrefetch); - } - } - - @Override - public void addBatch() throws SQLException { - checkOpen(); - - try { - stmt.addBatch(); - } catch (Throwable t) { - throw checkException(t); - } - } - - public int[] executeBatch() throws SQLException { - checkOpen(); - - incrementExecuteCount(); - transactionRecord(sql); - - conn.beforeExecute(); - try { - return stmt.executeBatch(); - } catch (Throwable t) { - throw checkException(t); - } finally { - conn.afterExecute(); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setRef(int parameterIndex, Ref x) throws SQLException { - checkOpen(); - - try { - stmt.setRef(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, Blob x) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Clob x) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setArray(int parameterIndex, Array x) throws SQLException { - checkOpen(); - - try { - stmt.setArray(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public ResultSetMetaData getMetaData() throws SQLException { - checkOpen(); - - try { - return stmt.getMetaData(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setDate(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setTime(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { - checkOpen(); - - try { - stmt.setTimestamp(parameterIndex, x, cal); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { - checkOpen(); - - try { - stmt.setNull(parameterIndex, sqlType, typeName); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setURL(int parameterIndex, URL x) throws SQLException { - checkOpen(); - - try { - stmt.setURL(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public ParameterMetaData getParameterMetaData() throws SQLException { - checkOpen(); - - try { - return stmt.getParameterMetaData(); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setRowId(int parameterIndex, RowId x) throws SQLException { - checkOpen(); - - try { - stmt.setRowId(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNString(int parameterIndex, String value) throws SQLException { - checkOpen(); - - try { - stmt.setNString(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { - checkOpen(); - - try { - stmt.setNCharacterStream(parameterIndex, value, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, NClob value) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, inputStream, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { - checkOpen(); - - try { - stmt.setSQLXML(parameterIndex, xmlObject); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { - checkOpen(); - - try { - stmt.setObject(parameterIndex, x, targetSqlType, scaleOrLength); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader, length); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { - checkOpen(); - - try { - stmt.setAsciiStream(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { - checkOpen(); - - try { - stmt.setBinaryStream(parameterIndex, x); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setCharacterStream(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { - checkOpen(); - - try { - stmt.setNCharacterStream(parameterIndex, value); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setClob(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setClob(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { - checkOpen(); - - try { - stmt.setBlob(parameterIndex, inputStream); - } catch (Throwable t) { - throw checkException(t); - } - } - - @Override - public void setNClob(int parameterIndex, Reader reader) throws SQLException { - checkOpen(); - - try { - stmt.setNClob(parameterIndex, reader); - } catch (Throwable t) { - throw checkException(t); - } - } - - public static class PreparedStatementKey { - - private final String sql; - private final String catalog; - - protected final MethodType methodType; - - private final int resultSetType; - private final int resultSetConcurrency; - private final int resultSetHoldability; - private final int autoGeneratedKeys; - private final int[] columnIndexes; - private final String[] columnNames; - - public PreparedStatementKey(String sql, String catalog, MethodType methodType) throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency) throws SQLException{ - this(sql, catalog, methodType, resultSetType, resultSetConcurrency, 0, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) throws SQLException{ - this(sql, catalog, methodType, resultSetType, resultSetConcurrency, resultSetHoldability, 0, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int autoGeneratedKeys) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, autoGeneratedKeys, null, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int[] columnIndexes) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, columnIndexes, null); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, String[] columnNames) - throws SQLException{ - this(sql, catalog, methodType, 0, 0, 0, 0, null, columnNames); - } - - public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, - int resultSetConcurrency, int resultSetHoldability, int autoGeneratedKeys, - int[] columnIndexes, String[] columnNames) throws SQLException{ - if (sql == null) { - throw new SQLException("sql is null"); - } - - this.sql = sql; - this.catalog = catalog; - this.methodType = methodType; - this.resultSetType = resultSetType; - this.resultSetConcurrency = resultSetConcurrency; - this.resultSetHoldability = resultSetHoldability; - this.autoGeneratedKeys = autoGeneratedKeys; - this.columnIndexes = columnIndexes; - this.columnNames = columnNames; - } - - public int getResultSetType() { - return resultSetType; - } - - public int getResultSetConcurrency() { - return resultSetConcurrency; - } - - public int getResultSetHoldability() { - return resultSetHoldability; - } - - public boolean equals(Object object) { - PreparedStatementKey that = (PreparedStatementKey) object; - - if (!this.sql.equals(that.sql)) { - return false; - } - - if (this.catalog == null) { - if (that.catalog != null) { - return false; - } - } else { - if (!this.catalog.equals(that.catalog)) { - return false; - } - } - - if (this.methodType != that.methodType) { - return false; - } - - if (this.resultSetType != that.resultSetType) { - return false; - } - - if (this.resultSetConcurrency != that.resultSetConcurrency) { - return false; - } - - if (this.resultSetHoldability != that.resultSetHoldability) { - return false; - } - - if (this.autoGeneratedKeys != that.autoGeneratedKeys) { - return false; - } - - if (!Arrays.equals(columnIndexes, that.columnIndexes)) { - return false; - } - - if (!Arrays.equals(columnNames, that.columnNames)) { - return false; - } - - return true; - } - - public int hashCode() { - final int prime = 31; - int result = 1; - - result = prime * result + ((sql == null) ? 0 : sql.hashCode()); - result = prime * result + ((catalog == null) ? 0 : catalog.hashCode()); - result = prime * result + ((methodType == null) ? 0 : methodType.hashCode()); - - result = prime * result + resultSetConcurrency; - result = prime * result + resultSetHoldability; - result = prime * result + resultSetType; - - result = prime * result + autoGeneratedKeys; - - result = prime * result + Arrays.hashCode(columnIndexes); - result = prime * result + Arrays.hashCode(columnNames); - - return result; - } - - public String getSql() { - return sql; - } - - } - - @SuppressWarnings("unchecked") - public T unwrap(Class iface) throws SQLException { - if (iface == PreparedStatement.class) { - if (stmt instanceof PreparedStatementProxy) { - return stmt.unwrap(iface); - } - return (T) stmt; - } - - if (iface == PreparedStatementHolder.class) { - return (T) this.holder; - } - - return super.unwrap(iface); - } -} +/* + * 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.pool; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; +import java.sql.Ref; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.Calendar; + +import com.alibaba.druid.pool.PreparedStatementPool.MethodType; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; +import com.alibaba.druid.util.OracleUtils; + +/** + * @author wenshao + */ +public class DruidPooledPreparedStatement extends DruidPooledStatement implements PreparedStatement { + + private final PreparedStatementHolder holder; + private final PreparedStatement stmt; + private final String sql; + + private int defaultMaxFieldSize; + private int defaultMaxRows; + private int defaultQueryTimeout; + private int defaultFetchDirection; + private int defaultFetchSize; + private int currentMaxFieldSize; + private int currentMaxRows; + private int currentQueryTimeout; + private int currentFetchDirection; + private int currentFetchSize; + + public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{ + super(conn, holder.getStatement()); + this.stmt = holder.getStatement(); + this.holder = holder; + this.sql = holder.getKey().sql; + + // Remember the defaults + defaultMaxFieldSize = stmt.getMaxFieldSize(); + defaultMaxRows = stmt.getMaxRows(); + defaultQueryTimeout = stmt.getQueryTimeout(); + defaultFetchDirection = stmt.getFetchDirection(); + defaultFetchSize = stmt.getFetchSize(); + currentMaxFieldSize = defaultMaxFieldSize; + currentMaxRows = defaultMaxRows; + currentQueryTimeout = defaultQueryTimeout; + currentFetchDirection = defaultFetchDirection; + currentFetchSize = defaultFetchSize; + } + + public PreparedStatementHolder getPreparedStatementHolder() { + return holder; + } + + public int getHitCount() { + return holder.getHitCount(); + } + + public void setFetchSize(int rows) throws SQLException { + currentFetchSize = rows; + super.setFetchSize(rows); + } + + public void setFetchDirection(int direction) throws SQLException { + currentFetchDirection = direction; + super.setFetchDirection(direction); + } + + public void setMaxFieldSize(int max) throws SQLException { + currentMaxFieldSize = max; + super.setMaxFieldSize(max); + } + + public void setMaxRows(int max) throws SQLException { + currentMaxRows = max; + super.setMaxRows(max); + } + + public void setQueryTimeout(int seconds) throws SQLException { + currentQueryTimeout = seconds; + super.setQueryTimeout(seconds); + } + + public String getSql() { + return sql; + } + + public PreparedStatementKey getKey() { + return holder.getKey(); + } + + public PreparedStatement getRawPreparedStatement() { + return stmt; + } + + public PreparedStatement getRawStatement() { + return stmt; + } + + @Override + public void close() throws SQLException { + if (isClosed()) { + return; + } + + // Reset the defaults + if (defaultMaxFieldSize != currentMaxFieldSize) { + stmt.setMaxFieldSize(defaultMaxFieldSize); + currentMaxFieldSize = defaultMaxFieldSize; + } + if (defaultMaxRows != currentMaxRows) { + stmt.setMaxRows(defaultMaxRows); + currentMaxRows = defaultMaxRows; + } + if (defaultQueryTimeout != currentQueryTimeout) { + stmt.setQueryTimeout(defaultQueryTimeout); + currentQueryTimeout = defaultQueryTimeout; + } + if (defaultFetchDirection != currentFetchDirection) { + stmt.setFetchDirection(defaultFetchDirection); + currentFetchDirection = defaultFetchDirection; + } + if (defaultFetchSize != currentFetchSize) { + stmt.setFetchSize(defaultFetchSize); + currentFetchSize = defaultFetchSize; + } + + conn.closePoolableStatement(this); + } + + void closeInternal() throws SQLException { + super.close(); + } + + void setClosed(boolean value) { + this.closed = value; + } + + @Override + public ResultSet executeQuery() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + oracleSetRowPrefetch(); + + conn.beforeExecute(); + try { + ResultSet rs = stmt.executeQuery(); + + if (rs == null) { + return null; + } + + DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); + resultSetTrace.add(poolableResultSet); + + return poolableResultSet; + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public int executeUpdate() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + conn.beforeExecute(); + try { + return stmt.executeUpdate(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public void setNull(int parameterIndex, int sqlType) throws SQLException { + checkOpen(); + + try { + stmt.setNull(parameterIndex, sqlType); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBoolean(int parameterIndex, boolean x) throws SQLException { + checkOpen(); + + try { + stmt.setBoolean(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setByte(int parameterIndex, byte x) throws SQLException { + checkOpen(); + + try { + stmt.setByte(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setShort(int parameterIndex, short x) throws SQLException { + checkOpen(); + + try { + stmt.setShort(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setInt(int parameterIndex, int x) throws SQLException { + checkOpen(); + + try { + stmt.setInt(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setLong(int parameterIndex, long x) throws SQLException { + checkOpen(); + + try { + stmt.setLong(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setFloat(int parameterIndex, float x) throws SQLException { + checkOpen(); + + try { + stmt.setFloat(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDouble(int parameterIndex, double x) throws SQLException { + checkOpen(); + + try { + stmt.setDouble(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { + checkOpen(); + + try { + stmt.setBigDecimal(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setString(int parameterIndex, String x) throws SQLException { + checkOpen(); + + try { + stmt.setString(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBytes(int parameterIndex, byte[] x) throws SQLException { + checkOpen(); + + try { + stmt.setBytes(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDate(int parameterIndex, Date x) throws SQLException { + checkOpen(); + + try { + stmt.setDate(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTime(int parameterIndex, Time x) throws SQLException { + checkOpen(); + + try { + stmt.setTime(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { + checkOpen(); + + try { + stmt.setTimestamp(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + @Deprecated + public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setUnicodeStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void clearParameters() throws SQLException { + checkOpen(); + + try { + stmt.clearParameters(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x, targetSqlType); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public boolean execute() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + // oracleSetRowPrefetch(); + + conn.beforeExecute(); + try { + return stmt.execute(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + protected void oracleSetRowPrefetch() throws SQLException { + if (!conn.isOracle()) { + return; + } + + if (holder.getHitCount() == 0) { + return; + } + + int fetchRowPeak = holder.getFetchRowPeak(); + + if (fetchRowPeak < 0) { + return; + } + + if (holder.getDefaultRowPretch() == -1) { + int defaultRowPretch = OracleUtils.getRowPrefetch(this); + holder.setDefaultRowPretch(defaultRowPretch); + holder.setRowPrefetch(defaultRowPretch); + } + + int rowPrefetch; + + if (fetchRowPeak <= 1) { + rowPrefetch = 2; + } else if (fetchRowPeak > holder.getDefaultRowPretch()) { + rowPrefetch = holder.getDefaultRowPretch(); + } else { + rowPrefetch = fetchRowPeak + 1; + } + + if (rowPrefetch != holder.getRowPrefetch()) { + OracleUtils.setRowPrefetch(this, rowPrefetch); + holder.setRowPrefetch(rowPrefetch); + } + } + + @Override + public void addBatch() throws SQLException { + checkOpen(); + + try { + stmt.addBatch(); + } catch (Throwable t) { + throw checkException(t); + } + } + + public int[] executeBatch() throws SQLException { + checkOpen(); + + incrementExecuteCount(); + transactionRecord(sql); + + conn.beforeExecute(); + try { + return stmt.executeBatch(); + } catch (Throwable t) { + throw checkException(t); + } finally { + conn.afterExecute(); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setRef(int parameterIndex, Ref x) throws SQLException { + checkOpen(); + + try { + stmt.setRef(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, Blob x) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Clob x) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setArray(int parameterIndex, Array x) throws SQLException { + checkOpen(); + + try { + stmt.setArray(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + checkOpen(); + + try { + return stmt.getMetaData(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setDate(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setTime(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { + checkOpen(); + + try { + stmt.setTimestamp(parameterIndex, x, cal); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { + checkOpen(); + + try { + stmt.setNull(parameterIndex, sqlType, typeName); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setURL(int parameterIndex, URL x) throws SQLException { + checkOpen(); + + try { + stmt.setURL(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public ParameterMetaData getParameterMetaData() throws SQLException { + checkOpen(); + + try { + return stmt.getParameterMetaData(); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setRowId(int parameterIndex, RowId x) throws SQLException { + checkOpen(); + + try { + stmt.setRowId(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNString(int parameterIndex, String value) throws SQLException { + checkOpen(); + + try { + stmt.setNString(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { + checkOpen(); + + try { + stmt.setNCharacterStream(parameterIndex, value, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, NClob value) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, inputStream, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { + checkOpen(); + + try { + stmt.setSQLXML(parameterIndex, xmlObject); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { + checkOpen(); + + try { + stmt.setObject(parameterIndex, x, targetSqlType, scaleOrLength); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader, length); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { + checkOpen(); + + try { + stmt.setAsciiStream(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { + checkOpen(); + + try { + stmt.setBinaryStream(parameterIndex, x); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setCharacterStream(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { + checkOpen(); + + try { + stmt.setNCharacterStream(parameterIndex, value); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setClob(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setClob(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { + checkOpen(); + + try { + stmt.setBlob(parameterIndex, inputStream); + } catch (Throwable t) { + throw checkException(t); + } + } + + @Override + public void setNClob(int parameterIndex, Reader reader) throws SQLException { + checkOpen(); + + try { + stmt.setNClob(parameterIndex, reader); + } catch (Throwable t) { + throw checkException(t); + } + } + + public static class PreparedStatementKey { + + private final String sql; + private final String catalog; + + protected final MethodType methodType; + + private final int resultSetType; + private final int resultSetConcurrency; + private final int resultSetHoldability; + private final int autoGeneratedKeys; + private final int[] columnIndexes; + private final String[] columnNames; + + public PreparedStatementKey(String sql, String catalog, MethodType methodType) throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency) throws SQLException{ + this(sql, catalog, methodType, resultSetType, resultSetConcurrency, 0, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency, int resultSetHoldability) throws SQLException{ + this(sql, catalog, methodType, resultSetType, resultSetConcurrency, resultSetHoldability, 0, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int autoGeneratedKeys) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, autoGeneratedKeys, null, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int[] columnIndexes) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, columnIndexes, null); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, String[] columnNames) + throws SQLException{ + this(sql, catalog, methodType, 0, 0, 0, 0, null, columnNames); + } + + public PreparedStatementKey(String sql, String catalog, MethodType methodType, int resultSetType, + int resultSetConcurrency, int resultSetHoldability, int autoGeneratedKeys, + int[] columnIndexes, String[] columnNames) throws SQLException{ + if (sql == null) { + throw new SQLException("sql is null"); + } + + this.sql = sql; + this.catalog = catalog; + this.methodType = methodType; + this.resultSetType = resultSetType; + this.resultSetConcurrency = resultSetConcurrency; + this.resultSetHoldability = resultSetHoldability; + this.autoGeneratedKeys = autoGeneratedKeys; + this.columnIndexes = columnIndexes; + this.columnNames = columnNames; + } + + public int getResultSetType() { + return resultSetType; + } + + public int getResultSetConcurrency() { + return resultSetConcurrency; + } + + public int getResultSetHoldability() { + return resultSetHoldability; + } + + public boolean equals(Object object) { + PreparedStatementKey that = (PreparedStatementKey) object; + + if (!this.sql.equals(that.sql)) { + return false; + } + + if (this.catalog == null) { + if (that.catalog != null) { + return false; + } + } else { + if (!this.catalog.equals(that.catalog)) { + return false; + } + } + + if (this.methodType != that.methodType) { + return false; + } + + if (this.resultSetType != that.resultSetType) { + return false; + } + + if (this.resultSetConcurrency != that.resultSetConcurrency) { + return false; + } + + if (this.resultSetHoldability != that.resultSetHoldability) { + return false; + } + + if (this.autoGeneratedKeys != that.autoGeneratedKeys) { + return false; + } + + if (!Arrays.equals(columnIndexes, that.columnIndexes)) { + return false; + } + + if (!Arrays.equals(columnNames, that.columnNames)) { + return false; + } + + return true; + } + + public int hashCode() { + final int prime = 31; + int result = 1; + + result = prime * result + ((sql == null) ? 0 : sql.hashCode()); + result = prime * result + ((catalog == null) ? 0 : catalog.hashCode()); + result = prime * result + ((methodType == null) ? 0 : methodType.hashCode()); + + result = prime * result + resultSetConcurrency; + result = prime * result + resultSetHoldability; + result = prime * result + resultSetType; + + result = prime * result + autoGeneratedKeys; + + result = prime * result + Arrays.hashCode(columnIndexes); + result = prime * result + Arrays.hashCode(columnNames); + + return result; + } + + public String getSql() { + return sql; + } + + } + + @SuppressWarnings("unchecked") + public T unwrap(Class iface) throws SQLException { + if (iface == PreparedStatement.class) { + if (stmt instanceof PreparedStatementProxy) { + return stmt.unwrap(iface); + } + return (T) stmt; + } + + if (iface == PreparedStatementHolder.class) { + return (T) this.holder; + } + + return super.unwrap(iface); + } +} From 5c6237e94be0e88f6679ab8cbaffe801eb17f58f Mon Sep 17 00:00:00 2001 From: sandzhang Date: Fri, 28 Sep 2012 17:25:02 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0alibaba=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=89=B9=E6=AE=8Adbtype=E5=88=A4=E6=96=AD=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/alibaba/druid/util/JdbcUtils.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index d349a0b19c..6e01676113 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -438,8 +438,14 @@ public final class JdbcUtils { return DERBY; } else if (rawUrl.startsWith("jdbc:mysql:")) { return MYSQL; + } else if (rawUrl.startsWith("jdbc:wrap-jdbc:filters=default:name=com.alibaba.dragoon.master:jdbc:mysql:")) { + return MYSQL; } else if (rawUrl.startsWith("jdbc:oracle:")) { return ORACLE; + } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) { + return ORACLE; + } else if (rawUrl.startsWith("jdbc:wrap-jdbc:driver=com.alibaba.jdbc.AlibabaDriver")) { + return ORACLE; } else if (rawUrl.startsWith("jdbc:microsoft:")) { return SQL_SERVER; } else if (rawUrl.startsWith("jdbc:sybase:Tds:")) { From fe378e43d3722cd4475f7f1fb52feac34a767669 Mon Sep 17 00:00:00 2001 From: sandzhang Date: Fri, 28 Sep 2012 18:25:01 +0800 Subject: [PATCH 13/13] add dbtype AlibabaOracle --- .../java/com/alibaba/druid/sql/SQLUtils.java | 9 ++-- .../druid/sql/parser/SQLParserUtils.java | 8 +-- .../ParameterizedOutputVisitorUtils.java | 4 +- .../sql/visitor/SQLEvalVisitorUtils.java | 10 ++-- .../com/alibaba/druid/util/JdbcUtils.java | 49 ++++++++++--------- .../com/alibaba/druid/wall/WallFilter.java | 2 +- .../alibaba/druid/bvt/sql/DistinctTest.java | 18 ++++--- .../alibaba/druid/bvt/sql/MybatisTest.java | 11 +++-- .../alibaba/druid/bvt/sql/MybatisTest2.java | 11 +++-- .../druid/bvt/sql/oracle/MergeTest.java | 5 +- .../bvt/sql/oracle/OracleFormatTest2.java | 2 + 11 files changed, 70 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 5c6f28222a..25e42c5d62 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -42,18 +42,19 @@ import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.JdbcUtils; public class SQLUtils { + private final static Log LOG = LogFactory.getLog(SQLUtils.class); public static String toSQLString(SQLObject sqlObject, String dbType) { if (JdbcUtils.MYSQL.equals(dbType)) { return toMySqlString(sqlObject); } - + if (JdbcUtils.H2.equals(dbType)) { return toMySqlString(sqlObject); } - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { return toOracleString(sqlObject); } @@ -163,7 +164,7 @@ public class SQLUtils { public static SQLASTOutputVisitor createFormatOutputVisitor(Appendable out, List statementList, String dbType) { - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { if (statementList.size() == 1) { return new OracleOutputVisitor(out, false); } else { @@ -191,7 +192,7 @@ public class SQLUtils { } public static SchemaStatVisitor createSchemaStatVisitor(List statementList, String dbType) { - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { if (statementList.size() == 1) { return new OracleSchemaStatVisitor(); } else { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java index 8a7192e7d3..c4cd436f92 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java @@ -28,7 +28,7 @@ import com.alibaba.druid.util.JdbcUtils; public class SQLParserUtils { public static SQLStatementParser createSQLStatementParser(String sql, String dbType) { - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { return new OracleStatementParser(sql); } @@ -43,7 +43,7 @@ public class SQLParserUtils { if (JdbcUtils.SQL_SERVER.equals(dbType)) { return new SQLServerStatementParser(sql); } - + if (JdbcUtils.H2.equals(dbType)) { return new MySqlStatementParser(sql); } @@ -52,14 +52,14 @@ public class SQLParserUtils { } public static SQLExprParser createExprParser(String sql, String dbType) { - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { return new OracleExprParser(sql); } if (JdbcUtils.H2.equals(dbType)) { return new MySqlExprParser(sql); } - + if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlExprParser(sql); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 152ebb186d..895565a705 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -48,14 +48,14 @@ public class ParameterizedOutputVisitorUtils { } public static SQLASTOutputVisitor createParameterizedOutputVisitor(Appendable out, String dbType) { - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { return new OracleParameterizedOutputVisitor(out); } if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlParameterizedOutputVisitor(out); } - + if (JdbcUtils.H2.equals(dbType)) { return new MySqlParameterizedOutputVisitor(out); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index f74248d20a..e0399eae82 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -91,7 +91,7 @@ public class SQLEvalVisitorUtils { return new MySqlEvalVisitorImpl(); } - if (JdbcUtils.ORACLE.equals(dbType)) { + if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { return new OracleEvalVisitor(); } @@ -623,11 +623,11 @@ public class SQLEvalVisitorUtils { if (a instanceof BigInteger || b instanceof BigInteger) { return _bigInt(a).add(_bigInt(b)); } - + if (a instanceof Double || b instanceof Double) { return _double(a) + _double(b); } - + if (a instanceof Float || b instanceof Float) { return _float(a) + _float(b); } @@ -671,11 +671,11 @@ public class SQLEvalVisitorUtils { if (a instanceof BigInteger || b instanceof BigInteger) { return _bigInt(a).subtract(_bigInt(b)); } - + if (a instanceof Double || b instanceof Double) { return _double(a) - _double(b); } - + if (a instanceof Float || b instanceof Float) { return _float(a) - _float(b); } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 6e01676113..166bb44ddf 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -47,43 +47,46 @@ import com.alibaba.druid.support.logging.LogFactory; */ public final class JdbcUtils { - public static final String JTDS = "jtds"; + public static final String JTDS = "jtds"; - public static final String MOCK = "mock"; + public static final String MOCK = "mock"; - public static final String HSQL = "hsql"; + public static final String HSQL = "hsql"; - public static final String DB2 = "db2"; + public static final String DB2 = "db2"; - private static final String DB2_DRIVER = "COM.ibm.db2.jdbc.app.DB2Driver"; + private static final String DB2_DRIVER = "COM.ibm.db2.jdbc.app.DB2Driver"; - public static final String POSTGRESQL = "postgresql"; + public static final String POSTGRESQL = "postgresql"; - public static final String SYBASE = "sybase"; + public static final String SYBASE = "sybase"; - public static final String SQL_SERVER = "sqlserver"; + public static final String SQL_SERVER = "sqlserver"; - public static final String ORACLE = "oracle"; + public static final String ORACLE = "oracle"; + public static final String ALI_ORACLE = "AliOracle"; - private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver"; + private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver"; - public static final String MYSQL = "mysql"; + private static final String ALI_ORACLE_DRIVER = "com.alibaba.jdbc.AlibabaDriver"; - private static final String MYSQL_DRIVER = "com.mysql.jdbc.Driver"; + public static final String MYSQL = "mysql"; - public static final String DERBY = "derby"; + private static final String MYSQL_DRIVER = "com.mysql.jdbc.Driver"; - public static final String HBASE = "hbase"; + public static final String DERBY = "derby"; - public static final String HIVE = "hive"; + public static final String HBASE = "hbase"; - public static final String H2 = "h2"; + public static final String HIVE = "hive"; - private static final String H2_DRIVER = "org.h2.Driver"; + public static final String H2 = "h2"; - private final static Log LOG = LogFactory.getLog(JdbcUtils.class); + private static final String H2_DRIVER = "org.h2.Driver"; - private static final Properties driverUrlMapping = new Properties(); + private final static Log LOG = LogFactory.getLog(JdbcUtils.class); + + private static final Properties driverUrlMapping = new Properties(); static { try { @@ -376,6 +379,8 @@ public final class JdbcUtils { return MYSQL_DRIVER; } else if (rawUrl.startsWith("jdbc:oracle:")) { return ORACLE_DRIVER; + } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) { + return ALI_ORACLE_DRIVER; } else if (rawUrl.startsWith("jdbc:microsoft:")) { return "com.microsoft.jdbc.sqlserver.SQLServerDriver"; } else if (rawUrl.startsWith("jdbc:sqlserver:")) { @@ -438,14 +443,10 @@ public final class JdbcUtils { return DERBY; } else if (rawUrl.startsWith("jdbc:mysql:")) { return MYSQL; - } else if (rawUrl.startsWith("jdbc:wrap-jdbc:filters=default:name=com.alibaba.dragoon.master:jdbc:mysql:")) { - return MYSQL; } else if (rawUrl.startsWith("jdbc:oracle:")) { return ORACLE; } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) { - return ORACLE; - } else if (rawUrl.startsWith("jdbc:wrap-jdbc:driver=com.alibaba.jdbc.AlibabaDriver")) { - return ORACLE; + return ALI_ORACLE; } else if (rawUrl.startsWith("jdbc:microsoft:")) { return SQL_SERVER; } else if (rawUrl.startsWith("jdbc:sybase:Tds:")) { diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 45a24adfdf..ed2c9bf779 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -65,7 +65,7 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { } provider = new MySqlWallProvider(config); - } else if (JdbcUtils.ORACLE.equals(dbType)) { + } else if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) { if (config == null) { config = new WallConfig(OracleWallProvider.DEFAULT_CONFIG_DIR); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java index ae956a18b8..23616b4cfc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java @@ -21,26 +21,30 @@ import junit.framework.TestCase; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.util.JdbcUtils; - public class DistinctTest extends TestCase { + private String sql = "select count(distinct *) from t"; - + public void test_mysql() throws Exception { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.MYSQL)); } - + public void test_oracle() throws Exception { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.ORACLE)); + Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.ALI_ORACLE)); } - + public void test_oracle_unique() throws Exception { - Assert.assertEquals("SELECT COUNT(UNIQUE *)\nFROM t", SQLUtils.format("select count(unique *) from t", JdbcUtils.ORACLE)); + Assert.assertEquals("SELECT COUNT(UNIQUE *)\nFROM t", + SQLUtils.format("select count(unique *) from t", JdbcUtils.ORACLE)); + Assert.assertEquals("SELECT COUNT(UNIQUE *)\nFROM t", + SQLUtils.format("select count(unique *) from t", JdbcUtils.ALI_ORACLE)); } - + public void test_postgres() throws Exception { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.POSTGRESQL)); } - + public void test_sql92() throws Exception { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, null)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java index c4dea474ff..6c934cdd72 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java @@ -21,22 +21,23 @@ import junit.framework.TestCase; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.util.JdbcUtils; - public class MybatisTest extends TestCase { + private String sql = "select * from t where id = #{id}"; - + public void test_mysql() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.MYSQL)); } - + public void test_oracle() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.ORACLE)); + Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.ALI_ORACLE)); } - + public void test_postgres() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.POSTGRESQL)); } - + public void test_sql92() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, null)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java index 4b93ebbfa5..c96e1501ac 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java @@ -21,22 +21,23 @@ import junit.framework.TestCase; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.util.JdbcUtils; - public class MybatisTest2 extends TestCase { + private String sql = "select * from t where id = ${id}"; - + public void test_mysql() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.MYSQL)); } - + public void test_oracle() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.ORACLE)); + Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.ALI_ORACLE)); } - + public void test_postgres() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.POSTGRESQL)); } - + public void test_sql92() throws Exception { Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, null)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java index 9d6244a5bb..2d92a28f05 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java @@ -32,11 +32,12 @@ public class MergeTest extends TestCase { String sql = "{ call INTERFACE_DATA_EXTRACTION.INVOICE_INFO(?,?,?)}"; ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.ORACLE); + ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.ALI_ORACLE); } - + public void test_mergeCall_mysql() throws Exception { String sql = "{ call INTERFACE_DATA_EXTRACTION.INVOICE_INFO(?,?,?)}"; - + ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.MYSQL); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFormatTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFormatTest2.java index be20bc89d0..d141ca034f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFormatTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFormatTest2.java @@ -27,5 +27,7 @@ public class OracleFormatTest2 extends TestCase { String formatedText = SQLUtils.format(text, JdbcUtils.ORACLE); System.out.println(formatedText); + String formatedText2 = SQLUtils.format(text, JdbcUtils.ALI_ORACLE); + System.out.println(formatedText2); } }