/**
*
*/
package vnet.sms.common.spring.jmx.support;
import static org.apache.commons.lang.Validate.notNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.jmx.export.MBeanExportOperations;
import vnet.sms.common.spring.jmx.MBeanExportOperationsAware;
/**
* @author obergner
*
*/
public class MBeanExportOperationsInjector implements BeanPostProcessor,
ApplicationContextAware {
private final Logger log = LoggerFactory.getLogger(getClass());
private ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(
final ApplicationContext applicationContext) throws BeansException {
notNull(applicationContext,
"Argument 'applicationContext' must not be null");
this.applicationContext = applicationContext;
}
private ApplicationContext getMandatoryApplicationContext()
throws IllegalStateException {
if (this.applicationContext == null) {
throw new IllegalStateException(
"No ApplicationContext has been set. Are you using this class outside Spring and forgot to explicitly set an ApplicationContext?");
}
return this.applicationContext;
}
/**
* @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object,
* java.lang.String)
*/
@Override
public Object postProcessBeforeInitialization(final Object bean,
final String beanName) throws BeansException {
this.log.trace(
"Testing if bean [name = {} | bean = {}] implements [{}] ...",
new Object[] { beanName, bean,
MBeanExportOperationsAware.class.getName() });
if (bean instanceof MBeanExportOperationsAware) {
this.log.info(
"Bean [name = {} | bean = {}] implements [{}] - will inject [{}] instance",
new Object[] { beanName, bean,
MBeanExportOperationsAware.class.getName(),
MBeanExportOperations.class.getName() });
MBeanExportOperationsAware.class.cast(bean)
.setMBeanExportOperations(
getMandatoryMBeanExportOperations());
} else {
this.log.trace(
"Bean [name = {} | bean = {}] does NOT implement [{}] - skipping",
new Object[] { beanName, bean,
MBeanExportOperationsAware.class.getName() });
}
return bean;
}
/**
* @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object,
* java.lang.String)
*/
@Override
public Object postProcessAfterInitialization(final Object bean,
final String beanName) throws BeansException {
return bean;
}
private MBeanExportOperations getMandatoryMBeanExportOperations()
throws IllegalStateException {
if (getMandatoryApplicationContext().getBeansOfType(
MBeanExportOperations.class).isEmpty()) {
throw new IllegalStateException("No implementation of ["
+ MBeanExportOperations.class.getName()
+ "] has been registered in ApplicationContext ["
+ getMandatoryApplicationContext()
+ "]. Please register an MBeanExporter.");
}
return getMandatoryApplicationContext().getBean(
MBeanExportOperations.class);
}
}