Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common Development
   * and Distribution License("CDDL") (collectively, the "License").  You
   * may not use this file except in compliance with the License.  You can
  * obtain a copy of the License at
  * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
  * or packager/legal/LICENSE.txt.  See the License for the specific
  * language governing permissions and limitations under the License.
  *
  * When distributing the software, include this License Header Notice in each
  * file and include the License file at packager/legal/LICENSE.txt.
  *
  * GPL Classpath Exception:
  * Oracle designates this particular file as subject to the "Classpath"
  * exception as provided by Oracle in the GPL Version 2 section of the License
  * file that accompanied this code.
  *
  * Modifications:
  * If applicable, add the following below the License Header, with the fields
  * enclosed by brackets [] replaced by your own identifying information:
  * "Portions Copyright [year] [name of copyright owner]"
  *
  * Contributor(s):
  * If you wish your version of this file to be governed by only the CDDL or
  * only the GPL Version 2, indicate your decision by adding "[Contributor]
  * elects to include this software in this distribution under the [CDDL or GPL
  * Version 2] license."  If you don't indicate a single choice of license, a
  * recipient has the option to distribute your version of this file under
  * either the CDDL, the GPL Version 2 or to extend the choice of license to
  * its licensees as provided above.  However, if you add GPL Version 2 code
  * and therefore, elected the GPL Version 2 license, then the option applies
  * only if the new code is made subject to such option by the copyright
  * holder.
  *
  *
  * This file incorporates work covered by the following copyright and
  * permission notice:
  *
  * Copyright 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.tomcat.util.mx;
 
 import java.io.*;
 import java.net.*;
 import java.util.*;
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(s):
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
 
     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;
    }
    public String getName() {
        if!=null ) return ;
        if==null ) return null;
        =generateName(.getClass());
        return ;
    }

    
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.substringname.lastIndexOf".") + 1 );
        Integer iInt=(Integer).get(name );
        int seq=0;
        if (iInt != null) {
            seq = iInt.intValue();
            seq++;
            .put(name, Integer.valueOf(seq));
        }
        else {
            .put(name, Integer.valueOf(0));
        }
        return "name=" + name + ",seq=" + seq;
    }
    public static String createMBeanObject proxyString domainString name ) {
        try {
            DynamicMBeanProxy mbean=new DynamicMBeanProxy();
            mbean.setRealproxy );
            ifname!=null ) {
                mbean.setNamename );
            } else {
                mbean.setNamegenerateNameproxy.getClass() ));
            }
            return mbean.registerMBeandomain );
        } catchThrowable t ) {
            .error"Error creating mbean "t );
            return null;
        }
    }
    
    public String registerMBeanString domain ) {
        try {
            // XXX use aliases, suffix only, proxy.getName(), etc
            String fullName=domain + ": " +  getName();
            ObjectName oname=new ObjectNamefullName );
            if(  getMBeanServer().isRegisteredoname )) {
                .info("Unregistering " + oname );
                getMBeanServer().unregisterMBeanoname );
            }
            getMBeanServer().registerMBeanthisoname );
            return fullName;
        } catchThrowable t ) {
            .error"Error creating mbean "t );
            return null;
        }
    }
    public static void unregisterMBeanObject oString name ) {
        try {
            ObjectName oname=new ObjectNamename );
            getMBeanServer().unregisterMBeanoname );
        } catchThrowable t ) {
            .error"Error unregistering mbean "t );
        }
    }
    public static MBeanServer getMBeanServer() {
        if==null ) {
            if( MBeanServerFactory.findMBeanServer(null).size() > 0 ) {
                =(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0);
            } else {
                =MBeanServerFactory.createMBeanServer();
            }
        }
        
        return ;
    }
    private boolean supportedTypeClass ret ) {
        return ret == String.class ||
            ret == Integer.class ||
            ret == . ||
            ret == Long.class ||
            ret == . ||
            ret == java.io.File.class ||
            ret == Boolean.class ||
            ret == . 
            ; 
    }
    
    
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 setRealObject realBean ) {
        =realBean;
    }
    private void init() {
        if!=null ) return;
         = .getClass().getMethods();
        for (int j = 0; j < .; ++j) {
            String name=[j].getName();
            
            ifname.startsWith"get" ) ) {
                if[j].getParameterTypes().length != 0 ) {
                    continue;
                }
                if( ! Modifier.isPublic[j].getModifiers() ) ) {
                    //log.debug("not public " + methods[j] );
                    continue;
                }
                Class ret=[j].getReturnType();
                if( ! supportedTyperet ) ) {
                    if.isDebugEnabled() )
                        .debug("Unsupported " + ret );
                    continue;
                }
                name=unCapitalizename.substring(3));
                .putname[j] );
                // just a marker, we don't use the value 
                .putname[j] );
            } else ifname.startsWith"is" ) ) {
                // not used in our code. Add later
            } else ifname.startsWith"set" ) ) {
                Class params[]=[j].getParameterTypes();
                ifparams.length != 1 ) {
                    continue;
                }
                if( ! Modifier.isPublic[j].getModifiers() ) )
                    continue;
                Class ret=params[0];
                if( ! supportedTyperet ) ) {
                    continue;
                }
                name=unCapitalizename.substring(3));
                .putname[j] );
                .putname[j] );
            } else {
                if[j].getParameterTypes().length != 0 ) {
                    continue;
                }
                if[j].getDeclaringClass() == Object.class )
                    continue;
                if( ! Modifier.isPublic[j].getModifiers() ) )
                    continue;
                .putname[j]);
            }
        }
    }

    

