/* * Copyright 1999-2017 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 [yunnysunny@gmail.com] */ 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 = "<html>powered by <a href=\"http://blog.csdn.net/yunnysunny\">yunnysunny</a></html>"; /** 滚动条面板 */ 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<LinkedHashMap<String, Object>> 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<LinkedHashMap<String, Object>> 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); } } }