Created class FacebookUtils, that configures the added extensions
[facebook-utils] / src / main / java / de / juplo / facebook / FacebookUtils.java
1 package de.juplo.facebook;
2
3
4 import java.util.Arrays;
5 import java.util.LinkedList;
6 import java.util.List;
7 import javax.annotation.PostConstruct;
8 import org.codehaus.jackson.map.ObjectMapper;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.BeansException;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.beans.factory.config.BeanPostProcessor;
14 import org.springframework.context.annotation.Bean;
15 import org.springframework.context.annotation.Configuration;
16 import org.springframework.http.converter.HttpMessageConverter;
17 import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
18 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
19 import org.springframework.security.oauth2.client.token.AccessTokenProvider;
20 import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
21 import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
22 import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
23 import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
24 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
25
26
27
28 /**
29  * This class injects the facebook-utils into the spring-oauth2-configuration
30  *
31  * @author kai
32  */
33 @Configuration
34 public class FacebookUtils
35 {
36   private final Logger log = LoggerFactory.getLogger(FacebookUtils.class);
37
38
39   @Autowired(required=false)
40   private List<AccessTokenProvider> accessTokenProviderChain;
41   /**
42    * Needed, to extract Jackson-ObjectMapper.
43    * Defined by <mvc:annotation-driven />
44    */
45   @Autowired
46   private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
47
48   private ObjectMapper objectMapper;
49
50
51   @PostConstruct
52   public void init()
53   {
54     for (HttpMessageConverter<?> messageConverter : requestMappingHandlerAdapter.getMessageConverters())
55     {
56       if (messageConverter instanceof MappingJacksonHttpMessageConverter)
57       {
58         MappingJacksonHttpMessageConverter m =
59             (MappingJacksonHttpMessageConverter)messageConverter;
60         objectMapper = m.getObjectMapper();
61         log.info(
62             "found ObjectMapper {} ({})",
63             objectMapper,
64             objectMapper.getClass().getCanonicalName()
65             );
66         break;
67       }
68     }
69     if (objectMapper == null)
70     {
71       throw new RuntimeException(
72           "Unable to find MappingJAcksonHttpMessageConverter!"
73           );
74     }
75
76     if (accessTokenProviderChain == null)
77     {
78       log.info("no AccessTokenProviderChain configured, creating default-chain");
79       accessTokenProviderChain =
80           Arrays.<AccessTokenProvider> asList(
81               new ImplicitAccessTokenProvider(),
82               new ResourceOwnerPasswordAccessTokenProvider(),
83               new ClientCredentialsAccessTokenProvider()
84               );
85     }
86   }
87
88
89   @Bean
90   public BeanPostProcessor getBeanPostProcessor(final String clientSecret)
91   {
92     log.debug("createing new instance of BeanPostProcessor");
93     return new BeanPostProcessor() {
94
95       @Override
96       public Object postProcessBeforeInitialization(
97           Object bean,
98           String beanName
99           )
100           throws
101             BeansException
102       {
103         if (bean instanceof OAuth2RestTemplate)
104         {
105           log.info("injecting signed_request-aware AccessTokenProviderChain");
106           OAuth2RestTemplate template = (OAuth2RestTemplate)bean;
107           List<AccessTokenProvider> chain =
108               new LinkedList<>(accessTokenProviderChain);
109           SignedRequestAwareAuthorizationCodeAccessTokenProvider provider =
110               new SignedRequestAwareAuthorizationCodeAccessTokenProvider();
111           provider.setSecret(clientSecret);
112           provider.setObjectMapper(objectMapper);
113           chain.add(provider);
114           template.setAccessTokenProvider(new AccessTokenProviderChain(chain));
115         }
116
117         return bean;
118       }
119
120       @Override
121       public Object postProcessAfterInitialization(
122           Object bean,
123           String beanName
124           )
125           throws
126             BeansException
127       {
128         return bean;
129       }
130     };
131   }
132 }