/**
*
*/
package vnet.sms.gateway.transport.plugin.context;
import static org.apache.commons.lang.Validate.notNull;
import java.io.Serializable;
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 vnet.sms.gateway.transport.plugin.TransportProtocolExtensionPoint;
import vnet.sms.gateway.transport.spi.TransportProtocolPlugin;
/**
* @author obergner
*
*/
public class TransportProtocolPluginInjector implements BeanPostProcessor,
ApplicationContextAware {
private final Logger log = LoggerFactory.getLogger(getClass());
private ApplicationContext 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,
TransportProtocolExtensionPoint.class.getName() });
if (TransportProtocolExtensionPoint.class.isInstance(bean)) {
this.log.trace(
"Bean [name = {} | bean = {}] implements [{}] - will inject TransportProtocolPlugin",
new Object[] { beanName, bean,
TransportProtocolExtensionPoint.class.getName() });
final TransportProtocolPlugin<? extends Serializable, ?> transportProtocolPlugin = lookupUniqueTransportProtocolPlugin();
TransportProtocolExtensionPoint.class.cast(bean).plugin(
transportProtocolPlugin);
this.log.info(
"Injected TransportProtocolPlugin {} into bean [name = {} | bean = {}]",
new Object[] { transportProtocolPlugin, beanName, bean });
} else {
this.log.trace(
"Bean [name = {} | bean = {}] does NOT implement [{}] - skipping",
new Object[] { beanName, bean,
TransportProtocolExtensionPoint.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;
}
@Override
public void setApplicationContext(
final ApplicationContext applicationContext) throws BeansException {
notNull(applicationContext,
"Argument 'applicationContext' must not be null");
this.applicationContext = applicationContext;
}
private TransportProtocolPlugin<? extends Serializable, ?> lookupUniqueTransportProtocolPlugin() {
return getMandatoryApplicationContext().getBean(
TransportProtocolPlugin.class);
}
private ApplicationContext getMandatoryApplicationContext() {
if (this.applicationContext == null) {
throw new IllegalStateException(
"No ApplicationContext has been set");
}
return this.applicationContext;
}
}