org.hyperic.hq.product.jmx.MBeanDumper.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.product.jmx.MBeanDumper.java

Source

/*
 * NOTE: This copyright does *not* cover user programs that use HQ
 * program services by normal system calls through the application
 * program interfaces provided as part of the Hyperic Plug-in Development
 * Kit or the Hyperic Client Development Kit - this is merely considered
 * normal use of the program, and does *not* fall under the heading of
 * "derived work".
 * 
 * Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
 * This file is part of HQ.
 * 
 * HQ is free software; you can redistribute it and/or modify
 * it under the terms version 2 of the GNU General Public License as
 * published by the Free Software Foundation. This program is distributed
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA.
 */

package org.hyperic.hq.product.jmx;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXServiceURL;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MBeanDumper {

    private static Log log = LogFactory.getLog(MBeanDumper.class);
    protected Properties _config;
    private MBeanServerConnection _server;

    protected static final String PROP_JMX_QUERY = "jmx.query";

    private static final String DEFAULT_URL = "service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi";

    protected boolean isValidObjectName(String name) {
        try {
            new ObjectName(name);
            return true;
        } catch (MalformedObjectNameException e) {
            return false;
        }
    }

    protected boolean isValidURL(String url) {
        if (url.startsWith(MxUtil.PTQL_PREFIX)) {
            return true;
        }
        try {
            new JMXServiceURL(url);
            return true;
        } catch (MalformedURLException e) {
            return false;
        }
    }

    protected Properties getConfig(String[] args) {
        _config = new Properties();

        String url = DEFAULT_URL;
        String query = "*:*";
        String user = System.getProperty("user");
        String pass = System.getProperty("pass");

        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            if (isValidURL(arg)) {
                url = arg;
            } else if (isValidObjectName(arg)) {
                query = arg;
            } else if (user == null) {
                user = arg;
            } else if (pass == null) {
                pass = arg;
            } else {
                throw new IllegalArgumentException("Invalid argument: " + arg);
            }
        }

        _config.putAll(System.getProperties());

        if (_config.getProperty(MxUtil.PROP_JMX_URL) == null) {
            _config.setProperty(MxUtil.PROP_JMX_URL, url);
        }

        if (_config.getProperty(PROP_JMX_QUERY) == null) {
            _config.setProperty(PROP_JMX_QUERY, query);
        }

        if (user != null) {
            _config.setProperty(MxUtil.PROP_JMX_USERNAME, user);
        }
        if (pass != null) {
            _config.setProperty(MxUtil.PROP_JMX_PASSWORD, pass);
        }

        String[][] keys = getPropertyMap();
        for (int i = 0; i < keys.length; i++) {
            _config.setProperty(keys[i][1], _config.getProperty(keys[i][0]));
        }

        return _config;
    }

    protected String[][] getPropertyMap() {
        return new String[0][0];
    }

    protected MBeanServerConnection getMBeanServer(Properties config) throws Exception {

        _server = MxUtil.getMBeanServer(config);
        return _server;
    }

    protected MBeanInfo getMBeanInfo(ObjectName obj) throws Exception {
        return _server.getMBeanInfo(obj);
    }

    protected Object getAttribute(ObjectName obj, String name) throws Exception {
        return _server.getAttribute(obj, name);
    }

    protected ObjectName getQuery() {
        String query = _config.getProperty(PROP_JMX_QUERY);
        try {
            return new ObjectName(query);
        } catch (Exception e) {
            throw new IllegalArgumentException(query);
        }
    }

    public void dump(String[] args) throws Exception {
        dump(getConfig(args));
    }

    public void dump(Properties config) throws Exception {
        MBeanServerConnection mServer = getMBeanServer(config);
        dump(mServer.queryNames(getQuery(), null));
    }

    public void dump(Set beans) {
        Iterator iter = beans.iterator();

        while (iter.hasNext()) {
            ObjectName obj = (ObjectName) iter.next();
            try {
                MBeanInfo info = getMBeanInfo(obj);

                System.out.println("MBean: " + info.getClassName());
                System.out.println("Name:  " + obj);

                MBeanAttributeInfo[] attrs = info.getAttributes();
                for (int k = 0; k < attrs.length; k++) {
                    String name = attrs[k].getName();
                    String value = "null";

                    try {
                        Object o = getAttribute(obj, name);
                        if (o != null) {
                            if (o.getClass().isArray()) {
                                value = Arrays.asList((Object[]) o).toString();
                            } else {
                                value = o.toString();
                            }
                        }
                    } catch (Exception e) {
                        value = "ERROR";
                        if (log.isDebugEnabled()) {
                            e.printStackTrace();
                        }
                    }
                    String perms = "";
                    if (attrs[k].isReadable()) {
                        perms += "r";
                    }
                    if (attrs[k].isWritable()) {
                        perms += "w";
                    }
                    System.out.println("\t" + k + ". Attribute: " + name + " = " + value + " (" + perms + ")");
                }

                MBeanOperationInfo[] ops = info.getOperations();

                for (int i = 0; i < ops.length; i++) {
                    ArrayList sig = new ArrayList();
                    MBeanParameterInfo[] params = ops[i].getSignature();
                    for (int j = 0; j < params.length; j++) {
                        sig.add(params[j].getType());
                    }
                    System.out.println(
                            "\t Operation: " + ops[i].getReturnType() + " " + ops[i].getName() + " " + sig);
                }
            } catch (Exception e) {
                if (log.isDebugEnabled()) {
                    e.printStackTrace();
                }
            }

            System.out.println("");
        }
    }

    public static void main(String[] args) throws Exception {
        new MBeanDumper().dump(args);
    }
}