1 package com.atlassian.plugin.osgi.spring;
2
3 import org.springframework.beans.factory.BeanFactoryAware;
4 import org.springframework.beans.factory.config.BeanDefinition;
5 import org.springframework.beans.factory.config.BeanPostProcessor;
6 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
8 import org.springframework.beans.factory.support.RootBeanDefinition;
9
10 import java.util.function.Supplier;
11
12 final class BeanFactoryPostProcessorUtils {
13 private BeanFactoryPostProcessorUtils() {
14 }
15
16 static <T extends BeanPostProcessor> void registerPostProcessor(
17 final ConfigurableListableBeanFactory beanFactory,
18 final String beanName,
19 final Class<T> beanClass,
20 final Supplier<T> postProcessorSupplier) {
21
22 if (beanFactory instanceof BeanDefinitionRegistry) {
23 final BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
24
25
26 if (!registry.containsBeanDefinition(beanName)) {
27 final RootBeanDefinition def = new RootBeanDefinition(beanClass);
28 def.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
29 registry.registerBeanDefinition(beanName, def);
30 }
31 } else {
32 final BeanPostProcessor postProcessor = postProcessorSupplier.get();
33 if (postProcessor instanceof BeanFactoryAware) {
34 ((BeanFactoryAware)postProcessor).setBeanFactory(beanFactory);
35 }
36 beanFactory.addBeanPostProcessor(postProcessor);
37 }
38 }
39 }