/*
* 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.plugins;
import org.jboss.console.manager.interfaces.ManageableResource;
import org.jboss.console.manager.interfaces.TreeNode;
import org.jboss.console.manager.interfaces.TreeNodeMenuEntry;
import org.jboss.console.manager.interfaces.impl.GraphMBeanAttributeAction;
import org.jboss.console.manager.interfaces.impl.SimpleTreeNodeMenuEntryImpl;
import org.jboss.console.manager.interfaces.impl.HttpLinkTreeAction;
import org.jboss.console.plugins.helpers.AbstractPluginWrapper;
import org.jboss.console.plugins.helpers.jmx.DomainData;
import org.jboss.console.plugins.helpers.jmx.MBeanData;
import org.jboss.console.plugins.helpers.jmx.Server;
import javax.management.MBeanAttributeInfo;
import javax.management.ObjectName;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.HashSet;
/**
* As the number of MBeans is very big, we use a real Java class which is far
* faster than beanshell
*
* @see <related>
*
* @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>.
* @version $Revision: 81010 $
*
* <p><b>Revisions:</b>
*
* <p><b>2 janv. 2003 Sacha Labourey:</b>
* <ul>
* <li> First implementation </li>
* </ul>
*/
public class MBeansLister
extends AbstractPluginWrapper
{
private static HashSet graphableClasses = new HashSet();
static
{
graphableClasses.add("java.lang.Integer");
graphableClasses.add("java.lang.Short");
graphableClasses.add("java.lang.Double");
graphableClasses.add("java.lang.Float");
graphableClasses.add("java.lang.Long");
graphableClasses.add("int");
graphableClasses.add("short");
graphableClasses.add("double");
graphableClasses.add("float");
graphableClasses.add("long");
}
public MBeansLister () { super(); }
TreeNode createJmxAttributeSubResource(MBeanAttributeInfo attr, ObjectName mbeanName) throws Exception
{
TreeNodeMenuEntry[] entries = null;
if (graphableClasses.contains(attr.getType()))
{
SimpleTreeNodeMenuEntryImpl entry = new SimpleTreeNodeMenuEntryImpl("graph", new GraphMBeanAttributeAction(mbeanName, attr.getName()));
SimpleTreeNodeMenuEntryImpl entry2 = new SimpleTreeNodeMenuEntryImpl("create monitor", new HttpLinkTreeAction(
"/web-console/createThresholdMonitor.jsp?attribute=" + attr.getName() + "&objectName=" + encode(mbeanName.toString())));
SimpleTreeNodeMenuEntryImpl entry3 = new SimpleTreeNodeMenuEntryImpl("create snapshot", new HttpLinkTreeAction(
"/web-console/createSnapshot.jsp?attribute=" + attr.getName() + "&objectName=" + encode(mbeanName.toString())));
entries = new TreeNodeMenuEntry[3];
entries[0] = entry;
entries[1] = entry2;
entries[2] = entry3;
}
else if (attr.getType().equals("String") || attr.getType().equals("java.lang.String"))
{
SimpleTreeNodeMenuEntryImpl entry = new SimpleTreeNodeMenuEntryImpl("create monitor", new HttpLinkTreeAction(
"/web-console/createStringThresholdMonitor.jsp?attribute=" + attr.getName() + "&objectName=" + encode(mbeanName.toString())));
entries = new TreeNodeMenuEntry[1];
entries[0] = entry;
}
return createTreeNode(
attr.getName(),
attr.getDescription(),
"images/container.gif",
"/jmx-console/HtmlAdaptor?action=inspectMBean&name=" + encode("" + mbeanName), // Default URL
entries,
null,
null
//name,
//data.getClassName() TOO HEAVY TO GENERATE RESOURCE LOOKUP FOR EACH MBEAN!
);
}
TreeNode createJmxMBeanSubResources (MBeanData data) throws Exception
{
String name = "" + data.getObjectName();
String displayName = data.getName ();
if (displayName == null)
{
// Get ride of the domain name because it is already is the header
int index = name.indexOf( ":" );
displayName = ( index >= 0 ) ? name.substring( index + 1 ) : name;
}
MBeanAttributeInfo[] attributes = data.getMetaData().getAttributes();
TreeNode[] attrNodes = new TreeNode[attributes.length];
for (int i = 0; i < attributes.length; i++)
{
attrNodes[i] = createJmxAttributeSubResource(attributes[i], data.getObjectName());
}
return createTreeNode (
displayName, // name
name, // description
"images/server.gif", // Icon URL
"/jmx-console/HtmlAdaptor?action=inspectMBean&name=" + encode(name), // Default URL
null,
attrNodes,
null
//name,
//data.getClassName() TOO HEAVY TO GENERATE RESOURCE LOOKUP FOR EACH MBEAN!
);
}
TreeNode[] createJmxDomainsSubNodes () throws Exception
{
Iterator mbeans = Server.getDomainData(null);
TreeNode[] result = null;
ArrayList domains = new ArrayList ();
while( mbeans.hasNext() )
{
DomainData domainData = (DomainData) mbeans.next();
String domainName = domainData.getDomainName();
MBeanData[] data = domainData.getData();
TreeNode[] subResources = new TreeNode[data.length];
for(int d = 0; d < data.length; d ++)
{
subResources[d] = createJmxMBeanSubResources (data[d]);
}
TreeNodeMenuEntry[] menu = createMenus (new String[]
{
"Number of MBeans: " + data.length, null,
}
);
domains.add(createTreeNode (
domainName, // name
"MBeans for domain " + domainName, // description
"images/serviceset.gif", // Icon URL
null, // Default URL
menu, // menu
subResources, // sub nodes
null // Sub-Resources
)
);
}
if (domains.size() == 0)
{
result = null;
}
else
{
result = (TreeNode[]) domains.toArray(new TreeNode[domains.size()]);
}
return result;
}
protected TreeNode getTreeForResource(String profile, ManageableResource resource)
{
try
{
return createTreeNode (
"JMX MBeans", // name
"Display all JMX MBeans", // description
"images/flash.gif", // Icon URL
"/jmx-console/HtmlAdaptor?action=displayMBeans", // Default URL
null,
createJmxDomainsSubNodes (), // sub nodes
null // Sub-Resources
);
}
catch (Exception e)
{
e.printStackTrace ();
return null;
}
}
}