package cf.spring;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.FactoryBean;
import cf.client.CloudController;
import cf.client.Token;
import cf.client.TokenProvider;
import cf.client.Uaa;
/**
* Does a client authentication with UAA to get a valid token. The token should be used with the
* {@link javax.inject.Provider} interface so that a fresh token gets fetched after the token expires.
*
* @author Mike Heath
*/
public class ClientTokenProviderFactoryBean implements FactoryBean<TokenProvider> {
private final CloudController cloudController;
private final String client;
private final String clientSecret;
private final TokenProvider tokenProvider = new TokenProvider() {
@Override
public Token get() {
return fetchToken();
}
};
private Token token;
private Token fetchToken() {
synchronized (this) {
if (token == null || token.getExpiration().getTime() - TimeUnit.MINUTES.toMillis(10) < System.currentTimeMillis()) {
final Uaa uaa = cloudController.getUaa();
token = uaa.getClientToken(client, clientSecret);
}
return token;
}
}
public ClientTokenProviderFactoryBean(CloudController cloudController, String client, String clientSecret) {
this.cloudController = cloudController;
this.client = client;
this.clientSecret = clientSecret;
}
@Override
public TokenProvider getObject() throws Exception {
return tokenProvider;
}
@Override
public Class<?> getObjectType() {
return TokenProvider.class;
}
@Override
public boolean isSingleton() {
return true;
}
}