diff --git a/bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java b/bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java index f1e55a94..9d22f2c5 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/AbstractMBean.java @@ -43,230 +43,226 @@ import org.hyperic.sigar.SigarProxyCache; * implement subset of them. * * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public abstract class AbstractMBean implements DynamicMBean, MBeanRegistration { - protected static final String MBEAN_ATTR_TYPE = "type"; + protected static final String MBEAN_ATTR_TYPE = "type"; - protected static final short CACHED_30SEC = 0; + protected static final short CACHED_30SEC = 0; - protected static final short CACHED_5SEC = 1; + protected static final short CACHED_5SEC = 1; - protected static final short CACHED_500MS = 2; + protected static final short CACHED_500MS = 2; - protected static final short CACHELESS = 3; + protected static final short CACHELESS = 3; - protected static final short DEFAULT = CACHED_30SEC; + 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 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 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 null when - * the deregistration finished. - * - * @see #preRegister(MBeanServer, ObjectName) - * @see #postDeregister() - */ - protected MBeanServer mbeanServer; + /** + * The MBean server this MBean is registered to. Set during the MBean's + * registration to the MBean server and unset to null when + * the deregistration finished. + * + * @see #preRegister(MBeanServer, ObjectName) + * @see #postDeregister() + */ + protected MBeanServer mbeanServer; - /** - *

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 cacheMode parameter specifies.

- * - *

The following cache modes exist:

- * - * - * - * - * - * - * - * - *
ConstantDescription
{@link #CACHELESS}No cached instance, {@link #sigar} - * == {@link #sigarImpl}.
{@link #CACHED_500MS}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.
{@link #CACHED_5SEC}5 second cache, for high frequency - * queries on calculated data such as CPU percentages.
{@link #CACHED_30SEC}30 second cache, for normal queries - * or data readouts such as CPU model / vendor. This is the default if - * nothing (0) is specified.
{@link #DEFAULT}Same as {@link #CACHED_30SEC}.
- * - *

Note: 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.

- * - * @param sigar The Sigar impl to use. Must not be null - * @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); - } - } + /** + *

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 cacheMode parameter specifies.

+ * + *

The following cache modes exist:

+ * + * + * + * + * + * + * + * + *
ConstantDescription
{@link #CACHELESS}No cached instance, {@link #sigar} + * == {@link #sigarImpl}.
{@link #CACHED_500MS}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.
{@link #CACHED_5SEC}5 second cache, for high frequency + * queries on calculated data such as CPU percentages.
{@link #CACHED_30SEC}30 second cache, for normal queries + * or data readouts such as CPU model / vendor. This is the default if + * nothing (0) is specified.
{@link #DEFAULT}Same as {@link #CACHED_30SEC}.
+ * + *

Note: 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.

+ * + * @param sigar The Sigar impl to use. Must not be null + * @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; - /** - * Returns the object name the MBean is registered with within the - * MBeanServer. May be null in case the instance is not - * registered to an MBeanServer, but used standalone. - * - * @return The object name or null if not registered to an - * MBeanServer - */ - public abstract String getObjectName(); + // create a cached instance as well + if (cacheMode == CACHELESS) { + // no cached version + this.sigar = this.sigarImpl; - /** - * 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); - } + } else if (cacheMode == CACHED_500MS) { + // 500ms cached version (for 1/sec queries) + this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 500); - /** - * 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; - } + } else if (cacheMode == CACHED_5SEC) { + // 5sec cached version (for avg'd queries) + this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 5000); - /** - * 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; - } + } 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 null in case the instance is not + * registered to an MBeanServer, but used standalone. + * + * @return The object name or null if not registered to an + * MBeanServer + */ + public abstract String getObjectName(); - - // ------- - // Implementation of the MBeanRegistration interface - // ------- - - /** - *

Returns new ObjectName(this.getObjectName()) to guarantee - * a reliable and reproducable object name.

- * - *

Note: Make sure any subclass does a super call to this method, - * otherwise the implementation might be broken.

- * - * @see MBeanRegistration#preRegister(MBeanServer, ObjectName) - */ - public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { - this.mbeanServer = server; - return new ObjectName(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); + } - /** - * Empty implementation, allowing aubclasses to ignore the interface. - * - *

Note: Make sure any subclass does a super call to this method, - * otherwise the implementation might be broken.

- * - * @see MBeanRegistration#postRegister(Boolean) - */ - public void postRegister(Boolean success) { - } + /** + * 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; + } - /** - * Empty implementation, allowing aubclasses to ignore the interface. - * - *

Note: Make sure any subclass does a super call to this method, - * otherwise the implementation might be broken.

- * - * @see MBeanRegistration#preDeregister() - */ - public void preDeregister() throws Exception { - } + /** + * 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; + } - /** - * Empty implementation, allowing aubclasses to ignore the interface. - * - *

Note: Make sure any subclass does a super call to this method, - * otherwise the implementation might be broken.

- * - * @see MBeanRegistration#postDeregister() - */ - public void postDeregister() { - this.mbeanServer = null; - } + // ------- + // Implementation of the MBeanRegistration interface + // ------- + + /** + *

Returns new ObjectName(this.getObjectName()) to guarantee + * a reliable and reproducable object name.

+ * + *

Note: Make sure any subclass does a super call to this method, + * otherwise the implementation might be broken.

+ * + * @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. + * + *

Note: Make sure any subclass does a super call to this method, + * otherwise the implementation might be broken.

+ * + * @see MBeanRegistration#postRegister(Boolean) + */ + public void postRegister(Boolean success) { + } + + /** + * Empty implementation, allowing aubclasses to ignore the interface. + * + *

Note: Make sure any subclass does a super call to this method, + * otherwise the implementation might be broken.

+ * + * @see MBeanRegistration#preDeregister() + */ + public void preDeregister() throws Exception { + } + + /** + * Empty implementation, allowing aubclasses to ignore the interface. + * + *

Note: Make sure any subclass does a super call to this method, + * otherwise the implementation might be broken.

+ * + * @see MBeanRegistration#postDeregister() + */ + public void postDeregister() { + this.mbeanServer = null; + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java index cde0a1dc..f1f6453a 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpu.java @@ -30,314 +30,305 @@ import org.hyperic.sigar.Sigar; import org.hyperic.sigar.SigarException; /** - * Sigar JMX MBean implementation for the Cpu information package. - * Provides an OpenMBean conform implementation. + * Sigar JMX MBean implementation for the Cpu information + * package. Provides an OpenMBean conform implementation. * * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarCpu extends AbstractMBean { - private static final String MBEAN_TYPE = "CpuList"; + private static final String MBEAN_TYPE = "CpuList"; - private static final MBeanInfo MBEAN_INFO; - - private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; + private static final MBeanInfo MBEAN_INFO; - private static final MBeanAttributeInfo MBEAN_ATTR_IDLE; + private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; - private static final MBeanAttributeInfo MBEAN_ATTR_NICE; + private static final MBeanAttributeInfo MBEAN_ATTR_IDLE; - private static final MBeanAttributeInfo MBEAN_ATTR_SYS; + private static final MBeanAttributeInfo MBEAN_ATTR_NICE; - private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; + private static final MBeanAttributeInfo MBEAN_ATTR_SYS; - private static final MBeanAttributeInfo MBEAN_ATTR_USER; + private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; - private static final MBeanAttributeInfo MBEAN_ATTR_WAIT; + private static final MBeanAttributeInfo MBEAN_ATTR_USER; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; + private static final MBeanAttributeInfo MBEAN_ATTR_WAIT; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; - private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; - 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); - - } + private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX; - /** - * Index of the CPU processed by the instance. - */ - private final int cpuIndex; + private static MBeanParameterInfo MBEAN_PARAM_SIGAR; - /** - * Object name this instance will give itself when being registered to an - * MBeanServer. - */ - private final String objectName; + 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); - /** - * 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 - * >= 0 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 - * >= 0 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); + /** + * Index of the CPU processed by the instance. + */ + private final int cpuIndex; - // 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. + */ + private final String objectName; - /** - * 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); - } - } + /** + * 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 >= 0 + * 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); + } - - - // ------- - // 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); - } - } + /** + * 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 + * >= 0 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); - /* - * (non-Javadoc) - * @see DynamicMBean#setAttribute(Attribute) - */ - public void setAttribute(Attribute attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr.getName()); - } + // 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); - /* - * (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; - } + } 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; + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java index de051937..500ebed1 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java @@ -34,269 +34,253 @@ import org.hyperic.sigar.SigarException; * package. Provides an OpenMBean conform implementation. * * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarCpuInfo extends AbstractMBean { - private static final String MBEAN_TYPE = "CpuInfoList"; + private static final String MBEAN_TYPE = "CpuInfoList"; - private static final MBeanInfo MBEAN_INFO; - - private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; + private static final MBeanInfo MBEAN_INFO; - private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE; + private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; - private static final MBeanAttributeInfo MBEAN_ATTR_MHZ; + private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE; - private static final MBeanAttributeInfo MBEAN_ATTR_MODEL; + private static final MBeanAttributeInfo MBEAN_ATTR_MHZ; - private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR; + private static final MBeanAttributeInfo MBEAN_ATTR_MODEL; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; + private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; - private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; - 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( - SigarCpuInfo.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( - SigarCpuInfo.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( - SigarCpuInfo.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; + private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX; - /** - * Object name this instance will give itself when being registered to an - * MBeanServer. - */ - private String objectName; + private static final MBeanParameterInfo MBEAN_PARAM_SIGAR; - /** - * 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 - * >= 0 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); - } + 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(SigarCpuInfo.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( + SigarCpuInfo.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( + SigarCpuInfo.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); - /** - * 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 - * >= 0 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; - } + /** + * Index of the CPU processed by the instance. + */ + private int 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); - } - } + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + private String objectName; - /** - * @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); - } - } + /** + * 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 + * >= 0 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); + } - /** - * @return The CPU model reported - */ - public String getModel() { - try { - return sigar.getCpuInfoList()[this.cpuIndex].getModel(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + /** + * 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 + * >= 0 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); - /** - * @return The CPU vendor reported - */ - public String getVendor() { - try { - return sigar.getCpuInfoList()[this.cpuIndex].getVendor(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + // 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); - - - // ------- - // 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); - } - } + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } - /* - * (non-Javadoc) - * @see DynamicMBean#setAttribute(Attribute) - */ - public void setAttribute(Attribute attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr.getName()); - } + // 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; + } - /* - * (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; - } + /** + * 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; + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java index e3aec998..f53682b2 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java @@ -34,312 +34,300 @@ import org.hyperic.sigar.SigarException; * package. Provides an OpenMBean conform implementation.

* * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarCpuPerc extends AbstractMBean { - private static final String MBEAN_TYPE = "CpuPercList"; + private static final String MBEAN_TYPE = "CpuPercList"; - private static final MBeanInfo MBEAN_INFO; - - private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; + private static final MBeanInfo MBEAN_INFO; - private static final MBeanAttributeInfo MBEAN_ATTR_COMBINED; + private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX; - private static final MBeanAttributeInfo MBEAN_ATTR_IDLE; + private static final MBeanAttributeInfo MBEAN_ATTR_COMBINED; - private static final MBeanAttributeInfo MBEAN_ATTR_NICE; + private static final MBeanAttributeInfo MBEAN_ATTR_IDLE; - private static final MBeanAttributeInfo MBEAN_ATTR_SYS; + private static final MBeanAttributeInfo MBEAN_ATTR_NICE; - private static final MBeanAttributeInfo MBEAN_ATTR_USER; + private static final MBeanAttributeInfo MBEAN_ATTR_SYS; - private static final MBeanAttributeInfo MBEAN_ATTR_WAIT; + private static final MBeanAttributeInfo MBEAN_ATTR_USER; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; + private static final MBeanAttributeInfo MBEAN_ATTR_WAIT; - private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX; - private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX; + private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR; - 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( - SigarCpuPerc.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( - SigarCpuPerc.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( - SigarCpuPerc.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); - } + private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX; - /** - * Index of the CPU processed by the instance. - */ - private int cpuIndex; + private static MBeanParameterInfo MBEAN_PARAM_SIGAR; - /** - * Object name this instance will give itself when being registered to an - * MBeanServer. - */ - private String objectName; + 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(SigarCpuPerc.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( + SigarCpuPerc.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( + SigarCpuPerc.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); + } - /** - * 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 - * >= 0 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); - } + /** + * Index of the CPU processed by the instance. + */ + private int 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 - * >= 0 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); + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + private String objectName; - // 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); + /** + * 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 + * >= 0 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); + } - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } + /** + * 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 + * >= 0 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); - // 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; - } + // 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); - /** - * Object name this instance will give itself when being registered to an - * MBeanServer. - */ - public String getObjectName() { - return this.objectName; - } + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } - /** - * @return The index of the CPU, typically starting at 0 - */ - public int getCpuIndex() { - return this.cpuIndex; - } + // 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; + } - /** - * @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); - } - } + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + public String getObjectName() { + return this.objectName; + } - /** - * @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 index of the CPU, typically starting at 0 + */ + public int getCpuIndex() { + return this.cpuIndex; + } - /** - * @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 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 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 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 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 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 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); - } - } + /** + * @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); + } + } - - - // ------- - // 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); - } - } + /** + * @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); + } + } - /* - * (non-Javadoc) - * @see DynamicMBean#setAttribute(Attribute) - */ - public void setAttribute(Attribute attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr.getName()); - } + /** + * @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); + } + } - /* - * (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; - } + // ------- + // 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; + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java new file mode 100644 index 00000000..586f419e --- /dev/null +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java @@ -0,0 +1,263 @@ +/* + * 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; +import org.hyperic.sigar.SigarNotImplementedException; + +/** + * Sigar JMX MBean implementation for the LoadAverage information + * package. Provides an OpenMBean conform implementation. + * + * @author Bjoern Martin + * @since 1.5 + */ +public class SigarLoadAverage extends AbstractMBean { + + private static final String MBEAN_TYPE = "LoadAverage"; + + /** + * Returned if {@link Sigar#getLoadAverage()}} is detected to be not + * implemented on the platform. + * + * @see #notImplemented + */ + private static final double NOT_IMPLEMENTED_LOAD_VALUE = -1.0d; + + private static final MBeanInfo MBEAN_INFO; + + private static final MBeanAttributeInfo MBEAN_ATTR_LAST1MIN; + + private static final MBeanAttributeInfo MBEAN_ATTR_LAST5MIN; + + private static final MBeanAttributeInfo MBEAN_ATTR_LAST15MIN; + + private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; + + private static MBeanParameterInfo MBEAN_PARAM_SIGAR; + + static { + MBEAN_ATTR_LAST1MIN = new MBeanAttributeInfo( + "LastMinute", + "double", + "The load average in the last minute, as a fraction of 1, or " + + "-1.0 if the load cannot be determined on this platform", + true, false, false); + MBEAN_ATTR_LAST5MIN = new MBeanAttributeInfo( + "LastFiveMinutes", + "double", + "The load average over the last five minutes, as a fraction " + + "of 1, or -1.0 if the load cannot be determined on this platform", + true, false, false); + MBEAN_ATTR_LAST15MIN = new MBeanAttributeInfo( + "Last15Minutes", + "double", + "The load average over the last 15 minutes, as a fraction of " + + "1, or -1.0 if the load cannot be determined on this platform", + 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( + SigarLoadAverage.class.getName(), + "Creates a new instance, using the Sigar instance specified " + + "to fetch the data. Fails if the CPU index is out of range.", + new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR }); + MBEAN_INFO = new MBeanInfo( + SigarLoadAverage.class.getName(), + "Sigar load average MBean. Provides load averages of the " + + "system over the last one, five and 15 minutes. Due to the " + + "long term character of that information, the fetch is done " + + "using a Sigar proxy cache with a timeout of 30 seconds.", + new MBeanAttributeInfo[] { MBEAN_ATTR_LAST1MIN, + MBEAN_ATTR_LAST5MIN, MBEAN_ATTR_LAST15MIN }, + new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null); + + } + + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + private final String objectName; + + /** + *

Set true when the load average fetch failed with a + * SigarException that indicates the method is not implemented. + * Any subsequent call to this instance will then be answered with + * {@link #NOT_IMPLEMENTED_LOAD_VALUE}. + *

+ * + *

FIXME : This is a workaround and should be replaced by something + * more stable, as the code setting this member true relies on + * a substring being present within the exception. A proposal was made at + * issue SIGAR-52. + *

+ */ + private boolean notImplemented; + + /** + * Creates a new instance, using a new Sigar instance to fetch the data. + * + * @throws IllegalArgumentException + * If an unexpected Sigar error occurs. + */ + public SigarLoadAverage() throws IllegalArgumentException { + this(new Sigar()); + } + + /** + * 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 SigarLoadAverage(Sigar sigar) throws IllegalArgumentException { + super(sigar, CACHED_30SEC); + + // all fine + this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE + + "=" + MBEAN_TYPE; + } + + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + public String getObjectName() { + return this.objectName; + } + + /** + * @return The load average in the last minute, as a fraction of 1, or + * -1.0d if the load cannot be determined on this platform + */ + public double getLastMinute() { + try { + return sigarImpl.getLoadAverage()[0]; + + } catch (SigarNotImplementedException e) { + return NOT_IMPLEMENTED_LOAD_VALUE; + + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } + + /** + * @return The load average over the last five minutes, as a fraction of 1, + * or -1.0d if the load cannot be determined on this + * platform + */ + public double getLastFiveMinutes() { + try { + return sigarImpl.getLoadAverage()[1]; + + } catch (SigarNotImplementedException e) { + return NOT_IMPLEMENTED_LOAD_VALUE; + + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } + + /** + * @return The load average over the last 15 minutes, as a fraction of 1, or + * -1.0d if the load cannot be determined on this platform + */ + public double getLast15Minutes() { + try { + return sigarImpl.getLoadAverage()[2]; + + } catch (SigarNotImplementedException e) { + return NOT_IMPLEMENTED_LOAD_VALUE; + + } 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_LAST1MIN.getName().equals(attr)) { + return new Double(getLastMinute()); + + } else if (MBEAN_ATTR_LAST5MIN.getName().equals(attr)) { + return new Double(getLastFiveMinutes()); + + } else if (MBEAN_ATTR_LAST15MIN.getName().equals(attr)) { + return new Double(getLast15Minutes()); + + } 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; + } +} diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java index 13bc1604..bf7c1ea3 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java @@ -35,238 +35,217 @@ import org.hyperic.sigar.SigarException; * package. Provides an OpenMBean conform implementation. * * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarMem extends AbstractMBean { - private static final String MBEAN_TYPE = "Mem"; + private static final String MBEAN_TYPE = "Mem"; - private static final MBeanInfo MBEAN_INFO; - - private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE; + private static final MBeanInfo MBEAN_INFO; - private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED; + private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE; - private static final MBeanAttributeInfo MBEAN_ATTR_FREE; + private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED; - private static final MBeanAttributeInfo MBEAN_ATTR_RAM; + private static final MBeanAttributeInfo MBEAN_ATTR_FREE; - private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; + private static final MBeanAttributeInfo MBEAN_ATTR_RAM; - private static final MBeanAttributeInfo MBEAN_ATTR_USED; + private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; - private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; + private static final MBeanAttributeInfo MBEAN_ATTR_USED; - 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( - SigarMem.class.getName(), - "Creates a new instance, using the Sigar instance " + - "specified to fetch the data.", - new MBeanParameterInfo[]{ - MBEAN_PARAM_SIGAR}); - MBEAN_INFO = new MBeanInfo( - SigarMem.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; + private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; - /** - * 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); + private static MBeanParameterInfo MBEAN_PARAM_SIGAR; - this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE - + "=Memory"; - } + 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(SigarMem.class.getName(), + "Creates a new instance, using the Sigar instance " + + "specified to fetch the data.", + new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR }); + MBEAN_INFO = new MBeanInfo( + SigarMem.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. - */ - 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); - } - } + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + private final String objectName; - /** - * @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); - } - } + /** + * 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); - /** - * @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); - } - } + this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE + + "=Memory"; + } - /** - * @return The amount of physical memory, in [bytes] - */ - public long getRam() { - try { - return sigar.getMem().getRam(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + public String getObjectName() { + return this.objectName; + } - /** - * @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 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 amount of physical memory in use, in [bytes] - */ - public long getUsed() { - try { - return sigar.getMem().getUsed(); - } 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); + } + } - // ------- - // Implementation of the DynamicMBean interface - // ------- + /** + * @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); + } + } - /* - * (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()); + /** + * @return The amount of physical memory, in [bytes] + */ + public long getRam() { + try { + return sigar.getMem().getRam(); + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } - } else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) { - return new Long(getActualUsed()); + /** + * @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); + } + } - } else if (MBEAN_ATTR_FREE.getName().equals(attr)) { - return new Long(getFree()); + /** + * @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); + } + } - } else if (MBEAN_ATTR_RAM.getName().equals(attr)) { - return new Long(getRam()); + // ------- + // Implementation of the DynamicMBean interface + // ------- - } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) { - return new Long(getTotal()); + /* + * (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_USED.getName().equals(attr)) { - return new Long(getUsed()); + } else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) { + return new Long(getActualUsed()); - } else { - throw new AttributeNotFoundException(attr); - } - } + } else if (MBEAN_ATTR_FREE.getName().equals(attr)) { + return new Long(getFree()); - /* - * (non-Javadoc) - * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute) - */ - public void setAttribute(Attribute attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr.getName()); - } + } else if (MBEAN_ATTR_RAM.getName().equals(attr)) { + return new Long(getRam()); - /* - * (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); - } + } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) { + return new Long(getTotal()); - /* - * (non-Javadoc) - * @see javax.management.DynamicMBean#getMBeanInfo() - */ - public MBeanInfo getMBeanInfo() { - return MBEAN_INFO; - } + } 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; + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java index 11a14af9..43fc091f 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java @@ -41,14 +41,14 @@ import org.hyperic.sigar.SigarException; * * * @@ -57,222 +57,286 @@ import org.hyperic.sigar.SigarException; * it all down again.

* * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarRegistry extends AbstractMBean { - private static final String MBEAN_TYPE = "SigarRegistry"; + 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 static final MBeanInfo MBEAN_INFO; - private final String objectName; + private static final MBeanConstructorInfo MBEAN_CONSTR_DEFAULT; - 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; - } +// private static final MBeanOperationInfo MBEAN_OPER_LISTPROCESSES; - /* (non-Javadoc) - * @see javax.management.DynamicMBean#getAttribute(java.lang.String) - */ - public Object getAttribute(String attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr); - } + 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_OPER_LISTPROCESSES = new MBeanOperationInfo("listProcesses", +// "Executes a query returning the process IDs of all processes " + +// "found on the system.", +// null /* new MBeanParameterInfo[0] */, +// String.class.getName(), MBeanOperationInfo.INFO); - /* (non-Javadoc) - * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute) - */ - public void setAttribute(Attribute attr) throws AttributeNotFoundException { - throw new AttributeNotFoundException(attr.getName()); - } + 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 /*new MBeanOperationInfo[0] */, + null /*new MBeanNotificationInfo[0]*/); + } - /* (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); - } - + private final String objectName; - - - // ------- - // 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(); - } + private final ArrayList managedBeans; - /** - * Registers MBeans for the Sigar types Cpu, CpuPerc - * and CpuInfo. 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++) { - // add CPU bean - SigarCpu nextCpu = new SigarCpu(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 - if (nextRegistered != null) - managedBeans.add(nextRegistered.getObjectName()); - nextRegistered = null; - - // add CPU percentage bean - SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i); - try { - if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc.getObjectName()))) - nextRegistered = mbeanServer.registerMBean(nextCpuPerc, null); - } catch (Exception e) { // ignore - } - // add MBean to set of managed beans - if (nextRegistered != null) - managedBeans.add(nextRegistered.getObjectName()); - nextRegistered = null; - - // add CPU info bean - SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i); - try { - if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo.getObjectName()))) - nextRegistered = mbeanServer.registerMBean(nextCpuInfo, null); - } catch (Exception e) { // ignore - } - // add MBean to set of managed beans - if (nextRegistered != null) - managedBeans.add(nextRegistered.getObjectName()); - nextRegistered = null; - } - - } catch (SigarException e) { - throw unexpectedError("CpuInfoList", e); - } - } - - /** - * Registers MBeans for the Sigar types Mem and Swap. - */ - private void registerMemoryBeans() { - - ObjectInstance nextRegistered = null; - - // add physical memory bean - 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 - if (nextRegistered != null) - managedBeans.add(nextRegistered.getObjectName()); - nextRegistered = null; - - // add swap memory bean - SigarSwap swap = new SigarSwap(sigarImpl); - try { - if (!mbeanServer.isRegistered(new ObjectName(swap.getObjectName()))) - nextRegistered = mbeanServer.registerMBean(swap, null); - } catch (Exception e) { // ignore - nextRegistered = null; - } - - // add MBean to set of managed beans - if (nextRegistered != null) - managedBeans.add(nextRegistered.getObjectName()); - nextRegistered = null; - } - - /** - * 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(); - } + /** + * 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(); + } + + /* (non-Javadoc) + * @see AbstractMBean#getObjectName() + */ + public String getObjectName() { + return this.objectName; + } + +/* public String listProcesses() { + try { + final long start = System.currentTimeMillis(); + long[] ids = sigar.getProcList(); + StringBuffer procNames = new StringBuffer(); + for (int i = 0; i < ids.length; i++) { + try { + procNames.append(ids[i] + ":" + sigar.getProcExe(ids[i]).getName()).append('\n'); + } catch (SigarException e) { + procNames.append(ids[i] + ":" + e.getMessage()).append('\n'); + } + } + + final long end = System.currentTimeMillis(); + procNames.append("-- Took " + (end-start) + "ms"); + return procNames.toString(); + + } catch (SigarException e) { + throw unexpectedError("ProcList", e); + } + } +*/ + /* (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 { + +/* if (MBEAN_OPER_LISTPROCESSES.getName().equals(action)) + return listProcesses(); + + else */ + throw new ReflectionException(new NoSuchMethodException(action), action); + } + + /* (non-Javadoc) + * @see javax.management.DynamicMBean#getMBeanInfo() + */ + public MBeanInfo getMBeanInfo() { + return MBEAN_INFO; + } + + // ------- + // 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(); + + // get system + registerSystemBeans(); + } + + /** + * Registers MBeans for the Sigar types Cpu, CpuPerc + * and CpuInfo. 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++) { + // add CPU bean + SigarCpu nextCpu = new SigarCpu(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 + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + + // add CPU percentage bean + SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i); + try { + if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc + .getObjectName()))) + nextRegistered = mbeanServer.registerMBean(nextCpuPerc, + null); + } catch (Exception e) { // ignore + } + // add MBean to set of managed beans + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + + // add CPU info bean + SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i); + try { + if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo + .getObjectName()))) + nextRegistered = mbeanServer.registerMBean(nextCpuInfo, + null); + } catch (Exception e) { // ignore + } + // add MBean to set of managed beans + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + } + + } catch (SigarException e) { + throw unexpectedError("CpuInfoList", e); + } + } + + /** + * Registers MBeans for the Sigar types Mem and Swap. + */ + private void registerMemoryBeans() { + + ObjectInstance nextRegistered = null; + + // add physical memory bean + 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 + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + + // add swap memory bean + SigarSwap swap = new SigarSwap(sigarImpl); + try { + if (!mbeanServer.isRegistered(new ObjectName(swap.getObjectName()))) + nextRegistered = mbeanServer.registerMBean(swap, null); + } catch (Exception e) { // ignore + nextRegistered = null; + } + + // add MBean to set of managed beans + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + } + + /** + * Registers MBeans for the Sigar types LoadAverage... + */ + private void registerSystemBeans() { + + ObjectInstance nextRegistered = null; + + // add load average bean + SigarLoadAverage loadAvg = new SigarLoadAverage(sigarImpl); + + try { + if (!mbeanServer.isRegistered(new ObjectName(loadAvg + .getObjectName()))) + nextRegistered = mbeanServer.registerMBean(loadAvg, null); + } catch (Exception e) { // ignore + } + + // add MBean to set of managed beans + if (nextRegistered != null) + managedBeans.add(nextRegistered.getObjectName()); + nextRegistered = null; + } + + /** + * 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(); + } } diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java index 8ce05816..c209d32f 100644 --- a/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java +++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java @@ -35,174 +35,165 @@ import org.hyperic.sigar.SigarException; * package. Provides an OpenMBean conform implementation. * * @author Bjoern Martin - * @since 1.4 (2007-04) + * @since 1.5 */ public class SigarSwap extends AbstractMBean { - private static final String MBEAN_TYPE = "Swap"; + private static final String MBEAN_TYPE = "Swap"; - private static final MBeanInfo MBEAN_INFO; - - private static final MBeanAttributeInfo MBEAN_ATTR_FREE; + private static final MBeanInfo MBEAN_INFO; - private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; + private static final MBeanAttributeInfo MBEAN_ATTR_FREE; - private static final MBeanAttributeInfo MBEAN_ATTR_USED; + private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL; - private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; + private static final MBeanAttributeInfo MBEAN_ATTR_USED; - private static MBeanParameterInfo MBEAN_PARAM_SIGAR; - - static { - MBEAN_ATTR_FREE = new MBeanAttributeInfo( - "Free", "long", - "The amount of free swap memory, in [bytes]", - true, false, false); - MBEAN_ATTR_TOTAL = new MBeanAttributeInfo( - "Total", "long", - "The total amount of swap memory, in [bytes]", - true, false, false); - MBEAN_ATTR_USED = new MBeanAttributeInfo( - "Used", "long", - "The amount of swap memory in use, in [bytes]", - 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( - SigarSwap.class.getName(), - "Creates a new instance, using the Sigar instance " + - "specified to fetch the data.", - new MBeanParameterInfo[]{ - MBEAN_PARAM_SIGAR}); - MBEAN_INFO = new MBeanInfo( - SigarSwap.class.getName(), - "Sigar Swap MBean, provides raw data for the swap memory " + - "configured on the system. Uses an internal cache that " + - "invalidates within 5 seconds.", - new MBeanAttributeInfo[]{ - MBEAN_ATTR_FREE, - 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; + private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; - /** - * 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 SigarSwap(Sigar sigar) throws IllegalArgumentException { - super(sigar, CACHED_5SEC); + private static MBeanParameterInfo MBEAN_PARAM_SIGAR; - this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE - + "=Swap"; - } + static { + MBEAN_ATTR_FREE = new MBeanAttributeInfo("Free", "long", + "The amount of free swap memory, in [bytes]", true, false, + false); + MBEAN_ATTR_TOTAL = new MBeanAttributeInfo("Total", "long", + "The total amount of swap memory, in [bytes]", true, false, + false); + MBEAN_ATTR_USED = new MBeanAttributeInfo("Used", "long", + "The amount of swap memory in use, in [bytes]", 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( + SigarSwap.class.getName(), + "Creates a new instance, using the Sigar instance " + + "specified to fetch the data.", + new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR }); + MBEAN_INFO = new MBeanInfo( + SigarSwap.class.getName(), + "Sigar Swap MBean, provides raw data for the swap memory " + + "configured on the system. Uses an internal cache that " + + "invalidates within 5 seconds.", + new MBeanAttributeInfo[] { MBEAN_ATTR_FREE, 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. - */ - public String getObjectName() { - return this.objectName; - } + } - /** - * @return The amount of free swap memory, in [bytes] - */ - public long getFree() { - try { - return sigar.getSwap().getFree(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + private final String objectName; - /** - * @return The total amount of swap memory, in [bytes] - */ - public long getTotal() { - try { - return sigar.getSwap().getTotal(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + /** + * 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 SigarSwap(Sigar sigar) throws IllegalArgumentException { + super(sigar, CACHED_5SEC); - /** - * @return The amount of swap memory in use, in [bytes] - */ - public long getUsed() { - try { - return sigar.getSwap().getUsed(); - } catch (SigarException e) { - throw unexpectedError(MBEAN_TYPE, e); - } - } + this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE + + "=Swap"; + } - // ------- - // Implementation of the DynamicMBean interface - // ------- + /** + * Object name this instance will give itself when being registered to an + * MBeanServer. + */ + public String getObjectName() { + return this.objectName; + } - /* - * (non-Javadoc) - * - * @see javax.management.DynamicMBean#getAttribute(java.lang.String) - */ - public Object getAttribute(String attr) throws AttributeNotFoundException, - MBeanException, ReflectionException { - if (MBEAN_ATTR_FREE.getName().equals(attr)) { - return new Long(getFree()); + /** + * @return The amount of free swap memory, in [bytes] + */ + public long getFree() { + try { + return sigar.getSwap().getFree(); + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } - } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) { - return new Long(getTotal()); + /** + * @return The total amount of swap memory, in [bytes] + */ + public long getTotal() { + try { + return sigar.getSwap().getTotal(); + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } - } else if (MBEAN_ATTR_USED.getName().equals(attr)) { - return new Long(getUsed()); + /** + * @return The amount of swap memory in use, in [bytes] + */ + public long getUsed() { + try { + return sigar.getSwap().getUsed(); + } catch (SigarException e) { + throw unexpectedError(MBEAN_TYPE, e); + } + } - } else { - throw new AttributeNotFoundException(attr); - } - } + // ------- + // Implementation of the DynamicMBean interface + // ------- - /* - * (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#getAttribute(java.lang.String) + */ + public Object getAttribute(String attr) throws AttributeNotFoundException, + MBeanException, ReflectionException { + if (MBEAN_ATTR_FREE.getName().equals(attr)) { + return new Long(getFree()); - /* - * (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); - } + } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) { + return new Long(getTotal()); - /* - * (non-Javadoc) - * @see javax.management.DynamicMBean#getMBeanInfo() - */ - public MBeanInfo getMBeanInfo() { - return MBEAN_INFO; - } + } 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; + } }