added AbstractMBean (base class for all Sigar MBeans)
added MBean impls for Cpu, CpuPerc, CpuInfo and Mem added SigarRegistry MBean (auto-registers a default set of MBeans when registered to/created by an MBeanServer)
This commit is contained in:
		
							parent
							
								
									a8f28f2ee0
								
							
						
					
					
						commit
						36434a0a23
					
				@ -8,5 +8,6 @@
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="lib" path="/Developer/Java/Ant/lib/ant.jar"/>
 | 
			
		||||
	<classpathentry kind="lib" path="lib/log4j.jar"/>
 | 
			
		||||
	<classpathentry kind="lib" path="lib/mx4j-jmx.jar"/>
 | 
			
		||||
	<classpathentry kind="output" path="build/classes"/>
 | 
			
		||||
</classpath>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								bindings/java/lib/mx4j-jmx.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bindings/java/lib/mx4j-jmx.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										272
									
								
								bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,272 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeList;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.DynamicMBean;
 | 
			
		||||
import javax.management.InvalidAttributeValueException;
 | 
			
		||||
import javax.management.MBeanException;
 | 
			
		||||
import javax.management.MBeanRegistration;
 | 
			
		||||
import javax.management.MBeanServer;
 | 
			
		||||
import javax.management.ObjectName;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
import org.hyperic.sigar.SigarProxy;
 | 
			
		||||
