package com.onaro.sanscreen.client.jmxframework;
import java.lang.management.ManagementFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
* Contains generic functionalities for MBean services like:
*
* - Object Name creation
*
- Registraction and Unregister with the MBean Server
*
- Call backs to the service implemention class
*
*
* @since 05/01/2008
* @author john.cohen
*/
public abstract class FrameworkService implements FrameworkServiceMBean {
/**
* Name of SANscreen JMX service
*/
public static final String CLIENT_JMX_DOMAIN_NAME = "SANscreen GUI"; //$NON-NLS-1$
/**
* Name of JMX property holding the service name
*/
public static final String CLIENT_JMX_SERVICE_NAME_PROPERTY = "name"; //$NON-NLS-1$
private static final Logger logger = LogManager.getLogger(FrameworkService.class);
private final String serviceName;
private final ObjectName objectName;
/**
* Constructor.
*
* @param serviceName name of the service that is going to be exposes by MBean.
*/
public FrameworkService(final String serviceName){
this.serviceName = serviceName;
objectName = createObjectName();
}
public String getServiceName() {
return serviceName;
}
public void start() {
// Call back to the implementation class, for additional actions.
doStart();
// Registers the MBean
registerMBean(this, objectName);
}
public void stop() {
// Call back to the implementation class, for additional actions.
doStop();
// Registers the MBean
unregisterMBean(objectName);
}
private ObjectName createObjectName() {
try {
return new ObjectName(CLIENT_JMX_DOMAIN_NAME, CLIENT_JMX_SERVICE_NAME_PROPERTY, getServiceName());
}
catch (MalformedObjectNameException e) {
logger.error(e.getMessage(), e);
return null;
}
}
private void registerMBean(final Object implementation, final ObjectName objectName) {
// Unregister any left overs for this MBean (this is usefull only when testing)
if (ManagementFactory.getPlatformMBeanServer().isRegistered(objectName))
unregisterMBean(objectName);
try {
ManagementFactory.getPlatformMBeanServer().registerMBean(implementation, objectName);
if (logger.isDebugEnabled())
logger.debug(getServiceName() + " - Registered MBean as " + getServiceName()); //$NON-NLS-1$
}
catch (Exception e) {
logger.error("Failed to register MBean for " + getServiceName(), e); //$NON-NLS-1$
}
}
private void unregisterMBean(final ObjectName objectName) {
try {
ManagementFactory.getPlatformMBeanServer().unregisterMBean(objectName);
if (logger.isDebugEnabled())
logger.debug(getServiceName() + " - Unregistered MBean " + getServiceName()); //$NON-NLS-1$
}
catch (Exception e) {
logger.error("Failed to unregister MBean for " + getServiceName(), e); //$NON-NLS-1$
}
}
/**
* Call back method intendent to be overriden by the implementing class.
*/
public abstract void doStart();
/**
* Call back method intendent to be overriden by the implementing class.
*/
public abstract void doStop();
}