Upgraded all dependencies
[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.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.BeansException;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.beans.factory.config.BeanPostProcessor;
13 import org.springframework.context.annotation.Bean;
14 import org.springframework.context.annotation.Configuration;
15 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
16 import org.springframework.security.oauth2.client.http.OAuth2ErrorHandler;
17 import org.springframework.security.oauth2.client.token.AccessTokenProvider;
18 import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
19 import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
20 import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
21 import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
22
23
24
25 /**
26  * This class injects the facebook-utils into the spring-oauth2-configuration
27  *
28  * @author kai
29  */
30 @Configuration
31 public class FacebookUtils
32 {
33   private final Logger log = LoggerFactory.getLogger(FacebookUtils.class);
34
35
36   @Autowired(required=false)
37   private List<AccessTokenProvider> accessTokenProviderChain;
38
39
40   @PostConstruct
41   public void init()
42   {
43     if (accessTokenProviderChain == null)
44     {
45       log.info("no AccessTokenProviderChain configured, creating default-chain");
46       accessTokenProviderChain =
47           Arrays.<AccessTokenProvider> asList(
48               new ImplicitAccessTokenProvider(),
49               new ResourceOwnerPasswordAccessTokenProvider(),
50               new ClientCredentialsAccessTokenProvider()
51               );
52     }
53   }
54
55
56   @Bean
57   public BeanPostProcessor getBeanPostProcessor(final String clientSecret)
58   {
59     log.debug("createing new instance of BeanPostProcessor");
60     return new BeanPostProcessor() {
61
62       @Override
63       public Object postProcessBeforeInitialization(
64           Object bean,
65           String beanName
66           )
67           throws
68             BeansException
69       {
70         if (bean instanceof OAuth2RestTemplate)
71         {
72           log.info("injecting signed_request-aware AccessTokenProviderChain");
73           OAuth2RestTemplate template = (OAuth2RestTemplate)bean;
74           List<AccessTokenProvider> chain =
75               new LinkedList<>(accessTokenProviderChain);
76           SignedRequestAwareAuthorizationCodeAccessTokenProvider provider =
77               new SignedRequestAwareAuthorizationCodeAccessTokenProvider();
78           provider.setSecret(clientSecret);
79           chain.add(provider);
80           template.setAccessTokenProvider(new AccessTokenProviderChain(chain));
81           log.info("injecting GraphApiErrorHandler");
82           template.setErrorHandler(
83               new GraphApiErrorHandler(
84                   (OAuth2ErrorHandler)template.getErrorHandler()
85                   )
86               );
87         }
88
89         return bean;
90       }
91
92       @Override
93       public Object postProcessAfterInitialization(
94           Object bean,
95           String beanName
96           )
97           throws
98             BeansException
99       {
100         return bean;
101       }
102     };
103   }
104 }