import org.hyperic.sigar.SigarProxyCache;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Base class for all Sigar JMX MBeans. Provides a skeleton which handles
 | 
			
		||||
 * creation of the Sigar proxy instance and provides some convenience methods.
 | 
			
		||||
 * It also enforces usage of the {@link DynamicMBean} inferface while
 | 
			
		||||
 * implementing part of it, and it adds empty implementations for all methods of
 | 
			
		||||
 * the {@link MBeanRegistration} interface, allowing subclasses to only
 | 
			
		||||
 * implement subset of them.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractMBean implements DynamicMBean, MBeanRegistration {
 | 
			
		||||
 | 
			
		||||
	protected static final String MBEAN_ATTR_TYPE = "type";
 | 
			
		||||
 | 
			
		||||
	protected static final short CACHED_30SEC = 0;
 | 
			
		||||
 | 
			
		||||
	protected static final short CACHED_5SEC = 1;
 | 
			
		||||
 | 
			
		||||
	protected static final short CACHED_500MS = 2;
 | 
			
		||||
 | 
			
		||||
	protected static final short CACHELESS = 3;
 | 
			
		||||
 | 
			
		||||
	protected static final short DEFAULT = CACHED_30SEC;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The Sigar implementation to be used to fetch information from the system.
 | 
			
		||||
	 */
 | 
			
		||||
	protected final Sigar sigarImpl;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The Sigar proxy cache to be used in case the data does not have to be 
 | 
			
		||||
	 * fetched during each call. The cache timeout is decided during 
 | 
			
		||||
	 * construction. See {@link AbstractMBean#AbstractMBean(Sigar, short)} for 
 | 
			
		||||
	 * details.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see AbstractMBean#AbstractMBean(Sigar, short)
 | 
			
		||||
	 */
 | 
			
		||||
	protected final SigarProxy sigar;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The MBean server this MBean is registered to. Set during the MBean's 
 | 
			
		||||
	 * registration to the MBean server and unset to <code>null</code> when
 | 
			
		||||
	 * the deregistration finished.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see #preRegister(MBeanServer, ObjectName)
 | 
			
		||||
	 * @see #postDeregister()
 | 
			
		||||
	 */
 | 
			
		||||
	protected MBeanServer mbeanServer;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * <p>Creates a new instance of this class. The Sigar instance is stored (and 
 | 
			
		||||
	 * accessible) via the {@link #sigarImpl} member. A second instance is 
 | 
			
		||||
	 * stored within the {@link #sigar} member which is either {@link #sigarImpl}
 | 
			
		||||
	 * or an instance of {@link SigarProxyCache} with the expiration time set to 
 | 
			
		||||
	 * whatever the <code>cacheMode</code> parameter specifies.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p>The following cache modes exist:</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <table border = "1">
 | 
			
		||||
	 * <tr><td><b>Constant</b></td><td><b>Description</b></td></tr>
 | 
			
		||||
	 * <tr><td>{@link #CACHELESS}</td><td>No cached instance, {@link #sigar} 
 | 
			
		||||
	 * 		<code>==</code> {@link #sigarImpl}.</td></tr>
 | 
			
		||||
	 * <tr><td>{@link #CACHED_500MS}</td><td>500 millisecond cache, for high 
 | 
			
		||||
	 * 		frequency queries on raw data such as reading out CPU timers each 
 | 
			
		||||
	 * 		second. Avoids reading out multiple data sets when all attributes of 
 | 
			
		||||
	 * 		an MBean are queried in short sequence.</td></tr>
 | 
			
		||||
	 * <tr><td>{@link #CACHED_5SEC}</td><td>5 second cache, for high frequency 
 | 
			
		||||
	 * 		queries on calculated data such as CPU percentages.</td></tr>
 | 
			
		||||
	 * <tr><td>{@link #CACHED_30SEC}</td><td>30 second cache, for normal queries 
 | 
			
		||||
	 * 		or data readouts such as CPU model / vendor. This is the default if 
 | 
			
		||||
	 * 		nothing (<code>0</code>) is specified.</td></tr>
 | 
			
		||||
	 * <tr><td>{@link #DEFAULT}</td><td>Same as {@link #CACHED_30SEC}.</td></tr>
 | 
			
		||||
	 * </table>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p><b>Note:</b> Only make use of the cacheless or half second mode if you 
 | 
			
		||||
	 * know what you are doing. They may have impact on system performance if 
 | 
			
		||||
	 * used excessively.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sigar The Sigar impl to use. Must not be <code>null</code>
 | 
			
		||||
	 * @param cacheMode The cache mode to use for {@link #sigar} or {@link #CACHELESS}
 | 
			
		||||
	 * 		if no separate, cached instance is to be maintained.
 | 
			
		||||
	 */
 | 
			
		||||
	protected AbstractMBean(Sigar sigar, short cacheMode) {
 | 
			
		||||
		// store Sigar
 | 
			
		||||
		this.sigarImpl = sigar;
 | 
			
		||||
		
 | 
			
		||||
		// create a cached instance as well
 | 
			
		||||
		if (cacheMode == CACHELESS) {
 | 
			
		||||
			// no cached version
 | 
			
		||||
			this.sigar = this.sigarImpl;
 | 
			
		||||
			
 | 
			
		||||
		} else if (cacheMode == CACHED_500MS) {
 | 
			
		||||
			// 500ms cached version (for 1/sec queries)
 | 
			
		||||
			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
 | 
			
		||||
					500);
 | 
			
		||||
			
 | 
			
		||||
		} else if (cacheMode == CACHED_5SEC) {
 | 
			
		||||
			// 5sec cached version (for avg'd queries)
 | 
			
		||||
			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
 | 
			
		||||
					5000);
 | 
			
		||||
			
 | 
			
		||||
		} else /* if (cacheMode == CACHED_30SEC) */ {
 | 
			
		||||
			// 30sec (default) cached version (for info and long term queries)
 | 
			
		||||
			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
 | 
			
		||||
					30000);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the object name the MBean is registered with within the
 | 
			
		||||
	 * MBeanServer. May be <code>null</code> in case the instance is not
 | 
			
		||||
	 * registered to an MBeanServer, but used standalone.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return The object name or <code>null</code> if not registered to an
 | 
			
		||||
	 *         MBeanServer
 | 
			
		||||
	 */
 | 
			
		||||
	public abstract String getObjectName();
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns a runtime exception for the type and SigarException specified.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param type
 | 
			
		||||
	 *            The type that was called
 | 
			
		||||
	 * @param e
 | 
			
		||||
	 *            The exception that was raised
 | 
			
		||||
	 * @return A runtime exception encapsulating the information specified
 | 
			
		||||
	 */
 | 
			
		||||
	protected RuntimeException unexpectedError(String type, SigarException e) {
 | 
			
		||||
		String msg = "Unexected error in Sigar.get" + type + ": "
 | 
			
		||||
				+ e.getMessage();
 | 
			
		||||
		return new IllegalArgumentException(msg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loops over all attributes and calls
 | 
			
		||||
	 * {@link DynamicMBean#getAttribute(java.lang.String)} method for each
 | 
			
		||||
	 * attribute sequentially. Any exception thrown by those methods are ignored
 | 
			
		||||
	 * and simply cause the attribute not being added to the result.
 | 
			
		||||
	 */
 | 
			
		||||
	public AttributeList getAttributes(String[] attrs) {
 | 
			
		||||
		final AttributeList result = new AttributeList();
 | 
			
		||||
		for (int i = 0; i < attrs.length; i++) {
 | 
			
		||||
			try {
 | 
			
		||||
				result.add(new Attribute(attrs[i], getAttribute(attrs[i])));
 | 
			
		||||
			} catch (AttributeNotFoundException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			} catch (MBeanException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			} catch (ReflectionException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loops over all attributes and calls
 | 
			
		||||
	 * {@link DynamicMBean#setAttribute(Attribute)} for each attribute
 | 
			
		||||
	 * sequentially. Any exception thrown by those methods are ignored and
 | 
			
		||||
	 * simply cause the attribute not being added to the result.
 | 
			
		||||
	 */
 | 
			
		||||
	public AttributeList setAttributes(AttributeList attrs) {
 | 
			
		||||
		final AttributeList result = new AttributeList();
 | 
			
		||||
		for (int i = 0; i < attrs.size(); i++) {
 | 
			
		||||
			try {
 | 
			
		||||
				final Attribute next = (Attribute) attrs.get(i);
 | 
			
		||||
				setAttribute(next);
 | 
			
		||||
				result.add(next);
 | 
			
		||||
			} catch (AttributeNotFoundException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			} catch (InvalidAttributeValueException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			} catch (MBeanException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			} catch (ReflectionException e) {
 | 
			
		||||
				// ignore, as we cannot throw this exception
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the MBeanRegistration interface
 | 
			
		||||
	// -------
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * <p>Returns <code>new ObjectName(this.getObjectName())</code> to guarantee 
 | 
			
		||||
	 * a reliable and reproducable object name.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p><b>Note:</b> Make sure any subclass does a super call to this method, 
 | 
			
		||||
	 * otherwise the implementation might be broken.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see MBeanRegistration#preRegister(MBeanServer, ObjectName)
 | 
			
		||||
	 */
 | 
			
		||||
	public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
 | 
			
		||||
		this.mbeanServer = server;
 | 
			
		||||
		return new ObjectName(getObjectName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Empty implementation, allowing aubclasses to ignore the interface.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p><b>Note:</b> Make sure any subclass does a super call to this method, 
 | 
			
		||||
	 * otherwise the implementation might be broken.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see MBeanRegistration#postRegister(Boolean)
 | 
			
		||||
	 */
 | 
			
		||||
	public void postRegister(Boolean success) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Empty implementation, allowing aubclasses to ignore the interface.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p><b>Note:</b> Make sure any subclass does a super call to this method, 
 | 
			
		||||
	 * otherwise the implementation might be broken.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see MBeanRegistration#preDeregister()
 | 
			
		||||
	 */
 | 
			
		||||
	public void preDeregister() throws Exception {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Empty implementation, allowing aubclasses to ignore the interface.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * <p><b>Note:</b> Make sure any subclass does a super call to this method, 
 | 
			
		||||
	 * otherwise the implementation might be broken.</p>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see MBeanRegistration#postDeregister()
 | 
			
		||||
	 */
 | 
			
		||||
	public void postDeregister() {
 | 
			
		||||
		this.mbeanServer = null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										343
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										343
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,343 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.MBeanAttributeInfo;
 | 
			
		||||
import javax.management.MBeanConstructorInfo;
 | 
			
		||||
import javax.management.MBeanInfo;
 | 
			
		||||
import javax.management.MBeanParameterInfo;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sigar JMX MBean implementation for the <code>Cpu</code> information package.
 | 
			
		||||
 * Provides an OpenMBean conform implementation.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public class SigarCpu extends AbstractMBean {
 | 
			
		||||
 | 
			
		||||
	private static final String MBEAN_TYPE = "CpuList";
 | 
			
		||||
 | 
			
		||||
	private static final MBeanInfo MBEAN_INFO;
 | 
			
		||||
	
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_USER;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
 | 
			
		||||
 | 
			
		||||
	private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 | 
			
		||||
	
 | 
			
		||||
	static {
 | 
			
		||||
		MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
 | 
			
		||||
				"CpuIndex", "int",
 | 
			
		||||
				"The index of the CPU, typically starting at 0",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_IDLE = new MBeanAttributeInfo(
 | 
			
		||||
				"Idle", "long",
 | 
			
		||||
				"The idle time of the CPU, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_NICE = new MBeanAttributeInfo(
 | 
			
		||||
				"Nice", "long",
 | 
			
		||||
				"The time of the CPU spent on nice priority, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_SYS = new MBeanAttributeInfo(
 | 
			
		||||
				"Sys", "long",
 | 
			
		||||
				"The time of the CPU used by the system, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
 | 
			
		||||
				"Total", "long",
 | 
			
		||||
				"The total time of the CPU, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_USER = new MBeanAttributeInfo(
 | 
			
		||||
				"User", "long",
 | 
			
		||||
				"The time of the CPU used by user processes, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_WAIT = new MBeanAttributeInfo(
 | 
			
		||||
				"Wait", "long",
 | 
			
		||||
				"The time the CPU had to wait for data to be loaded, in [ms]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
 | 
			
		||||
				"cpuIndex", "int",
 | 
			
		||||
				"The index of the CPU to read data for. Must be >= 0 " +
 | 
			
		||||
				"and not exceed the CPU count of the system");
 | 
			
		||||
		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
 | 
			
		||||
				"sigar", Sigar.class.getName(),
 | 
			
		||||
				"The Sigar instance to use to fetch data from");
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using a new Sigar instance to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
						MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using the Sigar instance specified to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
					MBEAN_PARAM_SIGAR,
 | 
			
		||||
					MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_INFO = new MBeanInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Sigar CPU MBean. Provides raw timing data for a single " +
 | 
			
		||||
				"CPU. The data is cached for 500ms, meaning each request " +
 | 
			
		||||
				"(and as a result each block request to all parameters) " +
 | 
			
		||||
				"within half a second is satisfied from the same dataset.",
 | 
			
		||||
				new MBeanAttributeInfo[]{
 | 
			
		||||
					MBEAN_ATTR_CPUINDEX, 
 | 
			
		||||
					MBEAN_ATTR_IDLE, 
 | 
			
		||||
					MBEAN_ATTR_NICE, 
 | 
			
		||||
					MBEAN_ATTR_SYS, 
 | 
			
		||||
					MBEAN_ATTR_TOTAL, 
 | 
			
		||||
					MBEAN_ATTR_USER, 
 | 
			
		||||
					MBEAN_ATTR_WAIT}, 
 | 
			
		||||
				new MBeanConstructorInfo[]{
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX,
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX_SIGAR},
 | 
			
		||||
					null, null);
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Index of the CPU processed by the instance.
 | 
			
		||||
	 */
 | 
			
		||||
	private final int cpuIndex;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	private final String objectName;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using a new Sigar 
 | 
			
		||||
	 * instance to fetch the data. Fails if the CPU index is out of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpu(int cpuIndex) throws IllegalArgumentException {
 | 
			
		||||
		this(new Sigar(), cpuIndex);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using the Sigar 
 | 
			
		||||
	 * instance specified to fetch the data. Fails if the CPU index is out 
 | 
			
		||||
	 * of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sigar The Sigar instance to use to fetch data from
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpu(Sigar sigar, int cpuIndex) throws IllegalArgumentException {
 | 
			
		||||
		super(sigar, CACHED_500MS);
 | 
			
		||||
 | 
			
		||||
		// check index
 | 
			
		||||
		if (cpuIndex < 0)
 | 
			
		||||
			throw new IllegalArgumentException(
 | 
			
		||||
					"CPU index has to be non-negative: " + cpuIndex);
 | 
			
		||||
		try {
 | 
			
		||||
			int cpuCount;
 | 
			
		||||
			if ((cpuCount = sigar.getCpuList().length) < cpuIndex)
 | 
			
		||||
				throw new IllegalArgumentException(
 | 
			
		||||
						"CPU index out of range (found " + cpuCount + " CPU(s)): " + cpuIndex);
 | 
			
		||||
			
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// all fine
 | 
			
		||||
		this.cpuIndex = cpuIndex;
 | 
			
		||||
		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
 | 
			
		||||
		+ MBEAN_ATTR_TYPE + "=Cpu," 
 | 
			
		||||
		+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
 | 
			
		||||
		+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	public String getObjectName() {
 | 
			
		||||
		return this.objectName;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/** 
 | 
			
		||||
	 * @return The index of the CPU, typically starting at 0
 | 
			
		||||
	 */
 | 
			
		||||
	public int getCpuIndex() {
 | 
			
		||||
		return this.cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The idle time of the CPU, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getIdle() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getIdle();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU spent on nice priority, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getNice() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getNice();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU used by the system, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getSys() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getSys();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The total time of the CPU, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getTotal() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getTotal();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU used by user processes, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getUser() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getUser();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time the CPU had to wait for data to be loaded, in [ms]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getWait() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuList()[this.cpuIndex].getWait();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the DynamicMBean interface
 | 
			
		||||
	// -------
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getAttribute(String)
 | 
			
		||||
	 */
 | 
			
		||||
	public Object getAttribute(String attr) throws AttributeNotFoundException {
 | 
			
		||||
		
 | 
			
		||||
		if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
 | 
			
		||||
			return new Integer(getCpuIndex());
 | 
			
		||||
		
 | 
			
		||||
		} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getIdle());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getNice());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getSys());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getTotal());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getUser());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getWait());
 | 
			
		||||
			
 | 
			
		||||
		} else {
 | 
			
		||||
			throw new AttributeNotFoundException(attr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#setAttribute(Attribute)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#invoke(String, Object[], String[])
 | 
			
		||||
	 */
 | 
			
		||||
	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
 | 
			
		||||
		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getMBeanInfo()
 | 
			
		||||
	 */
 | 
			
		||||
	public MBeanInfo getMBeanInfo() {
 | 
			
		||||
		return MBEAN_INFO;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										302
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,302 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.MBeanAttributeInfo;
 | 
			
		||||
import javax.management.MBeanConstructorInfo;
 | 
			
		||||
import javax.management.MBeanInfo;
 | 
			
		||||
import javax.management.MBeanParameterInfo;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sigar JMX MBean implementation for the <code>CpuInfo</code> information 
 | 
			
		||||
 * package. Provides an OpenMBean conform implementation.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public class SigarCpuInfo extends AbstractMBean {
 | 
			
		||||
 | 
			
		||||
	private static final String MBEAN_TYPE = "CpuInfoList";
 | 
			
		||||
 | 
			
		||||
	private static final MBeanInfo MBEAN_INFO;
 | 
			
		||||
	
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_MHZ;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_MODEL;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanParameterInfo MBEAN_PARAM_SIGAR;
 | 
			
		||||
	
 | 
			
		||||
	static {
 | 
			
		||||
		MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
 | 
			
		||||
				"CpuIndex", "int",
 | 
			
		||||
				"The index of the CPU, typically starting at 0",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_CACHESIZE = new MBeanAttributeInfo(
 | 
			
		||||
				"CacheSize", "long",
 | 
			
		||||
				"The cache size of the CPU, in [byte]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_MHZ = new MBeanAttributeInfo(
 | 
			
		||||
				"Mhz", "int",
 | 
			
		||||
				"The clock speed of the CPU, in [MHz]",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_MODEL = new MBeanAttributeInfo(
 | 
			
		||||
				"Model", "java.lang.String",
 | 
			
		||||
				"The CPU model reported",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_VENDOR = new MBeanAttributeInfo(
 | 
			
		||||
				"Vendor", "java.lang.String",
 | 
			
		||||
				"The CPU vendor reported",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
 | 
			
		||||
				"cpuIndex", "int",
 | 
			
		||||
				"The index of the CPU to read data for. Must be >= 0 " +
 | 
			
		||||
				"and not exceed the CPU count of the system");
 | 
			
		||||
		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
 | 
			
		||||
				"sigar", Sigar.class.getName(),
 | 
			
		||||
				"The Sigar instance to use to fetch data from");
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using a new Sigar instance to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
						MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using the Sigar instance specified to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
					MBEAN_PARAM_SIGAR,
 | 
			
		||||
					MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_INFO = new MBeanInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Sigar CPU Info MBean, provides overall information for a " +
 | 
			
		||||
				"single CPU. This information only changes if, for example, " +
 | 
			
		||||
				"a CPU is reducing its clock frequency or shutting down " +
 | 
			
		||||
				"part of its cache. Subsequent requests are satisfied from " +
 | 
			
		||||
				"within a cache that invalidates after 30 seconds.",
 | 
			
		||||
				new MBeanAttributeInfo[]{
 | 
			
		||||
					MBEAN_ATTR_CPUINDEX, 
 | 
			
		||||
					MBEAN_ATTR_CACHESIZE, 
 | 
			
		||||
					MBEAN_ATTR_MHZ, 
 | 
			
		||||
					MBEAN_ATTR_MODEL, 
 | 
			
		||||
					MBEAN_ATTR_VENDOR}, 
 | 
			
		||||
				new MBeanConstructorInfo[]{
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX,
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX_SIGAR},
 | 
			
		||||
					null, null);
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Index of the CPU processed by the instance.
 | 
			
		||||
	 */
 | 
			
		||||
	private int cpuIndex;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	private String objectName;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using a new Sigar 
 | 
			
		||||
	 * instance to fetch the data. Fails if the CPU index is out of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpuInfo(int index) throws IllegalArgumentException {
 | 
			
		||||
		this(new Sigar(), index);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using the Sigar 
 | 
			
		||||
	 * instance specified to fetch the data. Fails if the CPU index is out 
 | 
			
		||||
	 * of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sigar The Sigar instance to use to fetch data from
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpuInfo(Sigar sigar, int index) {
 | 
			
		||||
		super(sigar, DEFAULT);
 | 
			
		||||
 | 
			
		||||
		// check index
 | 
			
		||||
		if (index < 0)
 | 
			
		||||
			throw new IllegalArgumentException(
 | 
			
		||||
					"CPU index has to be non-negative: " + index);
 | 
			
		||||
		try {
 | 
			
		||||
			int cpuCount;
 | 
			
		||||
			if ((cpuCount = sigar.getCpuInfoList().length) < index)
 | 
			
		||||
				throw new IllegalArgumentException(
 | 
			
		||||
						"CPU index out of range (found " + cpuCount + " CPU(s)): " + index);
 | 
			
		||||
			
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// all fine
 | 
			
		||||
		this.cpuIndex = index;
 | 
			
		||||
		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
 | 
			
		||||
		+ MBEAN_ATTR_TYPE + "=CpuInfo," 
 | 
			
		||||
		+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
 | 
			
		||||
		+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	public String getObjectName() {
 | 
			
		||||
		return this.objectName;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/** 
 | 
			
		||||
	 * @return The index of the CPU, typically starting at 0
 | 
			
		||||
	 */
 | 
			
		||||
	public int getCpuIndex() {
 | 
			
		||||
		return this.cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The cache size of the CPU, in [byte]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getCacheSize() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuInfoList()[this.cpuIndex].getCacheSize();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The clock speed of the CPU, in [MHz]
 | 
			
		||||
	 */
 | 
			
		||||
	public int getMhz() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuInfoList()[this.cpuIndex].getMhz();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The CPU model reported
 | 
			
		||||
	 */
 | 
			
		||||
	public String getModel() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuInfoList()[this.cpuIndex].getModel();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The CPU vendor reported
 | 
			
		||||
	 */
 | 
			
		||||
	public String getVendor() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuInfoList()[this.cpuIndex].getVendor();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the DynamicMBean interface
 | 
			
		||||
	// -------
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getAttribute(String)
 | 
			
		||||
	 */
 | 
			
		||||
	public Object getAttribute(String attr) throws AttributeNotFoundException {
 | 
			
		||||
		
 | 
			
		||||
		if (MBEAN_ATTR_CACHESIZE.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getCacheSize());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
 | 
			
		||||
			return new Integer(getCpuIndex());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_MHZ.getName().equals(attr)) {
 | 
			
		||||
			return new Integer(getMhz());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_MODEL.getName().equals(attr)) {
 | 
			
		||||
			return getModel();
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_VENDOR.getName().equals(attr)) {
 | 
			
		||||
			return getVendor();
 | 
			
		||||
			
 | 
			
		||||
		} else {
 | 
			
		||||
			throw new AttributeNotFoundException(attr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#setAttribute(Attribute)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#invoke(String, Object[], String[])
 | 
			
		||||
	 */
 | 
			
		||||
	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
 | 
			
		||||
		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getMBeanInfo()
 | 
			
		||||
	 */
 | 
			
		||||
	public MBeanInfo getMBeanInfo() {
 | 
			
		||||
		return MBEAN_INFO;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										345
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,345 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.MBeanAttributeInfo;
 | 
			
		||||
import javax.management.MBeanConstructorInfo;
 | 
			
		||||
import javax.management.MBeanInfo;
 | 
			
		||||
import javax.management.MBeanParameterInfo;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>Sigar JMX MBean implementation for the <code>CpuPerc</code> information 
 | 
			
		||||
 * package. Provides an OpenMBean conform implementation.</p>
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public class SigarCpuPerc extends AbstractMBean {
 | 
			
		||||
 | 
			
		||||
	private static final String MBEAN_TYPE = "CpuPercList";
 | 
			
		||||
 | 
			
		||||
	private static final MBeanInfo MBEAN_INFO;
 | 
			
		||||
	
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_COMBINED;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_USER;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
 | 
			
		||||
 | 
			
		||||
	private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
 | 
			
		||||
 | 
			
		||||
	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 | 
			
		||||
	
 | 
			
		||||
	static {
 | 
			
		||||
		MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
 | 
			
		||||
				"CpuIndex", "int",
 | 
			
		||||
				"The index of the CPU, typically starting at 0",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_COMBINED = new MBeanAttributeInfo(
 | 
			
		||||
				"Combined", "double",
 | 
			
		||||
				"The total time of the CPU, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_IDLE = new MBeanAttributeInfo(
 | 
			
		||||
				"Idle", "double",
 | 
			
		||||
				"The idle time of the CPU, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_NICE = new MBeanAttributeInfo(
 | 
			
		||||
				"Nice", "double",
 | 
			
		||||
				"The time of the CPU spent on nice priority, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_SYS = new MBeanAttributeInfo(
 | 
			
		||||
				"Sys", "double",
 | 
			
		||||
				"The time of the CPU used by the system, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_USER = new MBeanAttributeInfo(
 | 
			
		||||
				"User", "double",
 | 
			
		||||
				"The time of the CPU used by user processes, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_WAIT = new MBeanAttributeInfo(
 | 
			
		||||
				"Wait", "double",
 | 
			
		||||
				"The time the CPU had to wait for data to be loaded, as a fraction of 1",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
 | 
			
		||||
				"cpuIndex", "int",
 | 
			
		||||
				"The index of the CPU to read data for. Must be >= 0 " +
 | 
			
		||||
				"and not exceed the CPU count of the system");
 | 
			
		||||
		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
 | 
			
		||||
				"sigar", Sigar.class.getName(),
 | 
			
		||||
				"The Sigar instance to use to fetch data from");
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using a new Sigar instance to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
						MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance for the CPU index specified, " +
 | 
			
		||||
				"using the Sigar instance specified to fetch the data. " +
 | 
			
		||||
				"Fails if the CPU index is out of range.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
					MBEAN_PARAM_SIGAR,
 | 
			
		||||
					MBEAN_PARAM_CPUINDEX});
 | 
			
		||||
		MBEAN_INFO = new MBeanInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Sigar CPU MBean. Provides percentage data for a single " +
 | 
			
		||||
				"CPU, averaged over the timeframe between the last and " +
 | 
			
		||||
				"the current measurement point. Two measurement points " +
 | 
			
		||||
				"can be as close as 5 seconds, meaning subsequent requests " +
 | 
			
		||||
				"for data within 5 seconds after the last executed call " +
 | 
			
		||||
				"will be satisfied from cached data.",
 | 
			
		||||
				new MBeanAttributeInfo[]{
 | 
			
		||||
					MBEAN_ATTR_CPUINDEX, 
 | 
			
		||||
					MBEAN_ATTR_COMBINED, 
 | 
			
		||||
					MBEAN_ATTR_IDLE, 
 | 
			
		||||
					MBEAN_ATTR_NICE, 
 | 
			
		||||
					MBEAN_ATTR_SYS, 
 | 
			
		||||
					MBEAN_ATTR_USER, 
 | 
			
		||||
					MBEAN_ATTR_WAIT}, 
 | 
			
		||||
				new MBeanConstructorInfo[]{
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX,
 | 
			
		||||
					MBEAN_CONSTR_CPUINDEX_SIGAR},
 | 
			
		||||
					null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Index of the CPU processed by the instance.
 | 
			
		||||
	 */
 | 
			
		||||
	private int cpuIndex;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	private String objectName;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using a new Sigar 
 | 
			
		||||
	 * instance to fetch the data. Fails if the CPU index is out of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpuPerc(int index) {
 | 
			
		||||
		this(new Sigar(), index);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance for the CPU index specified, using the Sigar 
 | 
			
		||||
	 * instance specified to fetch the data. Fails if the CPU index is out 
 | 
			
		||||
	 * of range.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sigar The Sigar instance to use to fetch data from
 | 
			
		||||
	 * @param cpuIndex The index of the CPU to read data for. Must be 
 | 
			
		||||
	 * 		<code>>= 0</code> and not exceed the CPU count of the system.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException If the CPU index is out of range or 
 | 
			
		||||
	 * 		an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarCpuPerc(Sigar sigar, int index) {
 | 
			
		||||
		super(sigar, CACHED_5SEC);
 | 
			
		||||
 | 
			
		||||
		// check index
 | 
			
		||||
		if (index < 0)
 | 
			
		||||
			throw new IllegalArgumentException(
 | 
			
		||||
					"CPU index has to be non-negative: " + index);
 | 
			
		||||
		try {
 | 
			
		||||
			int cpuCount;
 | 
			
		||||
			if ((cpuCount = sigar.getCpuPercList().length) < index)
 | 
			
		||||
				throw new IllegalArgumentException(
 | 
			
		||||
						"CPU index out of range (found " + cpuCount
 | 
			
		||||
								+ " CPU(s)): " + index);
 | 
			
		||||
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// all fine
 | 
			
		||||
		this.cpuIndex = index;
 | 
			
		||||
		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
 | 
			
		||||
				+ MBEAN_ATTR_TYPE + "=CpuPerc," 
 | 
			
		||||
				+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
 | 
			
		||||
				+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an 
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	public String getObjectName() {
 | 
			
		||||
		return this.objectName;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/** 
 | 
			
		||||
	 * @return The index of the CPU, typically starting at 0
 | 
			
		||||
	 */
 | 
			
		||||
	public int getCpuIndex() {
 | 
			
		||||
		return this.cpuIndex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The total time of the CPU, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getCombined() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getCombined();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The idle time of the CPU, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getIdle() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getIdle();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU spent on nice priority, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getNice() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getNice();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU used by the system, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSys() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getSys();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time of the CPU used by user processes, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getUser() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getUser();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The time the CPU had to wait for data to be loaded, as a fraction of 1
 | 
			
		||||
	 */
 | 
			
		||||
	public double getWait() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getCpuPercList()[this.cpuIndex].getWait();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the DynamicMBean interface
 | 
			
		||||
	// -------
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getAttribute(String)
 | 
			
		||||
	 */
 | 
			
		||||
	public Object getAttribute(String attr) throws AttributeNotFoundException {
 | 
			
		||||
		
 | 
			
		||||
		if (MBEAN_ATTR_COMBINED.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getCombined());
 | 
			
		||||
		
 | 
			
		||||
		} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
 | 
			
		||||
			return new Integer(getCpuIndex());
 | 
			
		||||
		
 | 
			
		||||
		} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getIdle());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getNice());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getSys());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getUser());
 | 
			
		||||
			
 | 
			
		||||
		} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
 | 
			
		||||
			return new Double(getWait());
 | 
			
		||||
			
 | 
			
		||||
		} else {
 | 
			
		||||
			throw new AttributeNotFoundException(attr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#setAttribute(Attribute)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#invoke(String, Object[], String[])
 | 
			
		||||
	 */
 | 
			
		||||
	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
 | 
			
		||||
		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see DynamicMBean#getMBeanInfo()
 | 
			
		||||
	 */
 | 
			
		||||
	public MBeanInfo getMBeanInfo() {
 | 
			
		||||
		return MBEAN_INFO;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										272
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,272 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.MBeanAttributeInfo;
 | 
			
		||||
import javax.management.MBeanConstructorInfo;
 | 
			
		||||
import javax.management.MBeanException;
 | 
			
		||||
import javax.management.MBeanInfo;
 | 
			
		||||
import javax.management.MBeanParameterInfo;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sigar JMX MBean implementation for the <code>Mem</code> information
 | 
			
		||||
 * package. Provides an OpenMBean conform implementation.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public class SigarMem extends AbstractMBean {
 | 
			
		||||
 | 
			
		||||
	private static final String MBEAN_TYPE = "Mem";
 | 
			
		||||
 | 
			
		||||
	private static final MBeanInfo MBEAN_INFO;
 | 
			
		||||
	
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_RAM;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanAttributeInfo MBEAN_ATTR_USED;
 | 
			
		||||
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
 | 
			
		||||
 | 
			
		||||
	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 | 
			
		||||
	
 | 
			
		||||
	static {
 | 
			
		||||
		MBEAN_ATTR_ACTUAL_FREE = new MBeanAttributeInfo(
 | 
			
		||||
				"ActualFree", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_ACTUAL_USED = new MBeanAttributeInfo(
 | 
			
		||||
				"ActualUsed", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_FREE = new MBeanAttributeInfo(
 | 
			
		||||
				"Free", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_RAM = new MBeanAttributeInfo(
 | 
			
		||||
				"Ram", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
 | 
			
		||||
				"Total", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_ATTR_USED = new MBeanAttributeInfo(
 | 
			
		||||
				"Used", "long",
 | 
			
		||||
				"TODO add proper description here",
 | 
			
		||||
				true, false, false);
 | 
			
		||||
		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
 | 
			
		||||
				"sigar", Sigar.class.getName(),
 | 
			
		||||
				"The Sigar instance to use to fetch data from");
 | 
			
		||||
		MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Creates a new instance, using the Sigar instance " +
 | 
			
		||||
				"specified to fetch the data.",
 | 
			
		||||
				new MBeanParameterInfo[]{
 | 
			
		||||
						MBEAN_PARAM_SIGAR});
 | 
			
		||||
		MBEAN_INFO = new MBeanInfo(
 | 
			
		||||
				SigarCpu.class.getName(),
 | 
			
		||||
				"Sigar Memory MBean, provides raw data for the physical " +
 | 
			
		||||
				"memory installed on the system. Uses an internal cache " +
 | 
			
		||||
				"that invalidates within 500ms, allowing for bulk request " +
 | 
			
		||||
				"being satisfied with a single dataset fetch.",
 | 
			
		||||
				new MBeanAttributeInfo[]{
 | 
			
		||||
					MBEAN_ATTR_ACTUAL_FREE, 
 | 
			
		||||
					MBEAN_ATTR_ACTUAL_USED, 
 | 
			
		||||
					MBEAN_ATTR_FREE, 
 | 
			
		||||
					MBEAN_ATTR_RAM, 
 | 
			
		||||
					MBEAN_ATTR_TOTAL, 
 | 
			
		||||
					MBEAN_ATTR_USED}, 
 | 
			
		||||
				new MBeanConstructorInfo[]{
 | 
			
		||||
					MBEAN_CONSTR_SIGAR},
 | 
			
		||||
					null, null);
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	private final String objectName;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance, using the Sigar instance specified to fetch the
 | 
			
		||||
	 * data.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sigar
 | 
			
		||||
	 *            The Sigar instance to use to fetch data from
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws IllegalArgumentException
 | 
			
		||||
	 *             If an unexpected Sigar error occurs
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarMem(Sigar sigar) throws IllegalArgumentException {
 | 
			
		||||
		super(sigar, CACHED_500MS);
 | 
			
		||||
 | 
			
		||||
		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
 | 
			
		||||
				+ "=Memory";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Object name this instance will give itself when being registered to an
 | 
			
		||||
	 * MBeanServer.
 | 
			
		||||
	 */
 | 
			
		||||
	public String getObjectName() {
 | 
			
		||||
		return this.objectName;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The actual amount of free physical memory, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getActualFree() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getActualFree();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The actual amount of physical memory used, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getActualUsed() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getActualUsed();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The amount of free physical memory, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getFree() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getFree();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The amount of physical memory, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getRam() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getRam();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The total amount of physical memory, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getTotal() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getTotal();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return The amount of physical memory in use, in [bytes]
 | 
			
		||||
	 */
 | 
			
		||||
	public long getUsed() {
 | 
			
		||||
		try {
 | 
			
		||||
			return sigar.getMem().getUsed();
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError(MBEAN_TYPE, e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the DynamicMBean interface
 | 
			
		||||
	// -------
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
 | 
			
		||||
	 */
 | 
			
		||||
	public Object getAttribute(String attr) throws AttributeNotFoundException,
 | 
			
		||||
			MBeanException, ReflectionException {
 | 
			
		||||
		if (MBEAN_ATTR_ACTUAL_FREE.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getActualFree());
 | 
			
		||||
 | 
			
		||||
		} else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getActualUsed());
 | 
			
		||||
 | 
			
		||||
		} else if (MBEAN_ATTR_FREE.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getFree());
 | 
			
		||||
 | 
			
		||||
		} else if (MBEAN_ATTR_RAM.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getRam());
 | 
			
		||||
 | 
			
		||||
		} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getTotal());
 | 
			
		||||
 | 
			
		||||
		} else if (MBEAN_ATTR_USED.getName().equals(attr)) {
 | 
			
		||||
			return new Long(getUsed());
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
			throw new AttributeNotFoundException(attr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#invoke(java.lang.String,
 | 
			
		||||
	 *      java.lang.Object[], java.lang.String[])
 | 
			
		||||
	 */
 | 
			
		||||
	public Object invoke(String actionName, Object[] params, String[] signature)
 | 
			
		||||
			throws ReflectionException {
 | 
			
		||||
		throw new ReflectionException(new NoSuchMethodException(actionName),
 | 
			
		||||
				actionName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#getMBeanInfo()
 | 
			
		||||
	 */
 | 
			
		||||
	public MBeanInfo getMBeanInfo() {
 | 
			
		||||
		return MBEAN_INFO;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										250
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,250 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
 | 
			
		||||
 * This file is part of SIGAR.
 | 
			
		||||
 * 
 | 
			
		||||
 * SIGAR is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms version 2 of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation. This program is distributed
 | 
			
		||||
 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 | 
			
		||||
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE. See the GNU General Public License for more
 | 
			
		||||
 * details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 | 
			
		||||
 * USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.hyperic.sigar.jmx;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import javax.management.Attribute;
 | 
			
		||||
import javax.management.AttributeNotFoundException;
 | 
			
		||||
import javax.management.MBeanConstructorInfo;
 | 
			
		||||
import javax.management.MBeanException;
 | 
			
		||||
import javax.management.MBeanInfo;
 | 
			
		||||
import javax.management.MBeanParameterInfo;
 | 
			
		||||
import javax.management.MBeanServer;
 | 
			
		||||
import javax.management.ObjectInstance;
 | 
			
		||||
import javax.management.ObjectName;
 | 
			
		||||
import javax.management.ReflectionException;
 | 
			
		||||
 | 
			
		||||
import org.hyperic.sigar.Sigar;
 | 
			
		||||
import org.hyperic.sigar.SigarException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>Registry of all Sigar MBeans. Can be used as a convenient way to invoke 
 | 
			
		||||
 * Sigar MBeans at a central point. This brings a bunch of advantages with 
 | 
			
		||||
 * it:</p>
 | 
			
		||||
 * 
 | 
			
		||||
 * <ul>
 | 
			
		||||
 * <li>This class can be instantiated and registered to the MBean server by 
 | 
			
		||||
 * 	simply calling {@link MBeanServer#createMBean(String, ObjectName)}, 
 | 
			
		||||
 *  resulting in the automatic creation of all known default Sigar MBeans such 
 | 
			
		||||
 *  as CPU and memory monitoring beans.</li>
 | 
			
		||||
 * <li>Any Sigar MBean spawned by an instance of this class will use the same
 | 
			
		||||
 * 	{@link org.hyperic.sigar.Sigar} instance, saving resources in the 
 | 
			
		||||
 *  process.</li>
 | 
			
		||||
 * <li>When this instance is deregistered from the MBean server, it will 
 | 
			
		||||
 * 	automatically deregister all instances it created, cleaning up behind 
 | 
			
		||||
 *  itself.</li>
 | 
			
		||||
 * </ul>
 | 
			
		||||
 * 
 | 
			
		||||
 * <p>So using this class to manage the Sigar MBeans requires one line of code 
 | 
			
		||||
 * for creation, registration and MBean spawning, and one line of code to shut 
 | 
			
		||||
 * it all down again.</p>
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Bjoern Martin
 | 
			
		||||
 * @since 1.4 (2007-04)
 | 
			
		||||
 */
 | 
			
		||||
public class SigarRegistry extends AbstractMBean {
 | 
			
		||||
 | 
			
		||||
	private static final String MBEAN_TYPE = "SigarRegistry";
 | 
			
		||||
 | 
			
		||||
	private static final MBeanInfo MBEAN_INFO;
 | 
			
		||||
	private static final MBeanConstructorInfo MBEAN_CONSTR_DEFAULT;
 | 
			
		||||
	
 | 
			
		||||
	static {
 | 
			
		||||
		MBEAN_CONSTR_DEFAULT = new MBeanConstructorInfo(
 | 
			
		||||
				SigarRegistry.class.getName(),
 | 
			
		||||
				"Creates a new instance of this class. Will create the Sigar " +
 | 
			
		||||
				"instance this class uses when constructing other MBeans",
 | 
			
		||||
				new MBeanParameterInfo[0]);
 | 
			
		||||
		
 | 
			
		||||
		MBEAN_INFO = new MBeanInfo(
 | 
			
		||||
				SigarRegistry.class.getName(),
 | 
			
		||||
				"Sigar MBean registry. Provides a central point for creation " +
 | 
			
		||||
				"and destruction of Sigar MBeans. Any Sigar MBean created via " +
 | 
			
		||||
				"this instance will automatically be cleaned up when this " +
 | 
			
		||||
				"instance is deregistered from the MBean server.",
 | 
			
		||||
				null /*new MBeanAttributeInfo[0]*/,
 | 
			
		||||
				new MBeanConstructorInfo[]{
 | 
			
		||||
					MBEAN_CONSTR_DEFAULT},
 | 
			
		||||
					null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private final String objectName;
 | 
			
		||||
 | 
			
		||||
	private final ArrayList managedBeans;
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new instance of this class. Will create the Sigar instance this 
 | 
			
		||||
	 * class uses when constructing other MBeans.
 | 
			
		||||
	 */
 | 
			
		||||
	public SigarRegistry () {
 | 
			
		||||
		super(new Sigar(), CACHELESS);
 | 
			
		||||
		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
 | 
			
		||||
				+ MBEAN_ATTR_TYPE + "=" + MBEAN_TYPE;
 | 
			
		||||
		this.managedBeans = new ArrayList();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * @see AbstractMBean#getObjectName()
 | 
			
		||||
	 */
 | 
			
		||||
	public String getObjectName() {
 | 
			
		||||
		return this.objectName;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#getMBeanInfo()
 | 
			
		||||
	 */
 | 
			
		||||
	public MBeanInfo getMBeanInfo() {
 | 
			
		||||
		return MBEAN_INFO;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
 | 
			
		||||
	 */
 | 
			
		||||
	public Object getAttribute(String attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
 | 
			
		||||
		throw new AttributeNotFoundException(attr.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* (non-Javadoc)
 | 
			
		||||
	 * @see javax.management.DynamicMBean#invoke(java.lang.String, java.lang.Object[], java.lang.String[])
 | 
			
		||||
	 */
 | 
			
		||||
	public Object invoke(String action, Object[] params, String[] signatures)
 | 
			
		||||
			throws MBeanException, ReflectionException {
 | 
			
		||||
		throw new ReflectionException(new NoSuchMethodException(action), action);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	// -------
 | 
			
		||||
	// Implementation of the MBeanRegistration interface
 | 
			
		||||
	// -------
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Registers the default set of Sigar MBeans. Before doing so, a super call 
 | 
			
		||||
	 * is made to satisfy {@link AbstractMBean}.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see AbstractMBean#postRegister(Boolean)
 | 
			
		||||
	 */
 | 
			
		||||
	public void postRegister(Boolean success) {
 | 
			
		||||
		
 | 
			
		||||
		super.postRegister(success);
 | 
			
		||||
		
 | 
			
		||||
		if (!success.booleanValue())
 | 
			
		||||
			return;
 | 
			
		||||
		
 | 
			
		||||
		// get CPUs
 | 
			
		||||
		registerCpuBeans();
 | 
			
		||||
		
 | 
			
		||||
		// get memory
 | 
			
		||||
		registerMemoryBeans();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Registers MBeans for the Sigar types <code>Cpu</code>, <code>CpuPerc</code>
 | 
			
		||||
	 *  and <code>CpuInfo</code>. One instance will be registered for each CPU 
 | 
			
		||||
	 *  (core?) found.
 | 
			
		||||
	 */
 | 
			
		||||
	private void registerCpuBeans() {
 | 
			
		||||
		ObjectInstance nextRegistered = null;
 | 
			
		||||
		
 | 
			
		||||
		try {
 | 
			
		||||
			final int cpuCount = sigar.getCpuInfoList().length;
 | 
			
		||||
			for (int i = 0; i < cpuCount; i++) {
 | 
			
		||||
				SigarCpu nextCpu = new SigarCpu(sigarImpl, i);
 | 
			
		||||
				SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i);
 | 
			
		||||
				SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i);
 | 
			
		||||
				try {
 | 
			
		||||
					if (!mbeanServer.isRegistered(new ObjectName(nextCpu.getObjectName())))
 | 
			
		||||
						nextRegistered = mbeanServer.registerMBean(nextCpu, null);
 | 
			
		||||
				} catch (Exception e) { // ignore
 | 
			
		||||
				}
 | 
			
		||||
				// add MBean to set of managed beans
 | 
			
		||||
				managedBeans.add(nextRegistered.getObjectName());
 | 
			
		||||
				try {
 | 
			
		||||
					if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc.getObjectName())))
 | 
			
		||||
						nextRegistered = mbeanServer.registerMBean(nextCpuPerc, null);
 | 
			
		||||
				} catch (Exception e) { // ignore
 | 
			
		||||
				}
 | 
			
		||||
				// add MBean to set of managed beans
 | 
			
		||||
				managedBeans.add(nextRegistered.getObjectName());
 | 
			
		||||
				try {
 | 
			
		||||
					if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo.getObjectName())))
 | 
			
		||||
						nextRegistered = mbeanServer.registerMBean(nextCpuInfo, null);
 | 
			
		||||
				} catch (Exception e) { // ignore
 | 
			
		||||
				}
 | 
			
		||||
				// add MBean to set of managed beans
 | 
			
		||||
				managedBeans.add(nextRegistered.getObjectName());
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
		} catch (SigarException e) {
 | 
			
		||||
			throw unexpectedError("CpuInfoList", e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Registers MBeans for the Sigar types <code>Mem</code> and <code>Swap</code>. 
 | 
			
		||||
	 */
 | 
			
		||||
	private void registerMemoryBeans() {
 | 
			
		||||
		
 | 
			
		||||
		ObjectInstance nextRegistered = null;
 | 
			
		||||
		
 | 
			
		||||
		SigarMem mem = new SigarMem(sigarImpl);
 | 
			
		||||
		
 | 
			
		||||
		try {
 | 
			
		||||
			if (!mbeanServer.isRegistered(new ObjectName(mem.getObjectName())))
 | 
			
		||||
				nextRegistered = mbeanServer.registerMBean(mem, null);
 | 
			
		||||
		} catch (Exception e) { // ignore
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// add MBean to set of managed beans
 | 
			
		||||
		managedBeans.add(nextRegistered.getObjectName());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Deregisters all Sigar MBeans that were created and registered using this 
 | 
			
		||||
	 * instance. After doing so, a super call is made to satisfy {@link AbstractMBean}.
 | 
			
		||||
	 * @throws Exception 
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @see AbstractMBean#preDeregister()
 | 
			
		||||
	 */
 | 
			
		||||
	public void preDeregister() throws Exception {
 | 
			
		||||
		
 | 
			
		||||
		// count backwards to remove ONs immediately
 | 
			
		||||
		for (int i = managedBeans.size() - 1; i >= 0; i--) {
 | 
			
		||||
			ObjectName next = (ObjectName) managedBeans.remove(i);
 | 
			
		||||
			if (mbeanServer.isRegistered(next)) {
 | 
			
		||||
				try {
 | 
			
		||||
					mbeanServer.unregisterMBean(next);
 | 
			
		||||
				} catch (Exception e) { // ignore
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// do the super call
 | 
			
		||||
		super.preDeregister();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user