public static ServiceInstance install(MBeanServer server,
ObjectName objectName,
ServiceMetaData metaData,
Object mbean) throws Exception {
if (server == null)
throw new IllegalArgumentException("Null MBeanServer");
if (objectName == null)
throw new IllegalArgumentException("Null ObjectName");
if (metaData == null && mbean == null)
throw new IllegalArgumentException("Either metadata or an mbean object must be supplied");
// Check for duplicate
if (server.isRegistered(objectName))
throw new DeploymentException("Trying to install an already registered mbean: " + objectName);
try
{
ServiceInstance result = null;
// No meta data just register directly
if (metaData == null)
{
ObjectInstance instance = server.registerMBean(mbean, objectName);
result = new ServiceInstance(instance, mbean);
}
else
{
String code = metaData.getCode();
if (code == null || code.trim().length() == 0)
throw new ConfigurationException("Missing or empty code for mbean " + objectName);
String xmbeanDD = metaData.getXMBeanDD();
// Not an XMBean
if (xmbeanDD == null)
{
String interfaceName = metaData.getInterfaceName();
if (interfaceName != null)
result = installStandardMBean(server, objectName, metaData);
else
result = installPlainMBean(server, objectName, metaData);
}
// Embedded XMBean Descriptor
else if (xmbeanDD.length() == 0)
result = installEmbeddedXMBean(server, objectName, metaData);
// Reference to external XMBean descriptor
else
result = installExternalXMBean(server, objectName, metaData);
}
log.debug("Created mbean: " + objectName);
return result;
}
catch (Throwable e)
{
Throwable newE = JMXExceptionDecoder.decode(e);
// didn't work, unregister in case the jmx agent is screwed.
try
{
server.unregisterMBean(objectName);
}
catch (Throwable ignore)
{
}
DeploymentException.rethrowAsDeploymentException("Unable to createMBean for " + objectName, newE);
throw new UnreachableStatementException();
}
}
|