package fi.otavanopisto.muikku.plugins.schooldatapyramus.rest;
import java.time.OffsetDateTime;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
import org.apache.commons.lang3.StringUtils;
import fi.otavanopisto.muikku.controller.PluginSettingsController;
import fi.otavanopisto.muikku.plugins.schooldatapyramus.SchoolDataPyramusPluginDescriptor;
@Singleton
@ApplicationScoped
public class SystemAccessTokenProvider {
private static final int EXPIRE_SLACK = 3;
@Inject
private PluginSettingsController pluginSettingsController;
@Inject
private Logger logger;
@PostConstruct
public void init() {
accessToken = null;
refreshToken = null;
accessTokenExpires = null;
authCode = pluginSettingsController.getPluginSetting(SchoolDataPyramusPluginDescriptor.PLUGIN_NAME, "system.authCode");
if(StringUtils.isEmpty(authCode)){
logger.log(Level.SEVERE, "SystemAuthCode is missing!");
}
}
public String getAccessToken(PyramusRestClient restClient, Client client) {
if (accessToken == null) {
AccessToken createdAccessToken = restClient.createAccessToken(client, authCode);
accessToken = createdAccessToken.getAccessToken();
refreshToken = createdAccessToken.getRefreshToken();
accessTokenExpires = OffsetDateTime.now().plusSeconds(createdAccessToken.getExpiresIn());
} else if (accessTokenExpires == null || System.currentTimeMillis() > accessTokenExpires.toInstant().toEpochMilli()) {
AccessToken refreshedAccessToken = restClient.refreshAccessToken(client, refreshToken);
accessToken = refreshedAccessToken.getAccessToken();
accessTokenExpires = OffsetDateTime.now().plusSeconds(refreshedAccessToken.getExpiresIn() - EXPIRE_SLACK);
}
return accessToken;
}
private String accessToken;
private String refreshToken;
private OffsetDateTime accessTokenExpires;
private String authCode;
}