com.alibaba.druid.support.jconsole.DruidPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of druid Show documentation
Show all versions of druid Show documentation
An JDBC datasource implementation.
/*
* Copyright 1999-2101 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 javax.management.MBeanServerConnection;
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.support.jconsole.model.DruidTableModel;
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;
/**
* druid面板的抽象类 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中
*
* @author yunnysunny
*/
public abstract class DruidPanel extends JPanel {
private static final long serialVersionUID = 1L;
/** 默认面板刷新的间隔时间 */
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;
/** 与界面管理的MBeanServerConnection对象 */
protected MBeanServerConnection conn;
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之后,各个子类对于解析后的数据的具体处理
*
* @param data 解析后的数据
*/
protected abstract void tableDataProcess(ArrayList> data);
/**
* 如果是第一次调用,则生成表格对象;否则根据当前时间来和上次刷新时间的间隔,
* 是否大于对象初始化时设定的时间间隔来判断是否刷新表格数据。
*
* @param url service的地址
* @param conn MBeanServerConnection对象
* @throws Exception
*/
protected void addOrRefreshTable(String url) 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 = TableDataProcessor.parseData(TableDataProcessor.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) {
if (conn == null) {
LOG.warn("MBeanServerConnection is null");
return;
}
try {
this.conn = conn;
addOrRefreshTable(url);
} catch (Exception e) {
LOG.warn("", e);
}
}
}