You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gi...@apache.org on 2005/12/26 20:31:06 UTC
svn commit: r359088 -
/cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java
Author: giacomo
Date: Mon Dec 26 11:30:43 2005
New Revision: 359088
URL: http://svn.apache.org/viewcvs?rev=359088&view=rev
Log:
Added javadocs, pretty printed, and formatted
Modified:
cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java
Modified: cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java?rev=359088&r1=359087&r2=359088&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/util/JMXUtils.java Mon Dec 26 11:30:43 2005
@@ -1,15 +1,16 @@
/*
- * Copyright 1999-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.
+ * Copyright 2002-2005 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
- *
+ *
+ * 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.
+ * 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.
*/
@@ -19,6 +20,7 @@
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.cocoon.components.ComponentInfo;
+
import org.apache.cocoon.core.container.CoreServiceManager;
import java.lang.reflect.Constructor;
@@ -36,15 +38,20 @@
import javax.management.ObjectInstance;
import javax.management.ObjectName;
+
/**
* Utility methods for JMX
*
- */
+ * @version $Id$
+ */
public class JMXUtils {
-
+ //~ Static fields/initializers ---------------------------------------------
+
/** The {@link MBeanServer} first found */
private static MBeanServer mbeanServer = getInitialMBeanServer();
-
+
+ //~ Constructors -----------------------------------------------------------
+
/**
* Private c'tor: its a Utility class
*/
@@ -52,209 +59,318 @@
super();
}
- /** Get the ev. found {@link MBeanServer} */
+ //~ Methods ----------------------------------------------------------------
+
+ /**
+ * Find a JMX domain name at various places
+ *
+ * @param pJmxDomain Default JMX domain name
+ * @param serviceManager The ServiceManager used
+ *
+ * @return The JMX domain name
+ */
+ public static String findJmxDomain(final String pJmxDomain,
+ final ServiceManager serviceManager) {
+ // try to find a JMX domain name first from this component configuration give as parameter
+ String jmxDomain = pJmxDomain;
+
+ if(jmxDomain == null) {
+ // next from the CoreServiceManager managing this component
+ if((serviceManager != null) &&
+ serviceManager instanceof CoreServiceManager) {
+ // next from the CoreServiceManager managing this component
+ jmxDomain = ((CoreServiceManager)serviceManager).getJmxDefaultDomain();
+ } else {
+ // otherwise use default one
+ jmxDomain = CoreServiceManager.JMX_DEFAULT_DOMAIN_NAME;
+ }
+ }
+
+ return jmxDomain;
+ }
+
+ /**
+ * Find or construct a JMX object name at various places (excluding the JMX domain)
+ *
+ * @param pJmxName Default JMX object name
+ * @param pClassName Class name to use if JMX object name has to be constructed
+ *
+ * @return The JMX obejct name (excluding the JMX domain name
+ */
+ public static String findJmxName(final String pJmxName,
+ final String pClassName) {
+ String jmxName = pJmxName;
+ final String className =
+ ((pClassName == null) ? "unknown" : pClassName);
+
+ if(jmxName == null) {
+ // otherwise construct one from the service class name
+ final StringBuffer sb = new StringBuffer();
+ final List groups = new ArrayList();
+ int i = className.indexOf('.');
+ int j = 0;
+
+ while(i > 0) {
+ groups.add(className.substring(j, i));
+ j = i + 1;
+ i = className.indexOf('.', i + 1);
+ }
+
+ groups.add(className.substring(j));
+
+ for(i = 0; i < (groups.size() - 1); i++) {
+ sb.append("group");
+
+ if(i > 0) {
+ sb.append(i);
+ }
+
+ sb.append('=');
+ sb.append(groups.get(i));
+ sb.append(',');
+ }
+
+ sb.append("item=").append(groups.get(groups.size() - 1));
+ jmxName = sb.toString();
+ }
+
+ return jmxName;
+ }
+
+ /**
+ * generate a default JMX object name (excluding JMX domain name) from a FQCN
+ *
+ * @param clazz The class name
+ *
+ * @return The generated JMX object name (excluding JMX domain name)
+ */
+ public static String genDefaultJmxName(final Class clazz) {
+ return genDefaultJmxName(clazz.getName());
+ }
+
+ /**
+ * generate a default JMX object name (excluding JMX domain name) from a FQCN
+ *
+ * @param className The class name
+ *
+ * @return The generated JMX object name (excluding JMX domain name)
+ */
+ public static String genDefaultJmxName(final String className) {
+ final StringBuffer nameBuf = new StringBuffer();
+ final List groups = new ArrayList();
+ int i = className.indexOf('.');
+ int j = 0;
+
+ while(i > 0) {
+ groups.add(className.substring(j, i));
+ j = i + 1;
+ i = className.indexOf('.', i + 1);
+ }
+
+ groups.add(className.substring(j));
+
+ for(i = 0; i < (groups.size() - 1); i++) {
+ nameBuf.append("group");
+
+ if(i > 0) {
+ nameBuf.append(i);
+ }
+
+ nameBuf.append('=');
+ nameBuf.append(groups.get(i));
+ nameBuf.append(',');
+ }
+
+ nameBuf.append("item=").append(groups.get(groups.size() - 1));
+
+ return nameBuf.toString();
+ }
+
+ /**
+ * Get the ev. found {@link MBeanServer}
+ *
+ * @return DOCUMENT ME!
+ */
public static MBeanServer getMBeanServer() {
return JMXUtils.mbeanServer;
}
-
+
/**
* Setup a component for possible JMX managability
+ *
* @param bean The bean to estabilsh JMX for
* @param info The component info
+ *
+ * @return DOCUMENT ME!
*/
public static ObjectInstance setupJmxFor(final Object bean,
- final ComponentInfo info)
- {
- return setupJmxFor(bean, info, new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
+ final ComponentInfo info) {
+ return setupJmxFor(bean, info,
+ new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
}
/**
* Setup a component for possible JMX managability
+ *
* @param bean The bean to estabilsh JMX for
* @param info The component info
* @param logger The Logger
+ *
* @return
*/
public static ObjectInstance setupJmxFor(final Object bean,
final ComponentInfo info,
- final Logger logger)
- {
- if (getMBeanServer() != null) {
+ final Logger logger) {
+ if(getMBeanServer() != null) {
final Class beanClass = bean.getClass();
final String beanClassName = beanClass.getName();
final String mbeanClassName = beanClassName + "MBean";
ObjectName on = null;
Object comp = null;
+
try {
// try to find a MBean for bean
- final Class mbeanClass = beanClass.getClassLoader().loadClass(mbeanClassName);
- final Constructor ctor = mbeanClass.getConstructor(new Class[] {beanClass});
- final Object mbean = ctor.newInstance( new Object[] {bean});
-
+ final Class mbeanClass =
+ beanClass.getClassLoader().loadClass(mbeanClassName);
+ final Constructor ctor =
+ mbeanClass.getConstructor(new Class[] {beanClass});
+ final Object mbean = ctor.newInstance(new Object[] {bean});
+
// see if MBean supplies some JMX ObjectName parts
- final String mBeanSuppliedJmxDomain = callGetter(mbean, "getJmxDomain", logger);
- final String mBeanSuppliedJmxName = callGetter(mbean, "getJmxName", logger);
- final String mBeanSuppliedJmxNameAdditions = callGetter(mbean, "getJmxNameAddition", logger);
+ final String mBeanSuppliedJmxDomain =
+ callGetter(mbean, "getJmxDomain", logger);
+ final String mBeanSuppliedJmxName =
+ callGetter(mbean, "getJmxName", logger);
+ final String mBeanSuppliedJmxNameAdditions =
+ callGetter(mbean, "getJmxNameAddition", logger);
// construct a JMX ObjectName instance
final StringBuffer objectNameBuf = new StringBuffer();
+
if(mBeanSuppliedJmxDomain != null) {
objectNameBuf.append(mBeanSuppliedJmxDomain);
} else {
objectNameBuf.append(info.getJmxDomain());
}
+
objectNameBuf.append(':');
+
if(mBeanSuppliedJmxName != null) {
objectNameBuf.append(mBeanSuppliedJmxName);
- } else if (info.getConfiguration().getAttribute( CoreServiceManager.JMX_NAME_ATTR_NAME, null ) != null) {
- objectNameBuf.append(info.getConfiguration().getAttribute(CoreServiceManager.JMX_NAME_ATTR_NAME,null));
+ } else if(info.getConfiguration()
+ .getAttribute(CoreServiceManager.JMX_NAME_ATTR_NAME,
+ null) != null) {
+ objectNameBuf.append(info.getConfiguration()
+ .getAttribute(CoreServiceManager.JMX_NAME_ATTR_NAME,
+ null));
} else {
// if we do not have the name parts we'll construct one from the bean class name
objectNameBuf.append(genDefaultJmxName(beanClass));
- }
+ }
+
if(mBeanSuppliedJmxNameAdditions != null) {
objectNameBuf.append(',');
objectNameBuf.append(mBeanSuppliedJmxNameAdditions);
}
+
on = new ObjectName(objectNameBuf.toString());
+
int instance = 1;
+
while(mbeanServer.isRegistered(on)) {
instance++;
- on = new ObjectName(objectNameBuf.toString() + ",instance=" + instance);
+ on = new ObjectName(objectNameBuf.toString() +
+ ",instance=" + instance);
}
if(logger.isDebugEnabled()) {
- logger.debug("Establishing JMX support for bean " + bean.getClass().getName() +
- ",info.serviceClassName=" + info.getServiceClassName() );
+ logger.debug("Establishing JMX support for bean " +
+ bean.getClass().getName() +
+ ",info.serviceClassName=" +
+ info.getServiceClassName());
}
- return mbeanServer.registerMBean(mbean,on);
- } catch (final ClassNotFoundException cnfe) {
+
+ return mbeanServer.registerMBean(mbean, on);
+ } catch(final ClassNotFoundException cnfe) {
// happens if a component doesn't have a MBean to support it for management
if(logger.isDebugEnabled()) {
- logger.debug( "Class "+beanClass.getName()+" doesn't have a supporting MBean called " + mbeanClassName );
+ logger.debug("Class " + beanClass.getName() +
+ " doesn't have a supporting MBean called " +
+ mbeanClassName);
}
- } catch (final NoSuchMethodException nsme) {
- logger.warn( "MBean " + mbeanClassName + " doesn't have a constructor that accepts an instance of " + info.getServiceClassName(), nsme);
- } catch (final InvocationTargetException ite) {
- logger.warn( "Cannot invoke constructor on class " + mbeanClassName, ite);
- } catch (final InstantiationException ie) {
- logger.warn( "Cannot instantiate class " + mbeanClassName, ie);
- } catch (final IllegalAccessException iae) {
- logger.warn( "Cannot access class " + mbeanClassName, iae);
- } catch (final MalformedObjectNameException mone) {
- logger.warn( "Invalid ObjectName '" + on + "' for MBean " + mbeanClassName, mone);
- } catch (final InstanceAlreadyExistsException iaee) {
- logger.warn( "Instance for MBean " + mbeanClassName + "already exists", iaee);
- } catch (final NotCompliantMBeanException ncme) {
- logger.warn( "Not compliant MBean " + mbeanClassName, ncme);
- } catch (final MBeanRegistrationException mre) {
- logger.warn( "Cannot register MBean " + mbeanClassName, mre);
- } catch (final SecurityException se) {
- logger.warn( "Instantiation of MBean " + mbeanClassName + " is prevented by a SecurityManager", se);
+ } catch(final NoSuchMethodException nsme) {
+ logger.warn("MBean " + mbeanClassName +
+ " doesn't have a constructor that accepts an instance of " +
+ info.getServiceClassName(), nsme);
+ } catch(final InvocationTargetException ite) {
+ logger.warn("Cannot invoke constructor on class " +
+ mbeanClassName, ite);
+ } catch(final InstantiationException ie) {
+ logger.warn("Cannot instantiate class " + mbeanClassName, ie);
+ } catch(final IllegalAccessException iae) {
+ logger.warn("Cannot access class " + mbeanClassName, iae);
+ } catch(final MalformedObjectNameException mone) {
+ logger.warn("Invalid ObjectName '" + on + "' for MBean " +
+ mbeanClassName, mone);
+ } catch(final InstanceAlreadyExistsException iaee) {
+ logger.warn("Instance for MBean " + mbeanClassName +
+ "already exists", iaee);
+ } catch(final NotCompliantMBeanException ncme) {
+ logger.warn("Not compliant MBean " + mbeanClassName, ncme);
+ } catch(final MBeanRegistrationException mre) {
+ logger.warn("Cannot register MBean " + mbeanClassName, mre);
+ } catch(final SecurityException se) {
+ logger.warn("Instantiation of MBean " + mbeanClassName +
+ " is prevented by a SecurityManager", se);
}
}
- return null;
- }
- public static String findJmxDomain(final String pJmxDomain, final ServiceManager serviceManager) {
- // try to find a JMX domain name first from this component configuration give as parameter
- String jmxDomain = pJmxDomain;
- if( jmxDomain == null )
- {
- // next from the CoreServiceManager managing this component
- if( serviceManager != null && serviceManager instanceof CoreServiceManager )
- {
- // next from the CoreServiceManager managing this component
- jmxDomain = ((CoreServiceManager)serviceManager).getJmxDefaultDomain();
- } else {
- // otherwise use default one
- jmxDomain = CoreServiceManager.JMX_DEFAULT_DOMAIN_NAME;
- }
- }
- return jmxDomain;
- }
-
- public static String findJmxName(final String pJmxName, final String pClassName) {
- String jmxName = pJmxName;
- final String className = (pClassName == null ? "unknown" : pClassName);
- if (jmxName == null ) {
- // otherwise construct one from the service class name
- final StringBuffer sb = new StringBuffer();
- final List groups = new ArrayList();
- int i = className.indexOf('.');
- int j = 0;
- while(i > 0) {
- groups.add(className.substring(j,i));
- j = i+1;
- i = className.indexOf('.', i+1);
- }
- groups.add(className.substring(j));
- for (i = 0; i < groups.size()-1; i++) {
- sb.append("group");
- if (i > 0) {
- sb.append(i);
- }
- sb.append('=');
- sb.append(groups.get(i));
- sb.append(',');
- }
- sb.append("item=").append(groups.get(groups.size()-1));
- jmxName = sb.toString();
- }
- return jmxName;
- }
-
- private static MBeanServer getInitialMBeanServer() {
- final List servers = MBeanServerFactory.findMBeanServer(null);
- if( servers.size() > 0 ) {
- return (MBeanServer)servers.get(0);
- }
return null;
}
-
- private static String callGetter(final Object mbean, final String name, final Logger logger) {
+
+ /**
+ * Call a getter method on a bean
+ *
+ * @param mbean The bean to call a method from
+ * @param name The name of the method to call
+ * @param logger Logger for diagnostic messages
+ *
+ * @return DOCUMENT ME!
+ */
+ private static String callGetter(final Object mbean,
+ final String name,
+ final Logger logger) {
final Method[] methods = mbean.getClass().getMethods();
+
for(int i = 0; i < methods.length; i++) {
if(methods[i].getName().equals(name)) {
try {
return methods[i].invoke(mbean, null).toString();
} catch(final Exception e) {
- logger.warn( "Method '" + name + "' cannot be accessed on MBean " + mbean.getClass().getName());
+ logger.warn("Method '" + name +
+ "' cannot be accessed on MBean " +
+ mbean.getClass().getName());
+
return null;
}
-
}
}
+
return null;
}
-
- public static String genDefaultJmxName(final Class clazz)
- {
- return genDefaultJmxName(clazz.getName());
- }
-
- public static String genDefaultJmxName(final String className)
- {
- final StringBuffer nameBuf = new StringBuffer();
- final List groups = new ArrayList();
- int i = className.indexOf('.');
- int j = 0;
- while(i > 0) {
- groups.add(className.substring(j,i));
- j = i+1;
- i = className.indexOf('.', i+1);
- }
- groups.add(className.substring(j));
- for (i = 0; i < groups.size()-1; i++) {
- nameBuf.append("group");
- if (i > 0) {
- nameBuf.append(i);
- }
- nameBuf.append('=');
- nameBuf.append(groups.get(i));
- nameBuf.append(',');
+
+ /**
+ * Try to find a JMX Agent (MBeanServer)
+ *
+ * @return The first MBeanServer found or null
+ */
+ private static MBeanServer getInitialMBeanServer() {
+ final List servers = MBeanServerFactory.findMBeanServer(null);
+
+ if(servers.size() > 0) {
+ return (MBeanServer)servers.get(0);
}
- nameBuf.append("item=").append(groups.get(groups.size()-1));
- return nameBuf.toString();
+
+ return null;
}
}