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;