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