Todo:
Find if the 'className' is the name of the MBean or the real class ( I suppose first )
Todo:
Read (optional) descriptions from a .properties, generated from source
Todo:
Deal with constructors
    public MBeanInfo getMBeanInfo() {
        if==null ) {
            init();
        }
        try {
            MBeanAttributeInfo attributes[]=new MBeanAttributeInfo[.size()];
            Enumeration en=.keys();
            int i=0;
            whileen.hasMoreElements() ) {
                String name=(String)en.nextElement();
                attributes[i++]=new MBeanAttributeInfo(name"Attribute " + name ,
                                                       (Method).get(name),
                                                       (Method).get(name));
            }
            
            MBeanOperationInfo operations[]=new MBeanOperationInfo[.size()];
            
            en=.keys();
            i=0;
            whileen.hasMoreElements() ) {
                String name=(String)en.nextElement();
                Method m=(Method).get(name);
                ifm!=null && name != null ) {
                    operations[i++]=new MBeanOperationInfo(namem);
                } else {
                    if (.isDebugEnabled())
                        .debug("Null arg " + name + " " + m );
                }
            }
            
            if.isDebugEnabled() )
                .debug(.getClass().getName() +  " getMBeanInfo()");
            
            return new MBeanInfo.getClass().getName(), /* ??? */
                                  "MBean for " + getName(),
                                  attributes,
                                  new MBeanConstructorInfo[0],
                                  operations,
                                  new MBeanNotificationInfo[0]);
        } catchException ex ) {
            ex.printStackTrace();
            return null;
        }
    }
    static final Object[] NO_ARGS_PARAM=new Object[0];
    
    public Object getAttribute(String attribute)
    {
        if==null ) init();
        Method m=(Method).getattribute );
        ifm==null ) throw new AttributeNotFoundException(attribute);
        try {
            if.isDebugEnabled() )
                .debug(.getClass().getName() +  " getAttribute " + attribute);
            return m.invoke( );
        } catchIllegalAccessException ex ) {
            ex.printStackTrace();
            throw new MBeanExceptionex );
        } catchInvocationTargetException ex1 ) {
            ex1.printStackTrace();
            throw new MBeanExceptionex1 );
        }
    }
    
    public void setAttribute(Attribute attribute)
    {
        if==null ) init();
        // XXX Send notification !!!
        Method m=(Method).getattribute.getName() );
        ifm==null ) throw new AttributeNotFoundException(attribute.getName());
        try {
            .info(.getClass().getName() +  "setAttribute " + attribute.getName());
            m.invoke(new Object[] { attribute.getValue() } );
        } catchIllegalAccessException ex ) {
            ex.printStackTrace();
            throw new MBeanExceptionex );
        } catchInvocationTargetException ex1 ) {
            ex1.printStackTrace();
            throw new MBeanExceptionex1 );
        }
    }
    
    
Invoke a method. Only no param methods are supported at the moment ( init, start, execute, etc ) ( that's the most common pattern we have in tomcat/ant/etc )

Todo:
Implement invoke for methods with more arguments.
    public Object invoke(String methodObject[] argumentsString[] params)
        throws MBeanExceptionReflectionException
    {
        if==null ) init();
        Method m=(Method).getmethod );
        ifm==null ) return null;
        try {
            .info(.getClass().getName() +  "invoke " + m.getName());
            return m.invoke( );
        } catchIllegalAccessException ex ) {
            throw new MBeanExceptionex );
        } catchInvocationTargetException ex1 ) {
            throw new MBeanExceptionex1 );
        }
    }
    // -------------------- Auxiliary methods --------------------
    
    public AttributeList setAttributes(AttributeList attributes) {
        Iterator attE=attributes.iterator();
        whileattE.hasNext() ) {
            Attribute att=(Attribute)attE.next();
            try {
                setAttributeatt );
            } catchException ex ) {
                ex.printStackTrace();
            }
        }
        return attributes;
    }
    public AttributeList getAttributes(String[] attributes) {
        AttributeList al=new AttributeList();
        ifattributes==null ) return null;
        
        forint i=0; i<attributes.lengthi++ ) {
            try {
                Attribute att=new Attributeattributes[i], getAttributeattributes[i] ));
                al.addatt );
            } catchException ex ) {
                ex.printStackTrace();
            }
        }
        return al;
    }
    
    // -------------------- Utils --------------------
    public static String unCapitalize(String name) {
	if (name == null || name.length() == 0) {
	    return name;
	}
	char chars[] = name.toCharArray();
	chars[0] = Character.toLowerCase(chars[0]);
	return new String(chars);
    }
    private static com.sun.org.apache.commons.logging.Log log=
        com.sun.org.apache.commons.logging.LogFactory.getLogDynamicMBeanProxy.class );
New to GrepCode? Check out our FAQ X