Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -50,9 +50,18 @@ import gnu.java.lang.management.RuntimeMXBeanImpl;
import gnu.java.lang.management.ThreadMXBeanImpl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.LogManager;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
/**
* <p>
@ -66,7 +75,55 @@ import javax.management.NotCompliantMBeanException;
* <ol>
* <li>Calling the appropriate static method of this factory.
* </li>
* <li>Using the platform {@link javax.management.MBeanServer}
* to access the beans locally, or an
* {@link javax.management.MBeanServerConnection} for remote
* access. The attributes and operations use the limited
* range of data types specified below.</li>
* </ol>
* <h2>Open Data Types</h2>
* <p>
* The data types used by the management beans are restricted
* to <emph>open</emph> data types to aid interoperability. This
* allows the beans to be accessed remotely, including from non-Java
* clients. Below is a table which lists the types used by the beans
* on the left, and the types they are converted to when returned via
* a bean server on the right. Type information is provided for each
* bean by obtaining its instance of {@link javax.management.MBeanInfo}.
* </p>
* <table>
* <th><td>Data Type Used</td><td>Data Type Returned</td></th>
* <tr>
* <td>Primitive types (<code>int</code>, <code>char</code>, etc.)</td>
* <td>Same</td>
* </tr><tr>
* <td>Wrapper classes ({@link{java.lang.Integer},
* @link{java.lang.Character}, etc.)</td>
* <td>Same</td>
* </tr><tr>
* <td>An {@link java.lang.Enum}</td>
* <td>The <code>name</code> of the enumeration constant</td>
* </tr><tr>
* <td>An array of type <code>E</code></td>
* <td>An array of the same dimensions with this mapping applied
* to <code>E</code>.</td>
* </tr><tr>
* <td>A class with `getter' methods and a
* <code>from({@link javax.management.openmbean.CompositeData})</code>
* method.</td>
* <td>The equivalent {@link javax.management.openmbean.CompositeData}
* instance, specified by the <code>from</code> method.</td>
* </tr><tr>
* <td>A map with keys of type <code>K</code> and values of
* type <code>V</code>.</td>
* <td>A {@link javax.management.openmbean.TabularData} instance,
* with the row type containing two items, <code>"key"</code> and
* <code>"value"</code> with the types <code>K</code> and <code>V</code>
* respectively (with translation applied).</td>
* </tr><tr>
* <td>A list of type <code>E</code>.</td>
* <td>An array with this mapping applied to <code>E</code>.</td>
* </tr></table>
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @since 1.5
@ -74,6 +131,60 @@ import javax.management.NotCompliantMBeanException;
public class ManagementFactory
{
/**
* The object name for the class loading bean.
*/
public static final String CLASS_LOADING_MXBEAN_NAME =
"java.lang:type=ClassLoading";
/**
* The object name for the compilation bean.
*/
public static final String COMPILATION_MXBEAN_NAME =
"java.lang:type=Compilation";
/**
* The domain for the garbage collecting beans.
*/
public static final String GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE =
"java.lang:type=GarbageCollector";
/**
* The domain for the memory manager beans.
*/
public static final String MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE =
"java.lang:type=MemoryManager";
/**
* The object name for the memory bean.
*/
public static final String MEMORY_MXBEAN_NAME =
"java.lang:type=Memory";
/**
* The domain for the memory pool beans.
*/
public static final String MEMORY_POOL_MXBEAN_DOMAIN_TYPE =
"java.lang:type=MemoryPool";
/**
* The object name for the operating system bean.
*/
public static final String OPERATING_SYSTEM_MXBEAN_NAME =
"java.lang:type=OperatingSystem";
/**
* The object name for the runtime bean.
*/
public static final String RUNTIME_MXBEAN_NAME =
"java.lang:type=Runtime";
/**
* The object name for the threading bean.
*/
public static final String THREAD_MXBEAN_NAME =
"java.lang:type=Threading";
/**
* The operating system management bean.
*/
@ -104,6 +215,11 @@ public class ManagementFactory
*/
private static CompilationMXBean compilationBean;
/**
* The platform server.
*/
private static MBeanServer platformServer;
/**
* Private constructor to prevent instance creation.
*/
@ -258,9 +374,10 @@ public class ManagementFactory
*
* @return a list of memory pool beans, one for each pool.
*/
public static List getMemoryPoolMXBeans()
public static List<MemoryPoolMXBean> getMemoryPoolMXBeans()
{
List poolBeans = new ArrayList();
List<MemoryPoolMXBean> poolBeans =
new ArrayList<MemoryPoolMXBean>();
String[] names = VMManagementFactory.getMemoryPoolNames();
for (int a = 0; a < names.length; ++a)
try
@ -283,9 +400,10 @@ public class ManagementFactory
*
* @return a list of memory manager beans, one for each manager.
*/
public static List getMemoryManagerMXBeans()
public static List<MemoryManagerMXBean> getMemoryManagerMXBeans()
{
List managerBeans = new ArrayList();
List<MemoryManagerMXBean> managerBeans =
new ArrayList<MemoryManagerMXBean>();
String[] names = VMManagementFactory.getMemoryManagerNames();
for (int a = 0; a < names.length; ++a)
try
@ -309,9 +427,10 @@ public class ManagementFactory
*
* @return a list of garbage collector beans, one for each pool.
*/
public static List getGarbageCollectorMXBeans()
public static List<GarbageCollectorMXBean> getGarbageCollectorMXBeans()
{
List gcBeans = new ArrayList();
List<GarbageCollectorMXBean> gcBeans =
new ArrayList<GarbageCollectorMXBean>();
String[] names = VMManagementFactory.getGarbageCollectorNames();
for (int a = 0; a < names.length; ++a)
try
@ -328,4 +447,106 @@ public class ManagementFactory
return gcBeans;
}
/**
* <p>
* Returns the platform {@link javax.management.MBeanServer}. On the
* first call to this method, a server instance is retrieved from
* the {@link javax.management.MBeanServerFactory} and each of the
* beans are registered with it. Subsequent calls return the existing
* instance. If the property <code>javax.management.builder.initial</code>
* is set, its value will be used as the name of the class which is used
* to provide the server instance.
* </p>
* <p>
* It is recommended that the platform server is used for other beans as
* well, in order to simplify their discovery and publication. Name conflicts
* should be avoided.
* </p>
*
* @return the platform {@link javax.management.MBeanServer}
* @throws SecurityException if a security manager exists and the
* caller's permissions don't imply {@link
* MBeanServerPermission(String)}("createMBeanServer")
* @see javax.management.MBeanServerFactory
* @see javax.management.MBeanServerFactory#createMBeanServer()
*/
public static MBeanServer getPlatformMBeanServer()
{
if (platformServer == null)
{
platformServer = MBeanServerFactory.createMBeanServer();
try
{
platformServer.registerMBean(getOperatingSystemMXBean(),
new ObjectName(OPERATING_SYSTEM_MXBEAN_NAME));
platformServer.registerMBean(getRuntimeMXBean(),
new ObjectName(RUNTIME_MXBEAN_NAME));
platformServer.registerMBean(getClassLoadingMXBean(),
new ObjectName(CLASS_LOADING_MXBEAN_NAME));
platformServer.registerMBean(getThreadMXBean(),
new ObjectName(THREAD_MXBEAN_NAME));
platformServer.registerMBean(getMemoryMXBean(),
new ObjectName(MEMORY_MXBEAN_NAME));
CompilationMXBean compBean = getCompilationMXBean();
if (compBean != null)
platformServer.registerMBean(compBean,
new ObjectName(COMPILATION_MXBEAN_NAME));
Iterator beans = getMemoryPoolMXBeans().iterator();
while (beans.hasNext())
{
MemoryPoolMXBean bean = (MemoryPoolMXBean) beans.next();
platformServer.registerMBean(bean,
new ObjectName(MEMORY_POOL_MXBEAN_DOMAIN_TYPE +
",name=" +
bean.getName()));
}
beans = getMemoryManagerMXBeans().iterator();
while (beans.hasNext())
{
MemoryManagerMXBean bean = (MemoryManagerMXBean) beans.next();
platformServer.registerMBean(bean,
new ObjectName(MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE +
",name=" +
bean.getName()));
}
beans = getGarbageCollectorMXBeans().iterator();
while (beans.hasNext())
{
GarbageCollectorMXBean bean = (GarbageCollectorMXBean) beans.next();
platformServer.registerMBean(bean,
new ObjectName(GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE +
",name=" +
bean.getName()));
}
platformServer.registerMBean(LogManager.getLoggingMXBean(),
new ObjectName(LogManager.LOGGING_MXBEAN_NAME));
}
catch (InstanceAlreadyExistsException e)
{
throw (Error)
(new InternalError("One of the management beans is " +
"already registered.").initCause(e));
}
catch (MBeanRegistrationException e)
{
throw (Error)
(new InternalError("One of the management beans' preRegister " +
"methods threw an exception.").initCause(e));
}
catch (NotCompliantMBeanException e)
{
throw (Error)
(new InternalError("One of the management beans is " +
"not compliant.").initCause(e));
}
catch (MalformedObjectNameException e)
{
throw (Error)
(new InternalError("The object name of a management bean is " +
"not compliant.").initCause(e));
}
}
return platformServer;
}
}