package com.apigee.mgmtapi.sdk.client;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.codec.Base64;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import com.apigee.mgmtapi.sdk.core.AppConfig;
import com.apigee.mgmtapi.sdk.model.AccessToken;
import com.apigee.mgmtapi.sdk.service.FileService;
import com.google.gson.Gson;
public class MgmtAPIClient {
private static final Logger logger = Logger.getLogger(MgmtAPIClient.class);
/**
* To get the Access Token Management URL, client_id and client_secret needs
* to be passed through a config file whose full path is passed as system
* property like -DconfigFile.path="/to/dir/config.properties"
*
* @param username
* @param password
* @return
* @throws Exception
*/
public AccessToken getAccessToken(String username, String password) throws Exception {
Environment env = this.getConfigProperties();
if (env == null) {
logger.error("Config file missing");
throw new Exception("Config file missing");
}
return getAccessToken(env.getProperty("mgmt.login.url"), env.getProperty("mgmt.login.client.id"),
env.getProperty("mgmt.login.client.secret"), username, password);
}
/**
* To get the Access Token Management URL, client_id and client_secret needs
* to be passed through a config file whose full path is passed as system
* property like -DconfigFile.path="/to/dir/config.properties"
*
* @param username
* @param password
* @param mfa
* @return
* @throws Exception
*/
public AccessToken getAccessToken(String username, String password, String mfa) throws Exception {
Environment env = this.getConfigProperties();
if (env == null) {
logger.error("Config file missing");
throw new Exception("Config file missing");
}
if (mfa == null || mfa.equals("")) {
logger.error("mfa cannot be empty");
throw new Exception("mfa cannot be empty");
}
return getAccessToken(env.getProperty("mgmt.login.mfa.url")+mfa, env.getProperty("mgmt.login.client.id"),
env.getProperty("mgmt.login.client.secret"), username, password);
}
/**
* To get Access Token
* @param url
* @param clientId
* @param client_secret
* @param username
* @param password
* @param mfa
* @return
* @throws Exception
*/
public AccessToken getAccessToken(String url, String clientId, String client_secret, String username,
String password, String mfa) throws Exception {
return getAccessToken(url+"?mfa_token="+mfa, clientId, client_secret, username, password);
}
/**
* To get the Access Token
*
* @param url
* @param clientId
* @param client_secret
* @param username
* @param password
* @return
* @throws Exception
*/
public AccessToken getAccessToken(String url, String clientId, String client_secret, String username,
String password) throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
AccessToken token = new AccessToken();
ResponseEntity<String> result = null;
try {
headers.add("Authorization", "Basic "
+ new String(Base64.encode((clientId + ":" + client_secret).getBytes()), Charset.forName("UTF-8")));
headers.add("Content-Type", "application/x-www-form-urlencoded");
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("username", username);
map.add("password", password);
map.add("grant_type", "password");
HttpEntity<Object> request = new HttpEntity<Object>(map, headers);
result = restTemplate.postForEntity(url, request, String.class);
if (result.getStatusCode().equals(HttpStatus.OK)) {
Gson gson = new Gson();
token = gson.fromJson(result.getBody(), AccessToken.class);
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
}
return token;
}
/**
* To get the Access Token from Refresh Token
*
* @param url
* @param clientId
* @param client_secret
* @param username
* @param password
* @return
* @throws Exception
*/
public AccessToken getAccessTokenFromRefreshToken(String url, String clientId, String client_secret, String refreshToken) throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
AccessToken token = new AccessToken();
ResponseEntity<String> result = null;
try {
headers.add("Authorization", "Basic "
+ new String(Base64.encode((clientId + ":" + client_secret).getBytes()), Charset.forName("UTF-8")));
headers.add("Content-Type", "application/x-www-form-urlencoded");
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("refresh_token", refreshToken);
map.add("grant_type", "refresh_token");
HttpEntity<Object> request = new HttpEntity<Object>(map, headers);
result = restTemplate.postForEntity(url, request, String.class);
if (result.getStatusCode().equals(HttpStatus.OK)) {
Gson gson = new Gson();
token = gson.fromJson(result.getBody(), AccessToken.class);
}
} catch (Exception e) {
logger.error("Refresh Token could be invalid or expired: "+e.getMessage());
throw e;
}
return token;
}
/**
* Fetch the properties from the property file passed as system argument (-DconfigFile.path)
* @return
*/
public Environment getConfigProperties() {
AbstractApplicationContext context;
FileService service = null;
try {
if (System.getProperty("configFile.path") != null
&& !System.getProperty("configFile.path").equalsIgnoreCase("")) {
context = new AnnotationConfigApplicationContext(AppConfig.class);
service = (FileService) context.getBean("fileService");
} else
return null;
} catch (Exception e) {
logger.error(e.getMessage());
}
return service.getEnvironment();
}
}