Author: rjung Date: Tue Jan 10 13:37:25 2012 New Revision: 1229536 URL: http://svn.apache.org/viewvc?rev=1229536&view=rev Log: Add output of MBean details to TestRegistration in case unexpected MBeans were found.
Added: tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java (with props) Modified: tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java Added: tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java?rev=1229536&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java (added) +++ tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java Tue Jan 10 13:37:25 2012 @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.catalina.mbeans; + +import java.lang.reflect.Array; +import java.util.Iterator; +import java.util.Set; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.ExceptionUtils; + +/** + * General helper to dump MBean contents to the log. + * + */ +public class MBeanDumper { + + private static Log log = LogFactory.getLog(MBeanDumper.class); + + /** + * The following code to dump MBeans has been copied from JMXProxyServlet. + * + */ + public static void listBeans(MBeanServer mbeanServer, Set<ObjectName> names) + { + + Iterator<ObjectName> it=names.iterator(); + while( it.hasNext()) { + ObjectName oname=it.next(); + log.info( "Name: " + oname.toString()); + + try { + MBeanInfo minfo=mbeanServer.getMBeanInfo(oname); + // can't be null - I think + String code=minfo.getClassName(); + if ("org.apache.commons.modeler.BaseModelMBean".equals(code)) { + code=(String)mbeanServer.getAttribute(oname, "modelerType"); + } + log.info("modelerType: " + code); + + 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(); + if( "modelerType".equals( attName)) continue; + if( attName.indexOf( "=") >=0 || + attName.indexOf( ":") >=0 || + attName.indexOf( " ") >=0 ) { + continue; + } + + try { + value=mbeanServer.getAttribute(oname, attName); + } catch( Throwable t) { + log.error("Error getting attribute " + oname + + " " + attName + " " + t.toString(), t); + continue; + } + if( value==null ) continue; + String valueString; + try { + Class<?> c = value.getClass(); + if (c.isArray()) { + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder("Array[" + + c.getComponentType().getName() + "] of length " + len); + if (len > 0) { + sb.append("\r\n"); + } + 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"); + } + } + if (j < len - 1) { + sb.append("\r\n"); + } + } + valueString = sb.toString(); + } + else { + valueString = escape(value.toString()); + } + log.info( attName + ": " + valueString); + } + catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + } + } + } catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + } + log.info(""); + } + + } + + public static String escape(String value) { + // The only invalid char is \n + // We also need to keep the string short and split it with \nSPACE + // XXX TODO + int idx=value.indexOf( "\n" ); + if( idx < 0 ) return value; + + int prev=0; + StringBuilder sb=new StringBuilder(); + while( idx >= 0 ) { + appendHead(sb, value, prev, idx); + + sb.append( "\\n\n "); + prev=idx+1; + if( idx==value.length() -1 ) break; + idx=value.indexOf('\n', idx+1); + } + if( prev < value.length() ) + appendHead( sb, value, prev, value.length()); + return sb.toString(); + } + + private static void appendHead( StringBuilder sb, String value, int start, int end) { + if (end < 1) return; + + int pos=start; + while( end-pos > 78 ) { + sb.append( value.substring(pos, pos+78)); + sb.append( "\n "); + pos=pos+78; + } + sb.append( value.substring(pos,end)); + } + +} Propchange: tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/trunk/test/org/apache/catalina/mbeans/MBeanDumper.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java?rev=1229536&r1=1229535&r2=1229536&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java (original) +++ tomcat/trunk/test/org/apache/catalina/mbeans/TestRegistration.java Tue Jan 10 13:37:25 2012 @@ -131,8 +131,13 @@ public class TestRegistration extends To @Test public void testMBeanDeregistration() throws Exception { final MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + // Verify there are no Catalina or Tomcat MBeans Set<ObjectName> onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null); - assertEquals("Remaining: " + onames, 0, onames.size()); + MBeanDumper.listBeans(mbeanServer, onames); + assertEquals("Unexpected: " + onames, 0, onames.size()); + onames = mbeanServer.queryNames(new ObjectName("Tomcat:*"), null); + MBeanDumper.listBeans(mbeanServer, onames); + assertEquals("Unexpected: " + onames, 0, onames.size()); final Tomcat tomcat = getTomcatInstance(); final File contextDir = new File(getTemporaryDirectory(), "webappFoo"); @@ -145,6 +150,7 @@ public class TestRegistration extends To // Verify there are no Catalina MBeans onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null); + MBeanDumper.listBeans(mbeanServer, onames); assertEquals("Found: " + onames, 0, onames.size()); // Verify there are the correct Tomcat MBeans @@ -204,8 +210,10 @@ public class TestRegistration extends To // There should be no Catalina MBeans and no Tomcat MBeans onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null); + MBeanDumper.listBeans(mbeanServer, onames); assertEquals("Remaining: " + onames, 0, onames.size()); onames = mbeanServer.queryNames(new ObjectName("Tomcat:*"), null); + MBeanDumper.listBeans(mbeanServer, onames); assertEquals("Remaining: " + onames, 0, onames.size()); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org