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: [email protected]
For additional commands, e-mail: [email protected]