/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.console.twiddle.command;
import java.io.PrintWriter;
import java.util.Date;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.ObjectName;
/**
* Command to print out mbean metadata as an xmbean descriptor.
*
* The idea is to redirect and use the output as the skeleton
* for writing an xmbean descriptor for an existing mbean,
* since this can be very tedious to write by hand.
*
* @author <a href="dimitris@jboss.org">Dimitris Andreadis</a>
* @version $Revision: 81010 $
*/
public class XMBeanCommand extends MBeanServerCommand
{
/**
* Default CTOR
*/
public XMBeanCommand()
{
super("xmbean", "Print out mbean metadata as an xmbean descriptor");
}
public void displayHelp()
{
PrintWriter out = context.getWriter();
out.println(desc);
out.println();
out.println("Redirect the output and use it as a skeleton for");
out.println("writing an xmbean descriptor for an existing mbean.");
out.println();
out.println("Usage: " + name + " <object-name>");
out.println();
out.flush();
}
public void execute(String[] args) throws Exception
{
if (args.length != 1)
{
throw new CommandException("Missing object name");
}
ObjectName target = super.createObjectName(args[0]);
MBeanInfo mbeanInfo = getMBeanServer().getMBeanInfo(target);
MBeanConstructorInfo[] ctors = mbeanInfo.getConstructors();
MBeanAttributeInfo[] attrs = mbeanInfo.getAttributes();
MBeanOperationInfo[] ops = mbeanInfo.getOperations();
MBeanNotificationInfo[] notifs = mbeanInfo.getNotifications();
PrintWriter out = context.getWriter();
// header
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<!DOCTYPE mbean PUBLIC");
out.println(" \"-//JBoss//DTD JBOSS XMBEAN 1.2//EN\"");
out.println(" \"http://www.jboss.org/j2ee/dtd/jboss_xmbean_1_2.dtd\">");
out.println("<!--");
out.println(" xmbean descriptor generated by 'twiddle'");
out.println(" on " + new Date());
out.println(" for '" + target + "'");
out.println("-->");
out.println("<mbean>");
// mbean
out.println(" <description>" + mbeanInfo.getDescription() + "</description>");
out.println(" <class>" + mbeanInfo.getClassName() + "</class>");
out.println();
// constructors
if (ctors.length > 0)
{
for (int i = 0; i < ctors.length; i++)
{
MBeanConstructorInfo ctorInfo = ctors[i];
out.println(" <constructor>");
out.println(" <description>" + ctorInfo.getDescription() + "</description>");
out.println(" <name>" + ctorInfo.getName() + "</name>");
outputParameters(out, ctorInfo.getSignature());
out.println(" </constructor>");
}
out.println();
}
// attributes
if (attrs.length > 0)
{
for (int i = 0; i < attrs.length; i++)
{
MBeanAttributeInfo attrInfo = attrs[i];
// determine access, rw by default
String access = "read-write";
access = attrInfo.isReadable() ? access : "write-only";
access = attrInfo.isWritable() ? access : "read-only";
String accessString = " access='" + access + "'";
// determine get method, if any
String getMethodString = "";
if (attrInfo.isReadable())
{
getMethodString = " getMethod='" +
(attrInfo.isIs() ? "is" : "get") + attrInfo.getName() + "'";
}
// determine set method, if any
String setMethodString = "";
if (attrInfo.isWritable())
{
setMethodString = " setMethod='set" + attrInfo.getName() + "'";
}
out.println(" <attribute" + accessString + getMethodString + setMethodString + ">");
out.println(" <description>" + attrInfo.getDescription() + "</description>");
out.println(" <name>" + attrInfo.getName() + "</name>");
out.println(" <type>" + attrInfo.getType() + "</type>");
out.println(" </attribute>");
}
out.println();
}
// operations
if (ops.length > 0)
{
for (int i = 0; i < ops.length; i++)
{
MBeanOperationInfo opInfo = ops[i];
// nobody uses opInfo.getImpact()
out.println(" <operation>");
out.println(" <description>" + opInfo.getDescription() + "</description>");
out.println(" <name>" + opInfo.getName() + "</name>");
outputParameters(out, opInfo.getSignature());
out.println(" <return-type>" + opInfo.getReturnType() + "</return-type>");
out.println(" </operation>");
}
out.println();
}
// notifications
if (notifs.length > 0)
{
for (int i = 0; i < notifs.length; i++)
{
MBeanNotificationInfo notifInfo = notifs[i];
String[] types = notifInfo.getNotifTypes();
out.println(" <notification>");
out.println(" <description>" + notifInfo.getDescription() + "</description>");
out.println(" <name>" + notifInfo.getName() + "</name>");
for (int j = 0; j < types.length; j++)
{
out.println(" <notification-type>" + types[j] + "</notification-type>");
}
out.println(" </notification>");
}
out.println();
}
out.println("</mbean>");
out.flush();
}
private void outputParameters(PrintWriter out, MBeanParameterInfo[] params)
{
for (int i = 0; i < params.length; i++)
{
MBeanParameterInfo paramInfo = params[i];
out.println(" <parameter>");
out.println(" <description>" + paramInfo.getDescription() + "</description>");
out.println(" <name>" + paramInfo.getName() + "</name>");
out.println(" <type>" + paramInfo.getType() + "</type>");
out.println(" </parameter>");
}
}
}