/*
* 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.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import org.jboss.management.j2ee.J2EETypeConstants;
/**
* Command to print out jsr77 related information.
*
* @author <a href="dimitris@jboss.org">Dimitris Andreadis</a>
* @version $Revision: 81010 $
*/
public class JSR77Command extends MBeanServerCommand
{
private static final String INDENT = " ";
private static final Map j2eeTypeMap = new HashMap();
static
{
j2eeTypeMap.put(J2EETypeConstants.J2EEDomain,
new J2EEType(J2EETypeConstants.J2EEDomain, null, new String[] { "servers" }, null));
j2eeTypeMap.put(J2EETypeConstants.J2EEServer,
new J2EEType(J2EETypeConstants.J2EEServer, new String[] { "serverVendor", "serverVersion" }, new String[] { "deployedObjects", "resources", "javaVMs" }, null));
j2eeTypeMap.put(J2EETypeConstants.JVM,
new J2EEType(J2EETypeConstants.JVM, new String[] { "javaVersion", "javaVendor", "node" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.J2EEApplication,
new J2EEType(J2EETypeConstants.J2EEApplication, new String[] { /*"deploymentDescriptor"*/ }, null, new String[] { "modules" }));
j2eeTypeMap.put(J2EETypeConstants.AppClientModule,
new J2EEType(J2EETypeConstants.AppClientModule, null, null, null));
j2eeTypeMap.put(J2EETypeConstants.EJBModule,
new J2EEType(J2EETypeConstants.EJBModule, null, new String[] { "ejbs" }, null));
j2eeTypeMap.put(J2EETypeConstants.EntityBean,
new J2EEType(J2EETypeConstants.EntityBean, new String[] { "JndiName" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.MessageDrivenBean,
new J2EEType(J2EETypeConstants.MessageDrivenBean, new String[] { "JndiName" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.StatelessSessionBean,
new J2EEType(J2EETypeConstants.StatelessSessionBean, new String[] { "JndiName" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.StatefulSessionBean,
new J2EEType(J2EETypeConstants.StatefulSessionBean, new String[] { "JndiName" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.WebModule,
new J2EEType(J2EETypeConstants.WebModule, new String[] { /*"deploymentDescriptor"*/ }, new String[] { "servlets" }, null));
j2eeTypeMap.put(J2EETypeConstants.Servlet,
new J2EEType(J2EETypeConstants.Servlet, null, null, null));
j2eeTypeMap.put(J2EETypeConstants.ServiceModule,
new J2EEType(J2EETypeConstants.ServiceModule, new String[] { /*"deploymentDescriptor"*/ }, new String[] { "MBeans" }, null));
j2eeTypeMap.put(J2EETypeConstants.MBean,
new J2EEType(J2EETypeConstants.MBean, new String[] { "stateMonitored", "StateString" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.ResourceAdapterModule,
new J2EEType(J2EETypeConstants.ResourceAdapterModule, new String[] { /*"deploymentDescriptor"*/ }, new String[] { "resourceAdapters" }, null));
j2eeTypeMap.put(J2EETypeConstants.ResourceAdapter,
new J2EEType(J2EETypeConstants.ResourceAdapter, null, new String[] { "jcaResource" }, null));
j2eeTypeMap.put(J2EETypeConstants.JCAResource,
new J2EEType(J2EETypeConstants.JCAResource, null, new String[] { "connectionFactories" }, null));
j2eeTypeMap.put(J2EETypeConstants.JCAConnectionFactory,
new J2EEType(J2EETypeConstants.JCAConnectionFactory, null, new String[] { "managedConnectionFactory" }, null));
j2eeTypeMap.put(J2EETypeConstants.JCAManagedConnectionFactory,
new J2EEType(J2EETypeConstants.JCAManagedConnectionFactory, null, null, null));
j2eeTypeMap.put(J2EETypeConstants.JNDIResource,
new J2EEType(J2EETypeConstants.JNDIResource, new String[] { "StateString" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.JTAResource,
new J2EEType(J2EETypeConstants.JTAResource, null, null, null));
j2eeTypeMap.put(J2EETypeConstants.RMI_IIOPResource,
new J2EEType(J2EETypeConstants.RMI_IIOPResource, null, null, null));
j2eeTypeMap.put(J2EETypeConstants.JavaMailResource,
new J2EEType(J2EETypeConstants.JavaMailResource, new String[] { "StateString" }, null, null));
j2eeTypeMap.put(J2EETypeConstants.JMSResource,
new J2EEType(J2EETypeConstants.JMSResource, null, null, null));
}
/**
* Default CTOR
*/
public JSR77Command()
{
super("jsr77", "Print out JSR77 related information");
}
public void displayHelp()
{
PrintWriter out = context.getWriter();
out.println(desc);
out.println();
out.println("Print out JSR77 related information");
out.println();
out.println("Usage: " + 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]);
MBeanServerConnection server = super.getMBeanServer();
PrintWriter out = context.getWriter();
Set jsr77Domains = locateJSR77Domains(server);
for (Iterator i = jsr77Domains.iterator(); i.hasNext(); )
{
printJsr77Node(server, (ObjectName)i.next(), out, 0);
}
out.flush();
}
/**
* Locate the ObjectNames of any JSR77 registered domains
*
* @param server the mbean server to query
* @return a set of JSR77 ObjectNames (can be empty)
* @throws Exception in case of error
*/
private static Set locateJSR77Domains(MBeanServerConnection server) throws Exception
{
// The potential list of domain starting points. According to the
// spec we should be looking for *:j2eeType=J2EEDomain,* where
// the value of the "name" attribute matches the domain name.
ObjectName domainNameQuery = new ObjectName("*:j2eeType=J2EEDomain,*");
Set domainNames = server.queryNames(domainNameQuery, null);
for (Iterator i = domainNames.iterator(); i.hasNext(); )
{
ObjectName objectName = (ObjectName)i.next();
if (objectName.getDomain().equals(objectName.getKeyProperty("name")) == false)
{
// value of "name" attribute doesn't match the domain name
// remove from the domain set
i.remove();
}
}
return domainNames;
}
/**
* Generic traversal of a JSR77 node
*/
private static void printJsr77Node(MBeanServerConnection server, ObjectName node, PrintWriter out, int depth) throws Exception
{
String j2eeType = node.getKeyProperty("j2eeType");
String name = node.getKeyProperty("name");
J2EEType type = (J2EEType)j2eeTypeMap.get(j2eeType);
if (type == null)
{
println(out, depth, "Unknown j2eeType=" + j2eeType);
}
else
{
// print the node's j2eeType
println(out, depth, j2eeType + "=" + name);
// print attributes, if any
if (type.attributes != null)
{
AttributeList attrs = server.getAttributes(node, type.attributes);
for (int i = 0; i < attrs.size(); i++)
{
Attribute attr = (Attribute)attrs.get(i);
println(out, depth + 1, attr.getName() + "=" + attr.getValue());
}
}
// print out associations, if any
if (type.associations != null)
{
for (int i = 0; i < type.associations.length; i++)
{
String association = type.associations[i];
String[] children = (String[])server.getAttribute(node, association);
for (int j = 0; j < children.length; j++)
{
String child = children[j];
ObjectName subnode = new ObjectName(child);
String subnodeType = subnode.getKeyProperty("j2eeType");
String subnodeName = subnode.getKeyProperty("name");
println(out, depth + 1, subnodeType + "=" + subnodeName);
}
}
}
// recurse into subnodes, if any
if (type.containment != null)
{
for (int i = 0; i < type.containment.length; i++)
{
String containment = type.containment[i];
Object result = server.getAttribute(node, containment);
// this is probably a bug, it should be String
if (result instanceof ObjectName)
{
printJsr77Node(server, (ObjectName)result, out, depth + 1);
}
else if (result instanceof String)
{
printJsr77Node(server, new ObjectName((String)result), out, depth + 1);
}
else if (result instanceof String[])
{
String[] children = (String[])result;
for (int j = 0; j < children.length; j++)
{
String child = children[j];
ObjectName subnode = new ObjectName(child);
if (depth < 2)
out.println();
printJsr77Node(server, subnode, out, depth + 1);
}
}
}
}
}
}
/**
* Println with indentation
*/
private static void println(PrintWriter out, int depth, String msg)
{
for (int i = 0; i < depth; i++)
{
out.print(INDENT);
}
out.println(msg);
}
/**
* Simple data holder class to record information
* for the various JSR77 j2eeType(s)
*/
private static class J2EEType
{
public String type;
public String[] attributes;
public String[] containment;
public String[] associations;
public J2EEType(String type, String[] attributes, String[] containment, String[] associations)
{
this.type = type;
this.attributes = attributes;
this.containment = containment;
this.associations = associations;
}
}
}