--- old/src/share/classes/java/lang/management/ManagementFactory.java Mon Mar 28 11:54:14 2011 +++ new/src/share/classes/java/lang/management/ManagementFactory.java Mon Mar 28 11:54:13 2011 @@ -40,8 +40,9 @@ import javax.management.StandardEmitterMBean; import javax.management.StandardMBean; import java.util.Collections; -import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.TreeSet; import java.security.AccessController; import java.security.Permission; import java.security.PrivilegedAction; @@ -51,37 +52,63 @@ import sun.management.ManagementFactoryHelper; /** - * The ManagementFactory class is a factory class for getting + * The {@code ManagementFactory} class is a factory class for getting * managed beans for the Java platform. * This class consists of static methods each of which returns - * one or more platform MXBean(s) representing + * one or more platform MXBeans representing * the management interface of a component of the Java virtual * machine. + *
+ *
+ * A platform MXBean is a managed bean that + * conforms to the JMX + * Instrumentation Specification and only uses a set of basic data types. + * A JMX management application and the {@linkplain + * #getPlatformMBeanServer platform MBeanServer} + * can interoperate without requiring classes for MXBean specific + * data types. + * The data types being transmitted between the JMX connector + * server and the connector client are + * {@linkplain javax.management.openmbean.OpenType open types} + * and this allows interoperation across versions. + * See + * the specification of MXBeans for details. * + * + *
Each platform MXBean is a {@link PlatformManagedObject} + * and it has a unique + * {@link javax.management.ObjectName ObjectName} for + * registration in the platform {@code MBeanServer} as returned by + * by the {@link PlatformManagedObject#getObjectName getObjectName} + * method. + * *
* An application can access a platform MXBean in the following ways: + *
** - *- *
+ *- Direct access to an MXBean interface - *
- *- *
- Get the MXBean instance through the static factory method, - * or the {@link #getPlatformMXBeans(Class)} method - * and access the MXBean locally of the running + *
- Get an MXBean instance by calling the + * {@link #getPlatformMXBean(Class) getPlatformMXBean} or + * {@link #getPlatformMXBeans(Class) getPlatformMXBeans} method + * and access the MXBean locally in the running * virtual machine. *
*- Construct an MXBean proxy instance that forwards the * method calls to a given {@link MBeanServer MBeanServer} by calling - * the {@link #newPlatformMXBeanProxy newPlatformMXBeanProxy} method - * or the {@link #getPlatformMXBeans(MBeanServerConnection, Class)} - * method. + * the {@link #getPlatformMXBean(MBeanServerConnection, Class)} or + * {@link #getPlatformMXBeans(MBeanServerConnection, Class)} method. + * The {@link #newPlatformMXBeanProxy newPlatformMXBeanProxy} method + * can also be used to construct an MXBean proxy instance of + * a given {@code ObjectName}. * A proxy is typically constructed to remotely access * an MXBean of another running virtual machine. *
- *- Indirect access to an MXBean interface via MBeanServer - *
- *
- Go through the {@link #getPlatformMBeanServer - * platform MBeanServer} to access MXBeans locally or - * a specific MBeanServerConnection to access + *
2. Indirect access to an MXBean interface via MBeanServer
+ *+ *
+ *- Go through the platform {@code MBeanServer} to access MXBeans + * locally or a specific MBeanServerConnection to access * MXBeans remotely. * The attributes and operations of an MXBean use only * JMX open types which include basic data types, @@ -89,133 +116,19 @@ * and {@link javax.management.openmbean.TabularData TabularData} * defined in * {@link javax.management.openmbean.OpenType OpenType}. - * The mapping is specified below. + * The mapping is specified in + * the {@linkplain javax.management.MXBean MXBean} specification + * for details. *
- * *
- * A JMX management application and the platform MBeanServer - * can interoperate without requiring classes for MXBean specific - * data types. - * The data types being transmitted between the JMX connector - * server and the connector client are - * {@linkplain javax.management.openmbean.OpenType open types} - * and this allows interoperation across versions. + * The {@link #getPlatformManagementInterfaces getPlatformManagementInterfaces} + * method returns all management interfaces supported in the Java virtual machine + * including the standard management interfaces listed in the tables + * below as well as the management interfaces extended by the JDK implementation. *
- * The platform MXBean interfaces use only the following data types: - *
- * When an attribute or operation of a platform MXBean - * is accessed via an MBeanServer, the data types are mapped - * as follows: - *
- * For example, the {@link MemoryMXBean} - * interface has the following getter and setter methods: - * - *
- * - * These attributes in the MBeanInfo - * of the MemoryMXBean have the following names and types: - * - *- * public MemoryUsage getHeapMemoryUsage(); - * public boolean isVerbose(); - * public void setVerbose(boolean value); - *
- *- * - *- *
- *- * - *Attribute Name - *Type - *- * - *HeapMemoryUsage - *{@link MemoryUsage#from - * CompositeData representing MemoryUsage} - *- * - *Verbose - *boolean - *
* MXBeans that get created and destroyed dynamically, for example, * memory {@link MemoryPoolMXBean pools} and * {@link MemoryManagerMXBean managers}, * will automatically be registered and deregistered into the platform - * MBeanServer. + * {@code MBeanServer}. *
- * If the system property javax.management.builder.initial - * is set, the platform MBeanServer creation will be done + * If the system property {@code javax.management.builder.initial} + * is set, the platform {@code MBeanServer} creation will be done * by the specified {@link javax.management.MBeanServerBuilder}. *
* It is recommended that this platform MBeanServer also be used @@ -519,12 +440,12 @@ * to register other application managed beans * besides the platform MXBeans. * This will allow all MBeans to be published through the same - * MBeanServer and hence allow for easier network publishing + * {@code MBeanServer} and hence allow for easier network publishing * and discovery. * Name conflicts with the platform MXBeans should be avoided. * - * @return the platform MBeanServer; the platform - * MXBeans are registered into the platform MBeanServer + * @return the platform {@code MBeanServer}; the platform + * MXBeans are registered into the platform {@code MBeanServer} * at the first time this method is called. * * @exception SecurityException if there is a security manager @@ -671,7 +592,9 @@ try { final ObjectName objName = new ObjectName(mxbeanName); - if (!connection.isInstanceOf(objName, interfaceClass.getName())) { + // skip the isInstanceOf check for LoggingMXBean + String intfName = interfaceClass.getName(); + if (!connection.isInstanceOf(objName, intfName)) { throw new IllegalArgumentException(mxbeanName + " is not an instance of " + interfaceClass); } @@ -683,58 +606,131 @@ // create an MXBean proxy return JMX.newMXBeanProxy(connection, objName, mxbeanInterface, emitter); - } catch (InstanceNotFoundException e) { - final IllegalArgumentException iae = - new IllegalArgumentException(mxbeanName + - " not found in the connection."); - iae.initCause(e); - throw iae; - } catch (MalformedObjectNameException e) { - final IllegalArgumentException iae = - new IllegalArgumentException(mxbeanName + - " is not a valid ObjectName format."); - iae.initCause(e); - throw iae; + } catch (InstanceNotFoundException|MalformedObjectNameException e) { + throw new IllegalArgumentException(e); } } /** - * Returns the list of platform MXBeans that implement - * the given {@code mxbeanInterface} in the running Java + * Returns the platform MXBean implementing + * the given {@code mxbeanInterface} which is specified + * to have one single instance in the Java virtual machine. + * This method may return {@code null} if the management interface + * is not implemented in the Java virtual machine (for example, + * a Java virtual machine with no compilation system does not + * implement {@link CompilationMXBean}); + * otherwise, this method is equivalent to calling: + *
+ * {@link #getPlatformMXBeans(Class) + * getPlatformMXBeans(mxbeanInterface)}.get(0); + *+ * + * @param mxbeanInterface a management interface for a platform + * MXBean with one single instance in the Java virtual machine + * if implemented. + * + * @return the platform MXBean that implements + * {@code mxbeanInterface}, or {@code null} if not exist. + * + * @throws IllegalArgumentException if {@code mxbeanInterface} + * is not a platform management interface or + * not a singleton platform MXBean. + * + * @since 1.7 + */ + public static
+ * {@link #getPlatformMXBeans(MBeanServerConnection, Class) + * getPlatformMXBeans(connection, mxbeanInterface)}.get(0); + *+ * + * @param connection the {@code MBeanServerConnection} to forward to. + * @param mxbeanInterface a management interface for a platform + * MXBean with one single instance in the Java virtual machine + * being monitored, if implemented. + * + * @return the platform MXBean proxy for + * forwarding the method calls of the {@code mxbeanInterface} + * through the given {@code MBeanServerConnection}, + * or {@code null} if not exist. + * + * @throws IllegalArgumentException if {@code mxbeanInterface} + * is not a platform management interface or + * not a singleton platform MXBean. + * @throws java.io.IOException if a communication problem + * occurred when accessing the {@code MBeanServerConnection}. + * + * @see #newPlatformMXBeanProxy + * @since 1.7 + */ + public static
---
-- -- Management Interface
- Description
- -{@link java.lang.management.ClassLoadingMXBean} -Class loading system of the Java virtual machine. -- -{@link java.lang.management.CompilationMXBean} -Compilation system of the Java virtual machine. -- -{@link java.lang.management.MemoryMXBean} -Memory system of the Java virtual machine. -- -{@link java.lang.management.ThreadMXBean} -Threads system of the Java virtual machine. -- -{@link java.lang.management.RuntimeMXBean} -Runtime system of the Java virtual machine. -- -{@link java.lang.management.OperatingSystemMXBean} -Operating system on which the Java virtual machine is running. -- -{@link java.lang.management.GarbageCollectorMXBean} -Garbage collector in the Java virtual machine. -- -{@link java.lang.management.MemoryManagerMXBean} -Memory manager in the Java virtual machine. -- -{@link java.lang.management.MemoryPoolMXBean} -Memory pool in the Java virtual machine. -
-A platform MXBean is a managed bean that defines the management -interface for one component for the platform and is specified in the - -ManagementFactory class. -
An application can monitor the instrumentation of the -Java virtual machine and manage certain characteristics in -the following ways: -
+A platform MXBean is a managed bean that +conforms to the JMX +Instrumentation Specification and only uses a set of basic data types. +Each platform MXBean is a {@link java.lang.management.PlatformManagedObject} +with a unique +{@linkplain java.lang.management.PlatformManagedObject#getObjectName name}. +
The {@link java.lang.management.ManagementFactory} class is the management factory class for the Java platform. This class provides a set of static factory methods to obtain the MXBeans for the Java platform to allow an application to access the MXBeans directly. @@ -137,50 +53,98 @@ {@link java.lang.management.ManagementFactory#getPlatformMBeanServer getPlatformMBeanServer} method. On the first call to this method, it creates the platform MBeanServer and registers all platform MXBeans -including platform MXBeans defined in other packages such as -{@link java.util.logging.LoggingMXBean}. -Each platform MXBean is registered with a unique name defined in the -{@link java.lang.management.ManagementFactory ManagementFactory} class -for constructing {@link javax.management.ObjectName ObjectName}. +including {@linkplain java.lang.management.PlatformManagedObject +platform MXBeans}. +Each platform MXBean is registered with a unique name defined in +the specification of the management interface. This is a single MBeanServer that can be shared by different managed components running within the same Java virtual machine.
A management application and a platform MBeanServer of a running virtual machine can interoperate without requiring classes used by the platform MXBean interfaces. The data types being transmitted between the JMX connector server and the connector client are JMX -{@link javax.management.openmbean.OpenType open types} and +{@linkplain javax.management.openmbean.OpenType open types} and this allows interoperation across versions. +A data type used by the MXBean interfaces are mapped to an +open type when being accessed via MBeanServer interface. +See the +MXBean specification for details. -
A data type used by the MXBean interfaces are mapped to -an open type when being accessed via MBeanServer interface. -The data type mapping is specified in the -{@link java.lang.management.ManagementFactory ManagementFactory} class. -
An application can monitor the instrumentation of the +Java virtual machine and the runtime in the following ways:
-
++1. Direct access to an MXBean interface ++
+
- Get an MXBean instance locally in the running Java virtual machine:
+
RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean(); // Get the standard attribute "VmVendor" String vendor = mxbean.getVmVendor(); ++Or by calling the + {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + getPlatformMXBean} or + {@link java.lang.management.ManagementFactory#getPlatformMXBeans(Class) + getPlatformMXBeans} method: +
+ RuntimeMXBean mxbean = ManagementFactory.getPlatformMXBean(RuntimeMXBean.class); + // Get the standard attribute "VmVendor" + String vendor = mxbean.getVmVendor();-
+
+ MBeanServerConnection mbs; -
-+ // Connect to a running JVM (or itself) and get MBeanServerConnection + // that has the JVM MBeans registered in it + ... + + // Get a MBean proxy for RuntimeMXBean interface + RuntimeMXBean proxy = + {@link java.lang.management.ManagementFactory#getPlatformMXBean(MBeanServerConnection, Class) + ManagementFactory.getPlatformMXBean}(mbs, + RuntimeMXBean.class); + // Get standard attribute "VmVendor" + String vendor = proxy.getVmVendor(); ++A proxy is typically used to access an MXBean + in a remote Java virtual machine. + An alternative way to create an MXBean proxy is: +
+ RuntimeMXBean proxy = + {@link java.lang.management.ManagementFactory#newPlatformMXBeanProxy + ManagementFactory.newPlatformMXBeanProxy}(mbs, + ManagementFactory.RUNTIME_MXBEAN_NAME, + RuntimeMXBean.class); ++ + ++2. Indirect access to an MXBean interface via MBeanServer
+
+
-- Go through the + {@link java.lang.management.ManagementFactory#getPlatformMBeanServer + platform MBeanServer} to access MXBeans locally or + a specific {@code MBeanServerConnection} to access + MXBeans remotely. + The attributes and operations of an MXBean use only + JMX open types which include basic data types, + {@link javax.management.openmbean.CompositeData CompositeData}, + and {@link javax.management.openmbean.TabularData TabularData} + defined in {@link javax.management.openmbean.OpenType OpenType}.
++
MBeanServerConnection mbs; // Connect to a running JVM (or itself) and get MBeanServerConnection @@ -198,36 +162,19 @@ // and MBeanServer.getAttribute method ... } ++
-- MBeanServerConnection mbs; - - // Connect to a running JVM (or itself) and get MBeanServerConnection - // that has the JVM MBeans registered in it - ... - - // Get a MBean proxy for RuntimeMXBean interface - RuntimeMXBean proxy = - ManagementFactory.newPlatformMXBeanProxy(mbs, - ManagementFactory.RUNTIME_MXBEAN_NAME, - RuntimeMXBean.class); - // Get standard attribute "VmVendor" - String vendor = proxy.getVmVendor(); -
A Java virtual machine implementation may add its platform extension to the management interface by defining platform-dependent interfaces that extend the standard management interfaces to include platform-specific metrics and management operations. The static factory methods in the ManagementFactory class will -return the MBeans with the platform extension. +return the MXBeans with the platform extension.
It is recommended to name the platform-specific attributes with @@ -240,26 +187,30 @@ the applications accessing that vendor-specific attribute would have to be modified to cope with versioning and compatibility issues. -
Below is an example showing how to access a platform-specific -attribute from Sun's implementation of the RuntimeMXBean. +
Below is an example showing how to access an attribute +from the platform extension:
-1) Direct access to the Sun-specific MXBean interface -
- com.sun.management.RuntimeMXBean mxbean = - (com.sun.management.RuntimeMXBean) ManagementFactory.getRuntimeMXBean(); +1) Direct access to the Oracle-specific MXBean interface +++ List<com.sun.management.GarbageCollectorMXBean> mxbeans = + ManagementFactory.getPlatformMXBeans(com.sun.management.GarbageCollectorMXBean.class); - // Get the standard attribute "VmVendor" - String vendor = mxbean.getVmVendor(); + for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) { + // Get the standard attribute "CollectionCount" + String count = mxbean.getCollectionCount(); - // Get the platform-specific attribute "Bar" - BarType bar = mxbean.getBar(); - + // Get the platform-specific attribute "LastGcInfo" + GcInfo gcinfo = gc.getLastGcInfo(); + ... + }-2) Access the Sun-specific MXBean interface via MBeanServer +2) Access the Oracle-specific MXBean interface via MBeanServer + through proxy
MBeanServerConnection mbs; @@ -268,24 +219,18 @@ // that has the JVM MXBeans registered in it ... - try { - // Assuming the RuntimeMXBean has been registered in mbs - ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME); - - // Get standard attribute "VmVendor" - String vendor = (String) mbs.getAttribute(oname, "VmVendor"); + List<com.sun.management.GarbageCollectorMXBean> mxbeans = + ManagementFactory.getPlatformMXBeans(mbs, com.sun.management.GarbageCollectorMXBean.class); - // Check if this MXBean contains Sun's extension - if (mbs.isInstanceOf(oname, "com.sun.management.RuntimeMXBean")) { - // Get platform-specific attribute "Bar" - BarType bar = (String) mbs.getAttribute(oname, "Bar"); - } - } catch (....) { - // Catch the exceptions thrown by ObjectName constructor - // and MBeanServer methods + for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) { + // Get the standard attribute "CollectionCount" + String count = mxbean.getCollectionCount(); + + // Get the platform-specific attribute "LastGcInfo" + GcInfo gcinfo = gc.getLastGcInfo(); ... } - +Unless otherwise noted, passing a null argument to a constructor --- old/src/share/classes/java/util/logging/LogManager.java Mon Mar 28 11:54:19 2011 +++ new/src/share/classes/java/util/logging/LogManager.java Mon Mar 28 11:54:19 2011 @@ -1166,7 +1166,12 @@ private static LoggingMXBean loggingMXBean = null; /** * String representation of the - * {@link javax.management.ObjectName} for {@link LoggingMXBean}. + * {@link javax.management.ObjectName} for the management interface + * for the logging facility. + * + * @see java.lang.management.PlatformLoggingMXBean + * @see java.util.logging.LoggingMXBean + * * @since 1.5 */ public final static String LOGGING_MXBEAN_NAME @@ -1174,20 +1179,20 @@ /** * Returns LoggingMXBean for managing loggers. - * An alternative way to manage loggers is using - * the {@link java.lang.management.ManagementFactory#getPlatformMXBeans(Class) - * ManagementFactory.getPlatformMXBeans} method as follows: + * An alternative way to manage loggers is through the + * {@link java.lang.management.PlatformLoggingMXBean} interface + * that can be obtained by calling: *
- * List<{@link PlatformLoggingMXBean}> result = ManagementFactory.getPlatformMXBeans(PlatformLoggingMXBean.class); + * PlatformLoggingMXBean logging = {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + * ManagementFactory.getPlatformMXBean}(PlatformLoggingMXBean.class); ** * @return a {@link LoggingMXBean} object. * - * @see PlatformLoggingMXBean - * @see java.lang.management.ManagementFactory + * @see java.lang.management.PlatformLoggingMXBean * @since 1.5 */ - public static synchronized LoggingMXBean getLoggingMXBean() { + public static synchronized LoggingMXBean getLoggingMXBean() { if (loggingMXBean == null) { loggingMXBean = new Logging(); } --- old/src/share/classes/java/util/logging/LoggingMXBean.java Mon Mar 28 11:54:21 2011 +++ new/src/share/classes/java/util/logging/LoggingMXBean.java Mon Mar 28 11:54:20 2011 @@ -27,36 +27,41 @@ /** - * The management interface for the logging facility. + * The management interface for the logging facility. It is recommended + * to use the {@link java.lang.management.PlatformLoggingMXBean} management + * interface that implements all attributes defined in this + * {@code LoggingMXBean}. The + * {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + * ManagementFactory.getPlatformMXBean} method can be used to obtain + * the {@code PlatformLoggingMXBean} object representing the management + * interface for logging. * *There is a single global instance of the LoggingMXBean. - * This instance is an - * MXBean - * can be obtained by calling - * the {@link LogManager#getLoggingMXBean} method or from the + * This instance is an {@link javax.management.MXBean MXBean} that + * can be obtained by calling the {@link LogManager#getLoggingMXBean} + * method or from the * {@linkplain java.lang.management.ManagementFactory#getPlatformMBeanServer * platform MBeanServer}. + *
+ * The {@link javax.management.ObjectName ObjectName} that uniquely identifies + * the management interface for logging within the {@code MBeanServer} is: + *
+ * {@link LogManager#LOGGING_MXBEAN_NAME java.util.logging:type=Logging} + *+ *+ * The instance registered in the platform MBeanServer + * is also a {@link java.lang.management.PlatformLoggingMXBean}. * - * The {@link javax.management.ObjectName ObjectName} for uniquely - * identifying the LoggingMXBean within an MBeanServer is: - *
- * {@link LogManager#LOGGING_MXBEAN_NAME - * java.util.logging:type=Logging} - *- * - * The instance registered in the platform MBeanServer with - * this {@code ObjectName} is also a {@link PlatformLoggingMXBean}. - * * @author Ron Mann * @author Mandy Chung * @since 1.5 * - * @see PlatformLoggingMXBean + * @see java.lang.management.PlatformLoggingMXBean */ public interface LoggingMXBean { /** - * Returns the list of currently registered loggers. This method + * Returns the list of currently registered logger names. This method * calls {@link LogManager#getLoggerNames} and returns a list * of the logger names. * @@ -89,7 +94,7 @@ * * @see Logger#getLevel */ - public String getLoggerLevel( String loggerName ); + public String getLoggerLevel(String loggerName); /** * Sets the specified logger to the specified new level. @@ -115,7 +120,7 @@ * * @see Logger#setLevel */ - public void setLoggerLevel( String loggerName, String levelName ); + public void setLoggerLevel(String loggerName, String levelName); /** * Returns the name of the parent for the specified logger. --- old/src/share/classes/sun/management/ManagementFactoryHelper.java Mon Mar 28 11:54:22 2011 +++ new/src/share/classes/sun/management/ManagementFactoryHelper.java Mon Mar 28 11:54:22 2011 @@ -27,20 +27,18 @@ import java.lang.management.*; -import javax.management.MBeanServer; -import javax.management.ObjectName; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; +import javax.management.MBeanServer; import javax.management.MBeanRegistrationException; import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; import javax.management.RuntimeOperationsException; -import java.nio.BufferPoolMXBean; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import sun.security.action.LoadLibraryAction; -import java.util.logging.PlatformLoggingMXBean; import sun.util.logging.LoggingSupport; import java.util.ArrayList; @@ -139,61 +137,80 @@ return result; } - public static ListgetLoggingMXBean() { + public static PlatformLoggingMXBean getPlatformLoggingMXBean() { if (LoggingSupport.isAvailable()) { - return Collections.singletonList(createPlatformLoggingMXBean()); + return PlatformLoggingImpl.instance; } else { - return Collections.emptyList(); + return null; } } - private final static String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging"; - private static PlatformLoggingMXBean createPlatformLoggingMXBean() { - return new PlatformLoggingMXBean() { - private volatile ObjectName objname; // created lazily - @Override - public ObjectName getObjectName() { - ObjectName result = objname; - if (result == null) { - synchronized (this) { - if (objname == null) { - result = Util.newObjectName(LOGGING_MXBEAN_NAME); - objname = result; - } + // The logging MXBean object is an instance of + // PlatformLoggingMXBean and java.util.logging.LoggingMXBean + // but it can't directly implement two MXBean interfaces + // as a compliant MXBean implements exactly one MXBean interface, + // or if it implements one interface that is a subinterface of + // all the others; otherwise, it is a non-complaint MXBean + // MBeanServer will throw NotCompliantMBeanException. + // See the Definition of an MXBean section in javax.management.MXBean spec. + // + // To create a compliant logging MXBean, define a LoggingMXBean interface + // that extend PlatformLoggingMXBean and j.u.l.LoggingMXBean + interface LoggingMXBean + extends PlatformLoggingMXBean, java.util.logging.LoggingMXBean { + } + + static class PlatformLoggingImpl implements LoggingMXBean + { + final static PlatformLoggingMXBean instance = new PlatformLoggingImpl(); + final static String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging"; + + private volatile ObjectName objname; // created lazily + @Override + public ObjectName getObjectName() { + ObjectName result = objname; + if (result == null) { + synchronized (this) { + if (objname == null) { + result = Util.newObjectName(LOGGING_MXBEAN_NAME); + objname = result; } } - return result; } + return result; + } - @Override - public java.util.List getLoggerNames() { - return LoggingSupport.getLoggerNames(); - } + @Override + public java.util.List getLoggerNames() { + return LoggingSupport.getLoggerNames(); + } - @Override - public String getLoggerLevel(String loggerName) { - return LoggingSupport.getLoggerLevel(loggerName); - } + @Override + public String getLoggerLevel(String loggerName) { + return LoggingSupport.getLoggerLevel(loggerName); + } - @Override - public void setLoggerLevel(String loggerName, String levelName) { - LoggingSupport.setLoggerLevel(loggerName, levelName); - } + @Override + public void setLoggerLevel(String loggerName, String levelName) { + LoggingSupport.setLoggerLevel(loggerName, levelName); + } - @Override - public String getParentLoggerName(String loggerName) { - return LoggingSupport.getParentLoggerName(loggerName); - } - }; + @Override + public String getParentLoggerName(String loggerName) { + return LoggingSupport.getParentLoggerName(loggerName); + } } - public static List getBufferPoolMXBeans() { - List pools = new ArrayList (2); - pools.add(createBufferPoolMXBean(sun.misc.SharedSecrets.getJavaNioAccess() - .getDirectBufferPool())); - pools.add(createBufferPoolMXBean(sun.nio.ch.FileChannelImpl - .getMappedBufferPool())); - return pools; + private static List bufferPools = null; + public static synchronized List getBufferPoolMXBeans() { + if (bufferPools == null) { + bufferPools = new ArrayList<>(2); + bufferPools.add(createBufferPoolMXBean(sun.misc.SharedSecrets.getJavaNioAccess() + .getDirectBufferPool())); + bufferPools.add(createBufferPoolMXBean(sun.nio.ch.FileChannelImpl + .getMappedBufferPool())); + } + return bufferPools; } private final static String BUFFER_POOL_MXBEAN_NAME = "java.nio:type=BufferPool"; --- old/test/Makefile Mon Mar 28 11:54:23 2011 +++ new/test/Makefile Mon Mar 28 11:54:23 2011 @@ -504,7 +504,7 @@ # Stable samevm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_nio2 jdk_nio2: $(call TestDirs, java/nio/Buffer java/nio/ByteOrder \ - java/nio/channels java/nio/BufferPoolMXBean java/nio/MappedByteBuffer) + java/nio/channels java/nio/MappedByteBuffer) $(call SharedLibraryPermissions,java/nio/channels) $(call RunSamevmBatch) --- old/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java Mon Mar 28 11:54:25 2011 +++ new/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java Mon Mar 28 11:54:25 2011 @@ -23,9 +23,9 @@ /* * @test - * @bug 6610094 - * @summary Basic unit test of ManagementFactory.getPlatformMXBeans() - * and also PlatformManagedObject.getObjectName() + * @bug 6610094 7024172 + * @summary Basic unit test of ManagementFactory.getPlatformMXBean(s) + * methods and PlatformManagedObject.getObjectName() * @author Mandy Chung * * @run main GetPlatformMXBeans @@ -32,14 +32,17 @@ */ import java.lang.management.*; -import static java.lang.management.ManagementFactory.*; +import java.io.IOException; import java.util.*; import javax.management.*; +import static java.lang.management.ManagementFactory.*; + public class GetPlatformMXBeans { private static MBeanServer platformMBeanServer = getPlatformMBeanServer(); public static void main(String[] argv) throws Exception { + // singleton platform MXBean checkPlatformMXBean(getClassLoadingMXBean(), ClassLoadingMXBean.class, CLASS_LOADING_MXBEAN_NAME); @@ -58,17 +61,28 @@ checkPlatformMXBean(getThreadMXBean(), ThreadMXBean.class, THREAD_MXBEAN_NAME); + + // the following MXBean can have more than one instances checkGarbageCollectorMXBeans(getGarbageCollectorMXBeans()); checkMemoryManagerMXBeans(getMemoryManagerMXBeans()); checkMemoryPoolMXBeans(getMemoryPoolMXBeans()); + + // check invalid platform MXBean + checkInvalidPlatformMXBean(); } private static - void checkPlatformMXBean(T obj, Class mxbeanInterface, - String mxbeanName) throws Exception + void checkPlatformMXBean(T obj, Class mxbeanInterface, + String mxbeanName) + throws Exception { - int numElements = (obj != null ? 1 : 0); - // verify local list of platform MXBeans + // getPlatformMXBean may return null if the mxbean is not implemented + PlatformManagedObject mxbean = getPlatformMXBean(mxbeanInterface); + if (obj != mxbean) { + throw new RuntimeException("Singleton MXBean returned not matched"); + } + + int numElements = obj == null ? 0 : 1; List extends PlatformManagedObject> mxbeans = getPlatformMXBeans(mxbeanInterface); if (mxbeans.size() != numElements) { @@ -77,24 +91,46 @@ } if (obj != null) { - PlatformManagedObject pmo = mxbeans.get(0); - if (obj != pmo) { + if (obj != mxbeans.get(0)) { throw new RuntimeException("The list returned by getPlatformMXBeans" + " not matched"); } ObjectName on = new ObjectName(mxbeanName); - if (!on.equals(pmo.getObjectName())) { + if (!on.equals(mxbean.getObjectName())) { throw new RuntimeException("Unmatched ObjectName " + - pmo.getObjectName() + " Expected = " + on); + mxbean.getObjectName() + " Expected = " + on); } + checkRemotePlatformMXBean(obj, platformMBeanServer, + mxbeanInterface, mxbeanName); } + } - // verify platform MXBeans in the platform MBeanServer - mxbeans = getPlatformMXBeans(platformMBeanServer, mxbeanInterface); + // verify platform MXBeans in the platform MBeanServer + private static + void checkRemotePlatformMXBean(T obj, + MBeanServerConnection mbs, + Class mxbeanInterface, + String mxbeanName) + throws Exception + { + PlatformManagedObject mxbean = getPlatformMXBean(mbs, mxbeanInterface); + if ((obj == null && mxbean != null) || (obj != null && mxbean == null)) { + throw new RuntimeException("Singleton MXBean returned not matched"); + } + + int numElements = obj == null ? 0 : 1; + List extends PlatformManagedObject> mxbeans = + getPlatformMXBeans(mbs, mxbeanInterface); if (mxbeans.size() != numElements) { throw new RuntimeException("Unmatched number of platform MXBeans " + mxbeans.size() + ". Expected = " + numElements); } + + ObjectName on = new ObjectName(mxbeanName); + if (!on.equals(mxbean.getObjectName())) { + throw new RuntimeException("Unmatched ObjectName " + + mxbean.getObjectName() + " Expected = " + on); + } } private static void checkMemoryManagerMXBeans(List objs) @@ -148,6 +184,14 @@ void checkPlatformMXBeans(List objs, Class mxbeanInterface) throws Exception { + try { + getPlatformMXBean(mxbeanInterface); + // mxbeanInterface is not a singleton + throw new RuntimeException(mxbeanInterface + ": not a singleton MXBean"); + } catch (IllegalArgumentException e) { + // expect IAE + } + // verify local list of platform MXBeans List extends PlatformManagedObject> mxbeans = getPlatformMXBeans(mxbeanInterface); @@ -177,4 +221,40 @@ + mxbeans.size() + ". Expected = " + objs.size()); } } + + interface FakeMXBean extends PlatformManagedObject {}; + + private static void checkInvalidPlatformMXBean() throws IOException { + try { + getPlatformMXBean(FakeMXBean.class); + // mxbeanInterface is not a singleton + throw new RuntimeException("Expect IllegalArgumentException but not thrown"); + } catch (IllegalArgumentException e) { + // expect IAE + } + + try { + getPlatformMXBeans(FakeMXBean.class); + // mxbeanInterface is not a singleton + throw new RuntimeException("Expect IllegalArgumentException but not thrown"); + } catch (IllegalArgumentException e) { + // expect IAE + } + + try { + getPlatformMXBean(platformMBeanServer, FakeMXBean.class); + // mxbeanInterface is not a singleton + throw new RuntimeException("Expect IllegalArgumentException but not thrown"); + } catch (IllegalArgumentException e) { + // expect IAE + } + + try { + getPlatformMXBeans(platformMBeanServer, FakeMXBean.class); + // mxbeanInterface is not a singleton + throw new RuntimeException("Expect IllegalArgumentException but not thrown"); + } catch (IllegalArgumentException e) { + // expect IAE + } + } } --- old/test/java/nio/channels/AsynchronousSocketChannel/Leaky.java Mon Mar 28 11:54:26 2011 +++ new/test/java/nio/channels/AsynchronousSocketChannel/Leaky.java Mon Mar 28 11:54:26 2011 @@ -28,12 +28,12 @@ */ import java.nio.ByteBuffer; -import java.nio.BufferPoolMXBean; import java.nio.channels.*; import java.net.*; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; +import java.lang.management.BufferPoolMXBean; import java.lang.management.ManagementFactory; /** --- old/src/share/classes/java/nio/BufferPoolMXBean.java Mon Mar 28 11:54:28 2011 +++ /dev/null Mon Mar 28 11:54:28 2011 @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.nio; - -import java.lang.management.PlatformManagedObject; - -/** - * The management interface for a buffer pool. - * - * A class implementing this interface is an MXBean. A Java - * virtual machine has one or more implementations of this interface. The {@link - * java.lang.management.ManagementFactory#getPlatformMXBeans getPlatformMXBeans} - * method can be used to obtain the list of {@code BufferPoolMXBean} objects - * representing the management interfaces for pools of buffers as follows: - *
- * List<BufferPoolMXBean> pools = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class); - *- * - *The management interfaces are also registered with the platform {@link - * javax.management.MBeanServer MBeanServer}. The {@link - * javax.management.ObjectName ObjectName} that uniquely identifies the - * management interface within the {@code MBeanServer} takes the form: - *
- * java.nio:type=BufferPool,name=pool name - *- * where pool name is the {@link #getName name} of the buffer pool. - * - * @since 1.7 - */ - -public interface BufferPoolMXBean extends PlatformManagedObject { - - /** - * Returns the name representing this buffer pool. - * - * @return The name of this buffer pool. - */ - String getName(); - - /** - * Returns an estimate of the number of buffers in the pool. - * - * @return An estimate of the number of buffers in this pool - */ - long getCount(); - - /** - * Returns an estimate of the total capacity of the buffers in this pool. - * A buffer's capacity is the number of elements it contains and the value - * returned by this method is an estimate of the total capacity of buffers - * in the pool in bytes. - * - * @return An estimate of the total capacity of the buffers in this pool - * in bytes - */ - long getTotalCapacity(); - - /** - * Returns an estimate of the memory that the Java virtual machine is using - * for this buffer pool. The value returned by this method may differ - * from the estimate of the total {@link #getTotalCapacity capacity} of - * the buffers in this pool. This difference is explained by alignment, - * memory allocator, and other implementation specific reasons. - * - * @return An estimate of the memory that the Java virtual machine is using - * for this buffer pool in bytes, or {@code -1L} if an estimate of - * the memory usage is not available - */ - long getMemoryUsed(); -} --- /dev/null Mon Mar 28 11:54:28 2011 +++ new/src/share/classes/java/lang/management/BufferPoolMXBean.java Mon Mar 28 11:54:27 2011 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang.management; + +/** + * The management interface for a buffer pool, for example a pool of + * {@link java.nio.ByteBuffer#allocateDirect direct} or {@link + * java.nio.MappedByteBuffer mapped} buffers. + * + *A class implementing this interface is an + * {@link javax.management.MXBean}. A Java + * virtual machine has one or more implementations of this interface. The {@link + * java.lang.management.ManagementFactory#getPlatformMXBeans getPlatformMXBeans} + * method can be used to obtain the list of {@code BufferPoolMXBean} objects + * representing the management interfaces for pools of buffers as follows: + *
+ * List<BufferPoolMXBean> pools = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class); + *+ * + *The management interfaces are also registered with the platform {@link + * javax.management.MBeanServer MBeanServer}. The {@link + * javax.management.ObjectName ObjectName} that uniquely identifies the + * management interface within the {@code MBeanServer} takes the form: + *
+ * java.nio:type=BufferPool,name=pool name + *+ * where pool name is the {@link #getName name} of the buffer pool. + * + * @since 1.7 + */ +public interface BufferPoolMXBean extends PlatformManagedObject { + + /** + * Returns the name representing this buffer pool. + * + * @return The name of this buffer pool. + */ + String getName(); + + /** + * Returns an estimate of the number of buffers in the pool. + * + * @return An estimate of the number of buffers in this pool + */ + long getCount(); + + /** + * Returns an estimate of the total capacity of the buffers in this pool. + * A buffer's capacity is the number of elements it contains and the value + * returned by this method is an estimate of the total capacity of buffers + * in the pool in bytes. + * + * @return An estimate of the total capacity of the buffers in this pool + * in bytes + */ + long getTotalCapacity(); + + /** + * Returns an estimate of the memory that the Java virtual machine is using + * for this buffer pool. The value returned by this method may differ + * from the estimate of the total {@link #getTotalCapacity capacity} of + * the buffers in this pool. This difference is explained by alignment, + * memory allocator, and other implementation specific reasons. + * + * @return An estimate of the memory that the Java virtual machine is using + * for this buffer pool in bytes, or {@code -1L} if an estimate of + * the memory usage is not available + */ + long getMemoryUsed(); +} --- old/src/share/classes/java/util/logging/PlatformLoggingMXBean.java Mon Mar 28 11:54:29 2011 +++ /dev/null Mon Mar 28 11:54:29 2011 @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.util.logging; - -import java.lang.management.PlatformManagedObject; - -/** - * The {@linkplain PlatformManagedObject platform managed object} for the - * logging facility. This interface simply unifies {@link LoggingMXBean} - * {@link PlatformManagedObject}; - * and it does not specify any new operations. - * - *The {@link java.lang.management.ManagementFactory#getPlatformMXBeans(Class) - * ManagementFactory.getPlatformMXBeans} method can be used to obtain - * the {@code PlatformLoggingMXBean} object as follows: - *
- * ManagementFactory.getPlatformMXBeans(PlatformLoggingMXBean.class); - *- * or from the {@linkplain java.lang.management.ManagementFactory#getPlatformMBeanServer - * platform MBeanServer}. - * - * The {@link javax.management.ObjectName ObjectName} for uniquely - * identifying the LoggingMXBean within an MBeanServer is: - *- * java.util.logging:type=Logging - *- * - * The {@link PlatformManagedObject#getObjectName} method - * can be used to obtain its {@code ObjectName}. - * - * @see java.lang.management.PlatformManagedObject - * - * @author Mandy Chung - * @since 1.7 - */ -public interface PlatformLoggingMXBean extends LoggingMXBean, PlatformManagedObject { -} --- /dev/null Mon Mar 28 11:54:29 2011 +++ new/src/share/classes/java/lang/management/PlatformLoggingMXBean.java Mon Mar 28 11:54:29 2011 @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang.management; + +/** + * The management interface for the {@linkplain java.util.logging logging} facility. + * + *There is a single global instance of the PlatformLoggingMXBean. + * The {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + * ManagementFactory.getPlatformMXBean} method can be used to obtain + * the {@code PlatformLoggingMXBean} object as follows: + *
+ * PlatformLoggingMXBean logging = ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class); + *+ * The {@code PlatformLoggingMXBean} object is also registered with the + * platform {@linkplain java.lang.management.ManagementFactory#getPlatformMBeanServer + * MBeanServer}. + * The {@link javax.management.ObjectName ObjectName} for uniquely + * identifying the {@code PlatformLoggingMXBean} within an MBeanServer is: + *+ * {@link java.util.logging.LogManager#LOGGING_MXBEAN_NAME java.util.logging:type=Logging} + *+ * + *The instance registered in the platform MBeanServer with + * this {@code ObjectName} implements all attributes defined by + * {@link java.util.logging.LoggingMXBean}. + * + * @since 1.7 + */ +public interface PlatformLoggingMXBean extends PlatformManagedObject { + + /** + * Returns the list of the currently registered + * {@linkplain java.util.logging.Logger logger} names. This method + * calls {@link java.util.logging.LogManager#getLoggerNames} and + * returns a list of the logger names. + * + * @return A list of {@code String} each of which is a + * currently registered {@code Logger} name. + */ + java.util.List
getLoggerNames(); + + /** + * Gets the name of the log {@linkplain java.util.logging.Logger#getLevel + * level} associated with the specified logger. + * If the specified logger does not exist, {@code null} + * is returned. + * This method first finds the logger of the given name and + * then returns the name of the log level by calling: + * + * {@link java.util.logging.Logger#getLevel + * Logger.getLevel()}.{@link java.util.logging.Level#getName getName()}; + *+ * + *+ * If the {@code Level} of the specified logger is {@code null}, + * which means that this logger's effective level is inherited + * from its parent, an empty string will be returned. + * + * @param loggerName The name of the {@code Logger} to be retrieved. + * + * @return The name of the log level of the specified logger; or + * an empty string if the log level of the specified logger + * is {@code null}. If the specified logger does not + * exist, {@code null} is returned. + * + * @see java.util.logging.Logger#getLevel + */ + String getLoggerLevel(String loggerName); + + /** + * Sets the specified logger to the specified new + * {@linkplain java.util.logging.Logger#setLevel level}. + * If the {@code levelName} is not {@code null}, the level + * of the specified logger is set to the parsed + * {@link java.util.logging.Level Level} + * matching the {@code levelName}. + * If the {@code levelName} is {@code null}, the level + * of the specified logger is set to {@code null} and + * the effective level of the logger is inherited from + * its nearest ancestor with a specific (non-null) level value. + * + * @param loggerName The name of the {@code Logger} to be set. + * Must be non-null. + * @param levelName The name of the level to set on the specified logger, + * or {@code null} if setting the level to inherit + * from its nearest ancestor. + * + * @throws IllegalArgumentException if the specified logger + * does not exist, or {@code levelName} is not a valid level name. + * + * @throws SecurityException if a security manager exists and if + * the caller does not have LoggingPermission("control"). + * + * @see java.util.logging.Logger#setLevel + */ + void setLoggerLevel(String loggerName, String levelName); + + /** + * Returns the name of the + * {@linkplain java.util.logging.Logger#getParent parent} + * for the specified logger. + * If the specified logger does not exist, {@code null} is returned. + * If the specified logger is the root {@code Logger} in the namespace, + * the result will be an empty string. + * + * @param loggerName The name of a {@code Logger}. + * + * @return the name of the nearest existing parent logger; + * an empty string if the specified logger is the root logger. + * If the specified logger does not exist, {@code null} + * is returned. + */ + String getParentLoggerName(String loggerName); +} --- old/test/java/nio/BufferPoolMXBean/Basic.java Mon Mar 28 11:54:31 2011 +++ /dev/null Mon Mar 28 11:54:31 2011 @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* @test - * @bug 6606598 - * @summary Unit test for java.nio.BufferPoolMXBean - * @run main/othervm Basic - */ - -import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; -import java.nio.BufferPoolMXBean; -import java.nio.channels.FileChannel; -import java.io.File; -import java.io.RandomAccessFile; -import java.lang.management.ManagementFactory; -import javax.management.MBeanServer; -import javax.management.ObjectName; -import java.util.*; - -public class Basic { - - // static fields to ensure buffers aren't GC'ed - static List
buffers; - static MappedByteBuffer mbb; - - // check counters - static void check(List pools, - int minBufferCount, - long minTotalCapacity) - { - int bufferCount = 0; - long totalCap = 0; - long totalMem = 0; - for (BufferPoolMXBean pool: pools) { - bufferCount += pool.getCount(); - totalCap += pool.getTotalCapacity(); - totalMem += pool.getMemoryUsed(); - } - if (bufferCount < minBufferCount) - throw new RuntimeException("Count less than expected"); - if (totalMem < minTotalCapacity) - throw new RuntimeException("Memory usage less than expected"); - if (totalCap < minTotalCapacity) - throw new RuntimeException("Total capacity less than expected"); - } - - public static void main(String[] args) throws Exception { - Random rand = new Random(); - - // allocate a few direct buffers - int bufferCount = 5 + rand.nextInt(20); - buffers = new ArrayList (bufferCount); - long totalCapacity = 0L; - for (int i=0; i pools = - ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class); - check(pools, bufferCount, totalCapacity); - - // using MBeanServer - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - Set mbeans = server.queryNames( - new ObjectName("java.nio:type=BufferPool,*"), null); - pools = new ArrayList (); - for (ObjectName name: mbeans) { - BufferPoolMXBean pool = ManagementFactory - .newPlatformMXBeanProxy(server, name.toString(), BufferPoolMXBean.class); - pools.add(pool); - } - check(pools, bufferCount, totalCapacity); - } -} --- /dev/null Mon Mar 28 11:54:31 2011 +++ new/test/java/lang/management/BufferPoolMXBean/Basic.java Mon Mar 28 11:54:30 2011 @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 6606598 7024172 + * @summary Unit test for java.lang.management.BufferPoolMXBean + * @run main/othervm Basic + */ + +import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.file.Path; +import java.nio.file.Files; +import static java.nio.file.StandardOpenOption.*; +import java.nio.channels.FileChannel; +import java.lang.management.BufferPoolMXBean; +import java.lang.management.ManagementFactory; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import java.lang.ref.WeakReference; +import java.util.*; + +public class Basic { + + // static fields to ensure buffers aren't GC'ed + static List buffers; + static MappedByteBuffer mbb; + + // check counters + static void check(List pools, + int minBufferCount, + long minTotalCapacity) + { + int bufferCount = 0; + long totalCap = 0; + long totalMem = 0; + for (BufferPoolMXBean pool: pools) { + bufferCount += pool.getCount(); + totalCap += pool.getTotalCapacity(); + totalMem += pool.getMemoryUsed(); + } + if (bufferCount < minBufferCount) + throw new RuntimeException("Count less than expected"); + if (totalMem < minTotalCapacity) + throw new RuntimeException("Memory usage less than expected"); + if (totalCap < minTotalCapacity) + throw new RuntimeException("Total capacity less than expected"); + } + + public static void main(String[] args) throws Exception { + Random rand = new Random(); + + // allocate a few direct buffers + int bufferCount = 5 + rand.nextInt(20); + buffers = new ArrayList (bufferCount); + long totalCapacity = 0L; + for (int i=0; i pools = + ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class); + check(pools, bufferCount, totalCapacity); + + // use MBeanServer + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Set mbeans = server.queryNames( + new ObjectName("java.nio:type=BufferPool,*"), null); + pools = new ArrayList (); + for (ObjectName name: mbeans) { + BufferPoolMXBean pool = ManagementFactory + .newPlatformMXBeanProxy(server, name.toString(), BufferPoolMXBean.class); + pools.add(pool); + } + check(pools, bufferCount, totalCapacity); + + // attempt to unmap mapped buffer + WeakReference ref = new WeakReference<>(mbb); + mbb = null; + do { + System.gc(); + Thread.sleep(250); + } while (ref.get() != null); + } +} --- /dev/null Mon Mar 28 11:54:32 2011 +++ new/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java Mon Mar 28 11:54:32 2011 @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7024172 + * @summary Test if proxy for PlatformLoggingMXBean is equivalent + * to proxy for LoggingMXBean + * + * @build LoggingMXBeanTest + * @run main LoggingMXBeanTest + */ + +import java.lang.management.*; +import javax.management.MBeanServer; +import java.util.logging.*; +import java.util.ArrayList; +import java.util.List; + +public class LoggingMXBeanTest +{ + static String LOGGER_NAME_1 = "com.sun.management.Logger"; + static String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2"; + static String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown"; + + public static void main(String[] argv) throws Exception { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + LoggingMXBean proxy = + ManagementFactory.newPlatformMXBeanProxy(mbs, + LogManager.LOGGING_MXBEAN_NAME, + LoggingMXBean.class); + + // test LoggingMXBean proxy + LoggingMXBeanTest p = new LoggingMXBeanTest(proxy); + + // check if the attributes implemented by PlatformLoggingMXBean + // and LoggingMXBean return the same value + PlatformLoggingMXBean mxbean = + ManagementFactory.getPlatformMXBean(mbs, PlatformLoggingMXBean.class); + + checkAttributes(proxy, mxbean); + } + + // same verification as in java/util/logging/LoggingMXBeanTest2 + public LoggingMXBeanTest(LoggingMXBean mbean) throws Exception { + + Logger logger1 = Logger.getLogger( LOGGER_NAME_1 ); + logger1.setLevel(Level.FINE); + Logger logger2 = Logger.getLogger( LOGGER_NAME_2 ); + logger2.setLevel(null); + + /* + * Check for the existence of our new Loggers + */ + System.out.println("Test Logger Name retrieval (getLoggerNames)"); + boolean log1 = false, log2 = false; + List loggers = mbean.getLoggerNames(); + if (loggers == null || loggers.size() < 2) { + throw new RuntimeException( + "Could not Detect the presense of the new Loggers"); + } + + for (String logger : loggers) { + if (logger.equals(LOGGER_NAME_1)) { + log1 = true; + System.out.println(" : Found new Logger : " + logger); + } + if (logger.equals(LOGGER_NAME_2)) { + log2 = true; + System.out.println(" : Found new Logger : " + logger); + } + } + if ( log1 && log2 ) + System.out.println(" : PASSED." ); + else { + System.out.println(" : FAILED. Could not Detect the new Loggers." ); + throw new RuntimeException( + "Could not Detect the presense of the new Loggers"); + } + + System.out.println("Test getLoggerLevel"); + String l1 = mbean.getLoggerLevel(LOGGER_NAME_1); + System.out.println(" : Level for Logger " + LOGGER_NAME_1 + " : " + l1); + if (!l1.equals(Level.FINE.getName())) { + throw new RuntimeException( + "Expected level for " + LOGGER_NAME_1 + " = " + + Level.FINE.getName() + " but got " + l1); + } + String l2 = mbean.getLoggerLevel(LOGGER_NAME_2); + System.out.println(" : Level for Logger " + LOGGER_NAME_2 + " : " + l2); + if (!l2.equals("")) { + throw new RuntimeException( + "Expected level for " + LOGGER_NAME_2 + " = \"\"" + + " but got " + l2); + } + String l3 = mbean.getLoggerLevel(UNKNOWN_LOGGER_NAME); + System.out.println(" : Level for unknown logger : " + l3); + if (l3 != null) { + throw new RuntimeException( + "Expected level for " + UNKNOWN_LOGGER_NAME + " = null" + + " but got " + l3); + } + + System.out.println("Test setLoggerLevel"); + mbean.setLoggerLevel(LOGGER_NAME_1, "INFO"); + System.out.println(" : Set Level for Logger " + LOGGER_NAME_1 + " to: INFO"); + Level l = logger1.getLevel(); + if (l != Level.INFO) { + throw new RuntimeException( + "Expected level for " + LOGGER_NAME_1 + " = " + + Level.INFO + " but got " + l); + } + + mbean.setLoggerLevel(LOGGER_NAME_2, "SEVERE"); + System.out.println(" : Set Level for Logger " + LOGGER_NAME_2 + " to: SERVER"); + l = logger2.getLevel(); + if (l != Level.SEVERE) { + throw new RuntimeException( + "Expected level for " + LOGGER_NAME_2 + " = " + + Level.SEVERE+ " but got " + l); + } + + mbean.setLoggerLevel(LOGGER_NAME_1, null); + System.out.println(" : Set Level for Logger " + LOGGER_NAME_1 + " to: null"); + l = logger1.getLevel(); + if (l != null) { + throw new RuntimeException( + "Expected level for " + LOGGER_NAME_1 + " = null " + + " but got " + l); + } + + boolean iaeCaught = false; + System.out.println(" : Set Level for unknown Logger to: FINE"); + try { + mbean.setLoggerLevel(UNKNOWN_LOGGER_NAME, "FINE"); + } catch (IllegalArgumentException e) { + // expected + iaeCaught = true; + System.out.println(" : IllegalArgumentException caught as expected"); + } + if (!iaeCaught) { + throw new RuntimeException( + "Expected IllegalArgumentException for setting level for " + + UNKNOWN_LOGGER_NAME + " not thrown"); + } + iaeCaught = false; + System.out.println(" : Set Level for Logger " + LOGGER_NAME_1 + " to: DUMMY"); + try { + mbean.setLoggerLevel(LOGGER_NAME_1, "DUMMY"); + } catch (IllegalArgumentException e) { + // expected + iaeCaught = true; + System.out.println(" : IllegalArgumentException caught as expected"); + } + if (!iaeCaught) { + throw new RuntimeException( + "Expected IllegalArgumentException for invalid level."); + } + + + System.out.println("Test getParentLoggerName"); + String p1 = mbean.getParentLoggerName(LOGGER_NAME_2); + System.out.println(" : Parent Logger for " + LOGGER_NAME_2 + " : " + p1); + if (!p1.equals(LOGGER_NAME_1)) { + throw new RuntimeException( + "Expected parent for " + LOGGER_NAME_2 + " = " + + LOGGER_NAME_1 + " but got " + p1); + } + String p2 = mbean.getParentLoggerName(""); + System.out.println(" : Parent Logger for \"\" : " + p2); + if (!p2.equals("")) { + throw new RuntimeException( + "Expected parent for root logger \"\" = \"\"" + + " but got " + p2); + } + String p3 = mbean.getParentLoggerName(UNKNOWN_LOGGER_NAME); + System.out.println(" : Parent Logger for unknown logger : " + p3); + if (p3 != null) { + throw new RuntimeException( + "Expected level for " + UNKNOWN_LOGGER_NAME + " = null" + + " but got " + p3); + } + } + + private static void checkAttributes(LoggingMXBean mxbean1, + PlatformLoggingMXBean mxbean2) { + // verify logger names + List loggers1 = mxbean1.getLoggerNames(); + List loggers2 = mxbean2.getLoggerNames(); + if (loggers1.size() != loggers2.size()) + throw new RuntimeException("LoggerNames: unmatched number of entries"); + List loggers3 = new ArrayList<>(loggers1); + loggers3.removeAll(loggers2); + if (loggers3.size() != 0) + throw new RuntimeException("LoggerNames: unmatched loggers"); + + // verify logger's level and parent + for (String logger : loggers1) { + if (!mxbean1.getLoggerLevel(logger) + .equals(mxbean2.getLoggerLevel(logger))) + throw new RuntimeException( + "LoggerLevel: unmatched level for " + logger); + if (!mxbean1.getParentLoggerName(logger) + .equals(mxbean2.getParentLoggerName(logger))) + throw new RuntimeException( + "ParentLoggerName: unmatched parent logger's name for " + logger); + } + } +} --- old/test/java/util/logging/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java Mon Mar 28 11:54:33 2011 +++ /dev/null Mon Mar 28 11:54:33 2011 @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 6876135 - * - * @summary Test PlatformLoggingMXBean - * This test performs similar testing as LoggingMXBeanTest. - * - * @build PlatformLoggingMXBeanTest - * @run main PlatformLoggingMXBeanTest - */ - -import javax.management.*; -import java.lang.management.ManagementFactory; -import java.util.logging.*; -import java.util.List; - -public class PlatformLoggingMXBeanTest -{ - - ObjectName objectName = null; - static String LOGGER_NAME_1 = "com.sun.management.Logger1"; - static String LOGGER_NAME_2 = "com.sun.management.Logger2"; - - public PlatformLoggingMXBeanTest() throws Exception { - } - - private void runTest(PlatformLoggingMXBean mBean) throws Exception { - - /* - * Create the MBeanServeri, register the PlatformLoggingMXBean - */ - System.out.println( "***************************************************" ); - System.out.println( "********** PlatformLoggingMXBean Unit Test **********" ); - System.out.println( "***************************************************" ); - System.out.println( "" ); - System.out.println( "*******************************" ); - System.out.println( "*********** Phase 1 ***********" ); - System.out.println( "*******************************" ); - System.out.println( " Creating MBeanServer " ); - System.out.print( " Register PlatformLoggingMXBean: " ); - MBeanServer mbs = MBeanServerFactory.createMBeanServer(); - String[] list = new String[0]; - - try { - objectName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME); - mbs.registerMBean( mBean, objectName ); - } - catch ( Exception e ) { - System.out.println( "FAILED" ); - throw e; - } - System.out.println( "PASSED" ); - System.out.println(""); - - /* - * Access our MBean to get the current list of Loggers - */ - System.out.println( "*******************************" ); - System.out.println( "*********** Phase 2 ***********" ); - System.out.println( "*******************************" ); - System.out.println( " Test Logger Name retrieval (getLoggerNames) " ); - // check that Level object are returned properly - try { - list = (String[]) mbs.getAttribute( objectName, "LoggerNames" ); - } - catch ( Exception e ) { - System.out.println(" : FAILED" ); - throw e; - } - - /* - * Dump the list of Loggers already present, if any - */ - Object[] params = new Object[1]; - String[] signature = new String[1]; - Level l; - - if ( list == null ) { - System.out.println(" : PASSED. No Standard Loggers Present" ); - System.out.println(""); - } - else { - System.out.println(" : PASSED. There are " + list.length + " Loggers Present" ); - System.out.println(""); - System.out.println( "*******************************" ); - System.out.println( "*********** Phase 2B **********" ); - System.out.println( "*******************************" ); - System.out.println( " Examine Existing Loggers" ); - for ( int i = 0; i < list.length; i++ ) { - try { - params[0] = list[i]; - signature[0] = "java.lang.String"; - String levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); - System.out.println(" : Logger #" + i + " = " + list[i] ); - System.out.println(" : Level = " + levelName ); - } - catch ( Exception e ) { - System.out.println(" : FAILED" ); - throw e; - } - } - System.out.println(" : PASSED" ); - } - - /* - * Create two new loggers to the list of Loggers already present - */ - System.out.println(""); - System.out.println( "*******************************" ); - System.out.println( "*********** Phase 3 ***********" ); - System.out.println( "*******************************" ); - System.out.println( " Create and test new Loggers" ); - Logger logger1 = Logger.getLogger( LOGGER_NAME_1 ); - Logger logger2 = Logger.getLogger( LOGGER_NAME_2 ); - - // check that Level object are returned properly - try { - list = (String[]) mbs.getAttribute( objectName, "LoggerNames" ); - } - catch ( Exception e ) { - System.out.println(" : FAILED" ); - throw e; - } - - /* - * Check for the existence of our new Loggers - */ - boolean log1 = false, log2 = false; - - if ( list == null || list.length < 2 ) { - System.out.println(" : FAILED. Could not Detect the presense of the new Loggers" ); - throw new RuntimeException( - "Could not Detect the presense of the new Loggers"); - } - else { - for ( int i = 0; i < list.length; i++ ) { - if ( list[i].equals( LOGGER_NAME_1 ) ) { - log1 = true; - System.out.println( " : Found new Logger : " + list[i] ); - } - if ( list[i].equals( LOGGER_NAME_2 ) ) { - log2 = true; - System.out.println( " : Found new Logger : " + list[i] ); - } - } - if ( log1 && log2 ) - System.out.println( " : PASSED." ); - else { - System.out.println( " : FAILED. Could not Detect the new Loggers." ); - throw new RuntimeException( - "Could not Detect the presense of the new Loggers"); - } - } - - /* - * Set a new Logging levels and check that it succeeded - */ - System.out.println(""); - System.out.println( "*******************************" ); - System.out.println( "*********** Phase 4 ***********" ); - System.out.println( "*******************************" ); - System.out.println( " Set and Check the Logger Level" ); - log1 = false; - log2 = false; - try { - // Set the level of logger1 to ALL - params = new Object[2]; - signature = new String[2]; - params[0] = LOGGER_NAME_1; - params[1] = Level.ALL.getName(); - signature[0] = "java.lang.String"; - signature[1] = "java.lang.String"; - mbs.invoke( objectName, "setLoggerLevel", params, signature ); - - // Set the level of logger2 to FINER - params[0] = LOGGER_NAME_2; - params[1] = Level.FINER.getName(); - mbs.invoke( objectName, "setLoggerLevel", params, signature ); - - // Okay read back the Level from Logger1. Should be ALL - params = new Object[1]; - signature = new String[1]; - params[0] = LOGGER_NAME_1; - signature[0] = "java.lang.String"; - String levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); - l = Level.parse(levelName); - System.out.print(" Logger1: " ); - if ( l.equals( l.ALL ) ) { - System.out.println("Level Set to ALL: PASSED" ); - log1 = true; - } - else { - System.out.println("Level Set to ALL: FAILED" ); - throw new RuntimeException( - "Level Set to ALL but returned " + l.toString()); - } - - // Okay read back the Level from Logger2. Should be FINER - params = new Object[1]; - signature = new String[1]; - params[0] = LOGGER_NAME_2; - signature[0] = "java.lang.String"; - levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); - l = Level.parse(levelName); - System.out.print(" Logger2: " ); - if ( l.equals( l.FINER ) ) { - System.out.println("Level Set to FINER: PASSED" ); - log2 = true; - } - else { - System.out.println("Level Set to FINER: FAILED" ); - throw new RuntimeException( - "Level Set to FINER but returned " + l.toString()); - } - } - catch ( Exception e ) { - throw e; - } - - System.out.println( "" ); - System.out.println( "***************************************************" ); - System.out.println( "***************** All Tests Passed ****************" ); - System.out.println( "***************************************************" ); - } - - public static void main(String[] argv) throws Exception { - List result = - ManagementFactory.getPlatformMXBeans(PlatformLoggingMXBean.class); - if (result.size() != 1) { - throw new RuntimeException("Unexpected number of PlatformLoggingMXBean instances: " + - result.size()); - } - - PlatformLoggingMXBean mbean = result.get(0); - ObjectName objname = mbean.getObjectName(); - if (!objname.equals(new ObjectName(LogManager.LOGGING_MXBEAN_NAME))) { - throw new RuntimeException("Invalid ObjectName " + objname); - } - - // check if the PlatformLoggingMXBean is registered in the platform MBeanServer - MBeanServer platformMBS = ManagementFactory.getPlatformMBeanServer(); - ObjectName objName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME); - // We could call mbs.isRegistered(objName) here. - // Calling getMBeanInfo will throw exception if not found. - platformMBS.getMBeanInfo(objName); - - if (!platformMBS.isInstanceOf(objName, "java.util.logging.PlatformLoggingMXBean") || - !platformMBS.isInstanceOf(objName, "java.util.logging.LoggingMXBean")) { - throw new RuntimeException(objName + " is of unexpected type"); - } - - // test if PlatformLoggingMXBean works properly in a MBeanServer - PlatformLoggingMXBeanTest test = new PlatformLoggingMXBeanTest(); - test.runTest(mbean); - } -} --- /dev/null Mon Mar 28 11:54:33 2011 +++ new/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java Mon Mar 28 11:54:33 2011 @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6876135 7024172 + * + * @summary Test PlatformLoggingMXBean + * This test performs similar testing as + * java/util/logging/LoggingMXBeanTest. + * + * @build PlatformLoggingMXBeanTest + * @run main PlatformLoggingMXBeanTest + */ + +import javax.management.*; +import java.lang.management.ManagementFactory; +import java.lang.management.PlatformLoggingMXBean; +import java.util.logging.*; +import java.util.List; + +public class PlatformLoggingMXBeanTest +{ + + ObjectName objectName = null; + static String LOGGER_NAME_1 = "com.sun.management.Logger1"; + static String LOGGER_NAME_2 = "com.sun.management.Logger2"; + + public PlatformLoggingMXBeanTest() throws Exception { + } + + private void runTest(PlatformLoggingMXBean mBean) throws Exception { + + /* + * Create the MBeanServeri, register the PlatformLoggingMXBean + */ + System.out.println( "***************************************************" ); + System.out.println( "********** PlatformLoggingMXBean Unit Test **********" ); + System.out.println( "***************************************************" ); + System.out.println( "" ); + System.out.println( "*******************************" ); + System.out.println( "*********** Phase 1 ***********" ); + System.out.println( "*******************************" ); + System.out.println( " Creating MBeanServer " ); + System.out.print( " Register PlatformLoggingMXBean: " ); + MBeanServer mbs = MBeanServerFactory.createMBeanServer(); + String[] list = new String[0]; + + try { + objectName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME); + mbs.registerMBean( mBean, objectName ); + } + catch ( Exception e ) { + System.out.println( "FAILED" ); + throw e; + } + System.out.println( "PASSED" ); + System.out.println(""); + + /* + * Access our MBean to get the current list of Loggers + */ + System.out.println( "*******************************" ); + System.out.println( "*********** Phase 2 ***********" ); + System.out.println( "*******************************" ); + System.out.println( " Test Logger Name retrieval (getLoggerNames) " ); + // check that Level object are returned properly + try { + list = (String[]) mbs.getAttribute( objectName, "LoggerNames" ); + } + catch ( Exception e ) { + System.out.println(" : FAILED" ); + throw e; + } + + /* + * Dump the list of Loggers already present, if any + */ + Object[] params = new Object[1]; + String[] signature = new String[1]; + Level l; + + if ( list == null ) { + System.out.println(" : PASSED. No Standard Loggers Present" ); + System.out.println(""); + } + else { + System.out.println(" : PASSED. There are " + list.length + " Loggers Present" ); + System.out.println(""); + System.out.println( "*******************************" ); + System.out.println( "*********** Phase 2B **********" ); + System.out.println( "*******************************" ); + System.out.println( " Examine Existing Loggers" ); + for ( int i = 0; i < list.length; i++ ) { + try { + params[0] = list[i]; + signature[0] = "java.lang.String"; + String levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); + System.out.println(" : Logger #" + i + " = " + list[i] ); + System.out.println(" : Level = " + levelName ); + } + catch ( Exception e ) { + System.out.println(" : FAILED" ); + throw e; + } + } + System.out.println(" : PASSED" ); + } + + /* + * Create two new loggers to the list of Loggers already present + */ + System.out.println(""); + System.out.println( "*******************************" ); + System.out.println( "*********** Phase 3 ***********" ); + System.out.println( "*******************************" ); + System.out.println( " Create and test new Loggers" ); + Logger logger1 = Logger.getLogger( LOGGER_NAME_1 ); + Logger logger2 = Logger.getLogger( LOGGER_NAME_2 ); + + // check that Level object are returned properly + try { + list = (String[]) mbs.getAttribute( objectName, "LoggerNames" ); + } + catch ( Exception e ) { + System.out.println(" : FAILED" ); + throw e; + } + + /* + * Check for the existence of our new Loggers + */ + boolean log1 = false, log2 = false; + + if ( list == null || list.length < 2 ) { + System.out.println(" : FAILED. Could not Detect the presense of the new Loggers" ); + throw new RuntimeException( + "Could not Detect the presense of the new Loggers"); + } + else { + for ( int i = 0; i < list.length; i++ ) { + if ( list[i].equals( LOGGER_NAME_1 ) ) { + log1 = true; + System.out.println( " : Found new Logger : " + list[i] ); + } + if ( list[i].equals( LOGGER_NAME_2 ) ) { + log2 = true; + System.out.println( " : Found new Logger : " + list[i] ); + } + } + if ( log1 && log2 ) + System.out.println( " : PASSED." ); + else { + System.out.println( " : FAILED. Could not Detect the new Loggers." ); + throw new RuntimeException( + "Could not Detect the presense of the new Loggers"); + } + } + + /* + * Set a new Logging levels and check that it succeeded + */ + System.out.println(""); + System.out.println( "*******************************" ); + System.out.println( "*********** Phase 4 ***********" ); + System.out.println( "*******************************" ); + System.out.println( " Set and Check the Logger Level" ); + log1 = false; + log2 = false; + try { + // Set the level of logger1 to ALL + params = new Object[2]; + signature = new String[2]; + params[0] = LOGGER_NAME_1; + params[1] = Level.ALL.getName(); + signature[0] = "java.lang.String"; + signature[1] = "java.lang.String"; + mbs.invoke( objectName, "setLoggerLevel", params, signature ); + + // Set the level of logger2 to FINER + params[0] = LOGGER_NAME_2; + params[1] = Level.FINER.getName(); + mbs.invoke( objectName, "setLoggerLevel", params, signature ); + + // Okay read back the Level from Logger1. Should be ALL + params = new Object[1]; + signature = new String[1]; + params[0] = LOGGER_NAME_1; + signature[0] = "java.lang.String"; + String levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); + l = Level.parse(levelName); + System.out.print(" Logger1: " ); + if ( l.equals( l.ALL ) ) { + System.out.println("Level Set to ALL: PASSED" ); + log1 = true; + } + else { + System.out.println("Level Set to ALL: FAILED" ); + throw new RuntimeException( + "Level Set to ALL but returned " + l.toString()); + } + + // Okay read back the Level from Logger2. Should be FINER + params = new Object[1]; + signature = new String[1]; + params[0] = LOGGER_NAME_2; + signature[0] = "java.lang.String"; + levelName = (String) mbs.invoke( objectName, "getLoggerLevel", params, signature ); + l = Level.parse(levelName); + System.out.print(" Logger2: " ); + if ( l.equals( l.FINER ) ) { + System.out.println("Level Set to FINER: PASSED" ); + log2 = true; + } + else { + System.out.println("Level Set to FINER: FAILED" ); + throw new RuntimeException( + "Level Set to FINER but returned " + l.toString()); + } + } + catch ( Exception e ) { + throw e; + } + + System.out.println( "" ); + System.out.println( "***************************************************" ); + System.out.println( "***************** All Tests Passed ****************" ); + System.out.println( "***************************************************" ); + } + + public static void main(String[] argv) throws Exception { + PlatformLoggingMXBean mbean = + ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class); + ObjectName objname = mbean.getObjectName(); + if (!objname.equals(new ObjectName(LogManager.LOGGING_MXBEAN_NAME))) { + throw new RuntimeException("Invalid ObjectName " + objname); + } + + // check if the PlatformLoggingMXBean is registered in the platform MBeanServer + MBeanServer platformMBS = ManagementFactory.getPlatformMBeanServer(); + ObjectName objName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME); + + // We could call mbs.isRegistered(objName) here. + // Calling getMBeanInfo will throw exception if not found. + platformMBS.getMBeanInfo(objName); + + if (!platformMBS.isInstanceOf(objName, "java.lang.management.PlatformLoggingMXBean") || + !platformMBS.isInstanceOf(objName, "java.util.logging.LoggingMXBean")) { + throw new RuntimeException(objName + " is of unexpected type"); + } + + // test if PlatformLoggingMXBean works properly in a MBeanServer + PlatformLoggingMXBeanTest test = new PlatformLoggingMXBeanTest(); + test.runTest(mbean); + } +}