/** * * Copyright 2003-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.geronimo.console.web.taglib; import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collections; import java.util.Hashtable; import java.util.List; import java.util.Set; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.QueryExp; import javax.servlet.jsp.JspWriter; import org.apache.geronimo.console.web.util.MBeanAttributesComparator; /** * This tag will display the contents of an MBean in a simple table of * name/value pairs. The style of the table can be controlled with CSS. */ public final class MBeanAttributesTag extends MBeanServerContextSupport { private Hashtable properties; private MBeanServerContextTag ctx; private ObjectInstance instance; private Object[] keys; private Set keySet; private ObjectName name; private MBeanServer server; public int doEndTag() { return EVAL_PAGE; } public int doStartTag() { ctx = getMBeanServerContext(); server = ctx.getMBeanServer(); JspWriter out = pageContext.getOut(); printMBeanProperties(out); printMBeanAttributes(out); return EVAL_BODY_INCLUDE; } /** * This seems like a very backwards way to do this. I don't know * that creating an ObjectName, using it to get an ObjectInstance * then creating another ObjectName is necessarily the way to go. * */ private String getDomain() { try { ObjectName mbeanName = new ObjectName(getMBeanName()); QueryExp query = null; Set results = server.queryMBeans(mbeanName, query); instance = (ObjectInstance) results.iterator().next(); name = instance.getObjectName(); return name.getDomain(); } catch (MalformedObjectNameException e) { return "No object to introspect. Choose one from the MBean Stack View."; } } /** * This gets the value of the MBeanName request parameter. If it * Doesn't find anything, it returns null. */ private String getMBeanName() { String s = pageContext.getRequest().getParameter("MBeanName"); if (s == null || s == "") { return null; } return s; } private void printMBeanProperties(JspWriter out) { try { //String mbeanName; //out.println("<strong>MBean Name </strong>" + getMBeanName()); out.println("<table cellpadding=\"0\" cellspacing=\"0\">"); out.println("\t<tr class=\"head\">"); out.println("\t\t<td class=\"head\" colspan=\"3\">" + "MBean Properties</td>"); out.println("\t</tr>"); out.println("\t<tr class=\"one\">"); out.println("\t\t<td class=\"name\">MBean Domain</td>"); out.println("\t\t<td class=\"center\">=</td>"); out.println("\t\t<td class=\"value\">" + getDomain() + "</td>"); out.println("\t</tr>"); printMBeanPropertiesStack(out); out.println("</table>"); } catch (IOException e) { e.printStackTrace(); } } private void printMBeanPropertiesStack(JspWriter out) { properties = name.getKeyPropertyList(); keySet = properties.keySet(); keys = toList(keySet).toArray(); try { //out.println("Hello"); String key; String property; String trClass = "one"; for (int i = 0; i < keys.length; i++) { key = (String) keys[i]; property = (String) name.getKeyProperty(key); if (i % 2 == 0) { trClass = "two"; } else if (i % 2 == 1) { trClass = "one"; } out.println("\t<tr class=\"" + trClass + "\">"); out.println("\t\t<td class=\"name\">" + key + "</td>"); out.println("\t\t<td class=\"center\">=</td>"); out.println("\t\t<td class=\"value\">" + URLDecoder.decode(property, "UTF-8") + "</td>"); out.println("\t</tr>"); } } catch (IOException e) { e.printStackTrace(); } } private void printMBeanAttributes(JspWriter out) { try { //String mbeanName; //out.println("<strong>MBean Name </strong>" + getMBeanName()); out.println("<table cellpadding=\"0\" cellspacing=\"0\">"); out.println("\t<tr class=\"head\">"); out.println("\t\t<td class=\"head\" colspan=\"3\">" + "MBean Attributes & Info</td>"); out.println("\t</tr>"); printMBeanAttributesStack(out); out.println("</table>"); } catch (IOException e) { e.printStackTrace(); } } private void printMBeanAttributesStack(JspWriter out) { try { MBeanInfo info = server.getMBeanInfo(name); MBeanAttributeInfo[] attributes = info.getAttributes(); String className = info.getClassName(); String description = info.getDescription(); out.println("\t<tr class=\"one\">"); out.println("\t\t<td class=\"name\">Class Name</td>"); out.println("\t\t<td class=\"center\">=</td>"); out.println("\t\t<td class=\"value\">" + className + "</td>"); out.println("\t</tr>"); out.println("\t<tr class=\"two\">"); out.println("\t\t<td class=\"name\">Description</td>"); out.println("\t\t<td class=\"center\">=</td>"); out.println("\t\t<td class=\"value\">" + description + "</td>"); out.println("\t</tr>"); String attributeName = "name"; String value = "value"; String trClass = "one"; for (int i = 0; i < attributes.length; i++) { attributeName = attributes[i].getName(); //value = attributes[i].toString(); if (attributes[i].isReadable()) { Object attrObj = server.getAttribute(name, attributeName); if ( attrObj == null ) { continue; } value = attrObj.toString(); if (i % 2 == 0) { trClass = "one"; } else if (i % 2 == 1) { trClass = "two"; } out.println("\t<tr class=\"" + trClass + "\">"); out.println("\t\t<td class=\"name\">" + attributeName + "</td>"); out.println("\t\t<td class=\"center\">=</td>"); out.println("\t\t<td class=\"value\">" + URLDecoder.decode(value, "UTF-8") + "</td>"); out.println("\t</tr>"); } } } catch (Exception e) { e.printStackTrace(); } } private List toList(Set set) { List list = new ArrayList(); MBeanAttributesComparator comp = new MBeanAttributesComparator(); list.addAll(set); Collections.sort(list, comp); return list; } }