📄 dynamicmbeanproxy.java
字号:
/* * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.tomcat.util.mx;import java.io.*;import java.net.*;import java.lang.reflect.*;import java.util.*;import javax.management.*;/** * DynamicMBean implementation using introspection to manage any * component that follows the bean/ant/Interceptor/Valve/Jk2 patterns. * * The class will wrap any component conforming to those patterns. * * @deprecated The same functionality ( and more ) is now available in * commons-modeler * @author Costin Manolache */public class DynamicMBeanProxy implements DynamicMBean { Object real; String name; Method methods[]=null; Hashtable attMap=new Hashtable(); // key: attribute val: getter method Hashtable getAttMap=new Hashtable(); // key: attribute val: setter method Hashtable setAttMap=new Hashtable(); // key: operation val: invoke method Hashtable invokeAttMap=new Hashtable(); static MBeanServer mserver=null; static Hashtable instances=new Hashtable(); /** Create a Dynamic proxy, using introspection to manage a * real tomcat component. */ public DynamicMBeanProxy() { } public void setName(String name ) { this.name=name; } public String getName() { if( name!=null ) return name; if( real==null ) return null; name=generateName(real.getClass()); return name; } /** If a name was not provided, generate a name based on the * class name and a sequence number. */ public static String generateName(Class realClass) { String name=realClass.getName(); name=name.substring( name.lastIndexOf( ".") + 1 ); Integer iInt=(Integer)instances.get(name ); int seq=0; if( iInt!= null ) { seq=iInt.intValue(); seq++; instances.put( name, new Integer( seq )); } else { instances.put( name, new Integer( 0 )); } return "name=" + name + ",seq=" + seq; } public static String createMBean( Object proxy, String domain, String name ) { try { DynamicMBeanProxy mbean=new DynamicMBeanProxy(); mbean.setReal( proxy ); if( name!=null ) { mbean.setName( name ); } else { mbean.setName( generateName( proxy.getClass() )); } return mbean.registerMBean( domain ); } catch( Throwable t ) { log.error( "Error creating mbean ", t ); return null; } } public String registerMBean( String domain ) { try { // XXX use aliases, suffix only, proxy.getName(), etc String fullName=domain + ": " + getName(); ObjectName oname=new ObjectName( fullName ); if( getMBeanServer().isRegistered( oname )) { log.info("Unregistering " + oname ); getMBeanServer().unregisterMBean( oname ); } getMBeanServer().registerMBean( this, oname ); return fullName; } catch( Throwable t ) { log.error( "Error creating mbean ", t ); return null; } } public static void unregisterMBean( Object o, String name ) { try { ObjectName oname=new ObjectName( name ); getMBeanServer().unregisterMBean( oname ); } catch( Throwable t ) { log.error( "Error unregistering mbean ", t ); } } public static MBeanServer getMBeanServer() { if( mserver==null ) { if( MBeanServerFactory.findMBeanServer(null).size() > 0 ) { mserver=(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0); } else { mserver=MBeanServerFactory.createMBeanServer(); } } return mserver; } private boolean supportedType( Class ret ) { return ret == String.class || ret == Integer.class || ret == Integer.TYPE || ret == Long.class || ret == Long.TYPE || ret == java.io.File.class || ret == Boolean.class || ret == Boolean.TYPE ; } /** Set the managed object. * * @todo Read an XML ( or .properties ) file containing descriptions, * generated from source comments * @todo Also filter methods based on config ( hide methods/attributes ) * @todo Adapters for notifications ( Interceptor hooks, etc ). */ public void setReal( Object realBean ) { real=realBean; } private void init() { if( methods!=null ) return; methods = real.getClass().getMethods(); for (int j = 0; j < methods.length; ++j) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -