package net.techreadiness.spring;
import java.util.Collection;
import java.util.List;
import javax.inject.Named;
import javax.ws.rs.Path;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
@Named
public class JaxRSBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Nothing to do
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (registry.containsBeanDefinition("restServer")) {
BeanDefinition beanDefinition = registry.getBeanDefinition("restServer");
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(Path.class));
BeanNameGenerator nameGenerator = new AnnotationBeanNameGenerator();
List<RuntimeBeanReference> beanNames = new ManagedList<>();
for (BeanDefinition definition : scanner.findCandidateComponents("net.techreadiness")) {
String beanName = nameGenerator.generateBeanName(definition, registry);
beanNames.add(new RuntimeBeanReference(beanName));
}
beanNames.addAll((Collection<? extends RuntimeBeanReference>) beanDefinition.getPropertyValues()
.getPropertyValue("serviceBeans").getValue());
beanDefinition.getPropertyValues().add("serviceBeans", beanNames);
}
}
}