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; + } + + } }