/**
*
*/
package vnet.sms.common.shell.springshell.internal.converters;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import vnet.sms.common.shell.springshell.Converter;
/**
* @author obergner
*
*/
public class ConvertersRegistry implements Iterable<Converter<?>>,
BeanPostProcessor {
private final Logger log = LoggerFactory
.getLogger(getClass());
private final Set<Converter<?>> allConverters = new HashSet<Converter<?>>();
// ------------------------------------------------------------------------
// API
// ------------------------------------------------------------------------
@Override
public Iterator<Converter<?>> iterator() {
return getAllConverters().iterator();
}
public final Set<Converter<?>> getAllConverters() {
return Collections.unmodifiableSet(this.allConverters);
}
// ------------------------------------------------------------------------
// BeanPostProcessor
// ------------------------------------------------------------------------
/**
* @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, Converter.class.getName() });
if (bean instanceof Converter) {
this.log.info(
"Bean [name = {} | bean = {}] implements [{}] - it will be added to the set of known converters",
new Object[] { beanName, bean, Converter.class.getName() });
this.allConverters.add(Converter.class.cast(bean));
} else {
this.log.trace(
"Bean [name = {} | bean = {}] does NOT implement [{}] - SKIPPING",
new Object[] { beanName, bean, Converter.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;
}
}