package com.totvslabs.mdm.restclient;
import java.util.Calendar;
import java.util.List;
import com.totvslabs.mdm.restclient.command.CommandAuth;
import com.totvslabs.mdm.restclient.command.CommandRefreshToken;
import com.totvslabs.mdm.restclient.vo.AuthVO;
import com.totvslabs.mdm.restclient.vo.EnvelopeVO;
import com.totvslabs.mdm.restclient.vo.GenericVO;
import com.totvslabs.mdm.restclient.vo.RefreshTokenVO;
public class MDMRestAuthentication {
private static MDMRestAuthentication instance;
private String mdmURL;
private AuthVO authVO;
private Calendar experiedCalend = Calendar.getInstance();
private MDMRestAuthentication(String mdmUrl, String refreshToken, String accessToken, String clientId, Long timeIssuedMs, Long expiresInSeconds) {
this.authVO = new AuthVO();
this.mdmURL = mdmUrl;
this.authVO.setRefresh_token(refreshToken);
this.authVO.setAccess_token(accessToken);
this.authVO.setClient_id(clientId);
this.authVO.setTimeIssuedInMillis(timeIssuedMs);
this.authVO.setExpires_in(expiresInSeconds);
this.updateIssueCalend(timeIssuedMs, expiresInSeconds);
}
private void updateIssueCalend(Long timeIssuedMs, Long expiresInSeconds) {
experiedCalend.setTimeInMillis(timeIssuedMs);
experiedCalend.add(Calendar.SECOND, expiresInSeconds.intValue());
}
public static MDMRestAuthentication getInstance(String mdmURL, String subdomain, String datasourceId, String username, String password) {
if(MDMRestAuthentication.instance == null) {
AuthVO authVO = MDMRestAuthentication.authorization(mdmURL, subdomain, datasourceId, username, password);
MDMRestAuthentication.instance = new MDMRestAuthentication(mdmURL, authVO.getRefresh_token(), authVO.getAccess_token(), authVO.getClient_id(), authVO.getTimeIssuedInMillis(), authVO.getExpires_in());
}
else {
MDMRestAuthentication.instance.refreshToken();
}
return MDMRestAuthentication.instance;
}
public static MDMRestAuthentication getInstance() {
if (MDMRestAuthentication.instance == null) {
throw new RuntimeException("Authentication is required to use this operation.");
}
MDMRestAuthentication.instance.refreshToken();
return MDMRestAuthentication.instance;
}
private static AuthVO authorization(String mdmURL, String subdomain, String datasourceId, String username, String password) {
MDMRestConnection connection = MDMRestConnectionFactory.getConnection(mdmURL);
EnvelopeVO authResult = connection.executeCommand(new CommandAuth(subdomain, datasourceId, username, password));
List<GenericVO> authsVO = authResult.getHits();
AuthVO authVO = (AuthVO) authsVO.get(0);
return authVO;
}
private void refreshToken() {
if(Calendar.getInstance().after(this.experiedCalend)) {
MDMRestConnection connection = MDMRestConnectionFactory.getConnection(mdmURL);
EnvelopeVO authResult = connection.executeCommand(new CommandRefreshToken(authVO.getRefresh_token()));
List<GenericVO> authsVO = authResult.getHits();
RefreshTokenVO refreshTokenVO = (RefreshTokenVO) authsVO.get(0);
this.authVO.setAccess_token(refreshTokenVO.getAccess_token());
this.authVO.setClient_id(refreshTokenVO.getClient_id());
this.authVO.setTimeIssuedInMillis(refreshTokenVO.getTimeIssuedInMillis());
this.authVO.setExpires_in(refreshTokenVO.getExpires_in());
this.updateIssueCalend(refreshTokenVO.getTimeIssuedInMillis(), refreshTokenVO.getExpires_in());
}
}
public AuthVO getAuthVO() {
return authVO;
}
}