Package com.alibaba.druid.jconsole

Source Code of com.alibaba.druid.jconsole.DruidPanel

package com.alibaba.druid.jconsole;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.lang.management.ManagementFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.TabularData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

import com.alibaba.druid.logging.Log;
import com.alibaba.druid.logging.LogFactory;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.JdbcStatManager;
import com.sun.tools.jconsole.JConsoleContext;

public class DruidPanel extends JPanel {
    private final static Log LOG = LogFactory.getLog(DruidPanel.class);
   
    private static final long        serialVersionUID = 1L;

    protected JSplitPane             mainSplit;
    protected JTree                  tree;
    protected JPanel                 sheet;
    protected DefaultMutableTreeNode rootNode;
    protected DefaultMutableTreeNode dataSourcesNode;

    public DruidPanel(){
        setLayout(new BorderLayout());

        mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        mainSplit.setDividerLocation(160);
        mainSplit.setBorder(BorderFactory.createEmptyBorder());

        rootNode = new DefaultMutableTreeNode("root", true);
        dataSourcesNode = new DefaultMutableTreeNode(new NodeInfo(null, null, NodeType.DataSources, null, "DataSources"), true);
        rootNode.add(dataSourcesNode);

        tree = new JTree(rootNode);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.setRootVisible(false);

        tree.addTreeSelectionListener(new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent e) {
                treeSelect(e);
            }
        });

        JScrollPane theScrollPane = new JScrollPane(tree, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        JPanel treePanel = new JPanel(new BorderLayout());
        treePanel.add(theScrollPane, BorderLayout.CENTER);
        mainSplit.setLeftComponent(treePanel);

        sheet = new JPanel();
        mainSplit.setRightComponent(sheet);

        add(mainSplit);

        // init();
    }

    private void treeSelect(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();

        Object userObject = node.getUserObject();
        NodeInfo nodeInfo = (NodeInfo) userObject;

        if (nodeInfo == null) {
            mainSplit.setRightComponent(sheet);
            return;
        }

        if (nodeInfo.getType() == NodeType.DataSource) {
            DataSourceInfo dataSourceInfo = (DataSourceInfo) nodeInfo.getData();
            mainSplit.setRightComponent(new DataSourcePanel(dataSourceInfo));
        } else if (nodeInfo.getType() == NodeType.Connections) {
            DataSourceInfo dataSourceInfo = (DataSourceInfo) nodeInfo.getData();
            ConnectionsPanel connectionsPanel = new ConnectionsPanel(nodeInfo.getConnection(), nodeInfo.getObjectInstance(), dataSourceInfo);
            mainSplit.setRightComponent(connectionsPanel);
        } else if (nodeInfo.getType() == NodeType.SQL) {
            DataSourceInfo dataSourceInfo = (DataSourceInfo) nodeInfo.getData();
            SQLPanel connectionsPanel = new SQLPanel(nodeInfo.getConnection(), nodeInfo.getObjectInstance(), dataSourceInfo);
            mainSplit.setRightComponent(connectionsPanel);
        } else {
            mainSplit.setRightComponent(sheet);
        }
    }

    public void init() {
        try {
            ManagementFactory.getPlatformMBeanServer().registerMBean(JdbcStatManager.getInstance(), new ObjectName("com.alibaba.druid:type=JdbcStatManager"));

            DruidDataSource dataSource = new DruidDataSource();

            ManagementFactory.getPlatformMBeanServer().registerMBean(dataSource, new ObjectName("com.alibaba.druid:type=DataSource"));

            dataSource.setUrl("jdbc:mock:");
            dataSource.setFilters("stat,trace");

            Connection conn = dataSource.getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 1");
            while (rs.next()) {

            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception ex) {

        }
    }

    protected Object doInBackground(JConsoleContext context) throws Exception {
        doInBackground(context.getMBeanServerConnection());

        return null;
    }

    protected void doInBackground(MBeanServerConnection conn) throws Exception {
        // dataSourcesNode.removeAllChildren();

        List<ObjectInstance> stats = new ArrayList<ObjectInstance>();

        Set<ObjectInstance> instances = conn.queryMBeans(null, null);
        for (ObjectInstance instance : instances) {
            MBeanInfo info = conn.getMBeanInfo(instance.getObjectName());
            if ("com.alibaba.druid.stat.JdbcStatManager".equals(info.getClassName())) {
                stats.add(instance);
                continue;
            }

        }

        if (stats.size() == 0) {

        }

        for (ObjectInstance statInstance : stats) {
            TabularData tabularValue = (TabularData) conn.getAttribute(statInstance.getObjectName(), "DataSourceList");
            for (Object item : tabularValue.values()) {
                CompositeData rowData = (CompositeData) item;

                DataSourceInfo dataSourceInfo = new DataSourceInfo(conn, rowData);

                NodeInfo dataSourceNodeInfo = new NodeInfo(conn, statInstance, NodeType.DataSource, dataSourceInfo, dataSourceInfo.getName());
                DefaultMutableTreeNode dataSourceNode = new DefaultMutableTreeNode(dataSourceNodeInfo, true);

                NodeInfo connectionsNodeInfo = new NodeInfo(conn, statInstance, NodeType.Connections, dataSourceInfo, "Connections");
                DefaultMutableTreeNode connections = new DefaultMutableTreeNode(connectionsNodeInfo, true);
                {
                }
                dataSourceNode.add(connections);

                NodeInfo sqlNodeInfo = new NodeInfo(conn, statInstance, NodeType.SQL, dataSourceInfo, "SQL");
                DefaultMutableTreeNode sqlListNode = new DefaultMutableTreeNode(sqlNodeInfo, true);
                dataSourceNode.add(sqlListNode);

                dataSourcesNode.add(dataSourceNode);
            }
        }

        // TreePath path = new TreePath(dataSourcesNode.children());
        // tree.scrollPathToVisible(path);
    }

    public static void main(String[] args) throws Exception {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    JFrame frame = new JFrame();

                    DruidPanel panel = new DruidPanel();

                    frame.getContentPane().add(panel);
                    frame.pack();
                    frame.setSize(1024, 768);

                    // final String urlPath = "/jndi/rmi://192.168.1.103:9005/jmxrmi";
                    final String urlPath = "/jndi/rmi://10.20.138.25:9006/jmxrmi";
                    JMXServiceURL jmxUrl = new JMXServiceURL("rmi", "", 0, urlPath);

                    JMXConnector connector = JMXConnectorFactory.connect(jmxUrl);
                    panel.doInBackground(connector.getMBeanServerConnection());

                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                } catch (Exception e) {
                    LOG.error(e.getMessage(), e);
                }
            }
        });
    }
}
TOP

Related Classes of com.alibaba.druid.jconsole.DruidPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.