Author: markt Date: Mon Jun 26 17:15:07 2017 New Revision: 1799952 URL: http://svn.apache.org/viewvc?rev=1799952&view=rev Log: Improve layout for CompositeData and TabularData when viewing via the JMX proxy servlet. Patch provided by Alexis Hassler. This closes #67
Modified: tomcat/trunk/java/org/apache/catalina/mbeans/MBeanDumper.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/mbeans/MBeanDumper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/MBeanDumper.java?rev=1799952&r1=1799951&r2=1799952&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mbeans/MBeanDumper.java (original) +++ tomcat/trunk/java/org/apache/catalina/mbeans/MBeanDumper.java Mon Jun 26 17:15:07 2017 @@ -18,12 +18,15 @@ package org.apache.catalina.mbeans; import java.lang.reflect.Array; import java.util.Set; +import java.util.StringJoiner; import javax.management.JMRuntimeException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.ObjectName; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.TabularData; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -67,18 +70,18 @@ public class MBeanDumper { MBeanAttributeInfo attrs[]=minfo.getAttributes(); Object value=null; - for (int i=0; i< attrs.length; i++) { - if (! attrs[i].isReadable()) continue; - String attName=attrs[i].getName(); + for (MBeanAttributeInfo attr : attrs) { + if (!attr.isReadable()) continue; + String attName = attr.getName(); if ("modelerType".equals(attName)) continue; - if (attName.indexOf('=') >=0 || - attName.indexOf(':') >=0 || - attName.indexOf(' ') >=0 ) { + if (attName.indexOf('=') >= 0 || + attName.indexOf(':') >= 0 || + attName.indexOf(' ') >= 0) { continue; } try { - value=mbeanServer.getAttribute(oname, attName); + value = mbeanServer.getAttribute(oname, attName); } catch (JMRuntimeException rme) { Throwable cause = rme.getCause(); if (cause instanceof UnsupportedOperationException) { @@ -102,7 +105,7 @@ public class MBeanDumper { " " + attName, t); continue; } - if (value==null) continue; + if (value == null) continue; String valueString; try { Class<?> c = value.getClass(); @@ -114,34 +117,33 @@ public class MBeanDumper { sb.append(CRLF); } for (int j = 0; j < len; j++) { - sb.append("\t"); Object item = Array.get(value, j); - if (item == null) { - sb.append("NULL VALUE"); - } else { - try { - sb.append(escape(item.toString())); - } - catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - sb.append("NON-STRINGABLE VALUE"); - } - } + sb.append(tableItemToString(item)); if (j < len - 1) { sb.append(CRLF); } } valueString = sb.toString(); } + else if (TabularData.class.isInstance(value)) { + TabularData tab = TabularData.class.cast(value); + StringJoiner joiner = new StringJoiner(CRLF); + joiner.add("TabularData[" + + tab.getTabularType().getRowType().getTypeName() + + "] of length " + tab.size()); + for (Object item : tab.values()) { + joiner.add(tableItemToString(item)); + } + valueString = joiner.toString(); + } else { - valueString = escape(value.toString()); + valueString = valueToString(value); } buf.append(attName); buf.append(": "); buf.append(valueString); buf.append(CRLF); - } - catch (Throwable t) { + } catch (Throwable t) { ExceptionUtils.handleThrowable(t); } } @@ -188,4 +190,40 @@ public class MBeanDumper { sb.append( value.substring(pos,end)); } + private static String tableItemToString(Object item) { + if (item == null) { + return "\t" + "NULL VALUE"; + } else { + try { + return "\t" + valueToString(item); + } + catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + return "\t" + "NON-STRINGABLE VALUE"; + } + } + } + + private static String valueToString(Object value) { + String valueString; + if (CompositeData.class.isInstance(value)) { + StringBuilder sb = new StringBuilder("{"); + + String sep = ""; + CompositeData composite = CompositeData.class.cast(value); + Set<String> keys = composite.getCompositeType().keySet(); + for (String key : keys) { + sb.append(sep) + .append(key) + .append("=") + .append(composite.get(key)); + sep = ", "; + } + sb.append("}"); + valueString = sb.toString(); + } else { + valueString = value.toString(); + } + return escape(valueString); + } } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1799952&r1=1799951&r2=1799952&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Jun 26 17:15:07 2017 @@ -58,6 +58,11 @@ <code>org.apache.catalina.valves</code> package so that the attributes are accessible via JMX. (markt) </fix> + <fix> + <bug>61216</bug>: Improve layout for <code>CompositeData</code> and + <code>TabularData</code> when viewing via the JMX proxy servlet. Patch + provided by Alexis Hassler. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org