WIP: Spring-Upgrade auf 2.2.0
[facebook-errors] / src / main / java / de / juplo / facebook / errors / FacebookErrorsSpringSocialAutoConfiguration.java
1 package de.juplo.facebook.errors;
2
3
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6 import org.springframework.beans.BeansException;
7 import org.springframework.beans.factory.BeanCreationException;
8 import org.springframework.beans.factory.config.BeanDefinition;
9 import org.springframework.beans.factory.config.BeanPostProcessor;
10 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
11 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
12 import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
13 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
14 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
15 import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
16 import org.springframework.context.annotation.Bean;
17 import org.springframework.context.annotation.Configuration;
18 import org.springframework.web.client.ResponseErrorHandler;
19 import org.springframework.web.client.RestTemplate;
20
21
22
23 /**
24  * Automatic configuration for Srping-Social-Facebook
25  *
26  * @author Kai Moritz
27  */
28 @Configuration
29 @ConditionalOnClass(value = FacebookTemplate.class)
30 @AutoConfigureAfter({
31   WebMvcAutoConfiguration.class,
32   FacebookAutoConfiguration.class
33   })
34 public class FacebookErrorsSpringSocialAutoConfiguration
35 {
36   private static final Logger LOG =
37       LoggerFactory.getLogger(FacebookErrorsSpringSocialAutoConfiguration.class);
38
39
40   @Bean
41   static public BeanPostProcessor errorHandlerInjectorSpringSocial()
42   {
43     LOG.info("Configuring GraphApiErrorHandler for handling error-messages");
44     return new BeanPostProcessor()
45     {
46       @Override
47       public Object postProcessBeforeInitialization(
48           Object bean,
49           String beanName
50           )
51           throws
52           BeansException
53       {
54         return bean;
55       }
56
57       @Override
58       public Object postProcessAfterInitialization(
59           Object bean,
60           String beanName
61           )
62           throws
63           BeansException
64       {
65         if (bean instanceof Facebook)
66         {
67           try
68           {
69             Facebook facebook = (Facebook) bean;
70             RestTemplate template = (RestTemplate) facebook.restOperations();
71             ResponseErrorHandler handler = template.getErrorHandler();
72             template.setErrorHandler(new GraphApiErrorHandler(handler));
73             // Be sure, that the potential exception is triggered before!
74             LOG.debug("Injecting GraphApiErrorHandler in {}", facebook);
75           }
76           catch (BeanCreationException e)
77           {
78             /**
79              * This exception is called, if the BeanPostProcessor is called
80              * with a scoped bean, while the according scope is not
81              * accessible.
82              * This happens during initialization and can safely be ignored,
83              * because we only have to inject the handler for beans, that are
84              * actually usable.
85              */
86           }
87         }
88
89         return bean;
90       }
91     };
92   }
93
94   @Bean
95   static public BeanDefinitionRegistryPostProcessor test()
96   {
97     return new BeanDefinitionRegistryPostProcessor()
98     {
99       @Override
100       public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException
101       {
102         for(String name : registry.getBeanDefinitionNames())
103         {
104           BeanDefinition bean = registry.getBeanDefinition(name);
105           LOG.info("{}: {} - {} / {}", name, bean.getBeanClassName(), bean.getFactoryBeanName(), bean);
106         }
107       }
108
109       @Override
110       public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException
111       {
112         for(String name : factory.getBeanNamesForType(Facebook.class))
113         {
114           BeanDefinition bean = factory.getBeanDefinition(name);
115           LOG.info("{}{}", name, factory.isFactoryBean(name) ? " (factory)" : "");
116         }
117       }
118     };
119   }
120 }