package com.alipay.easysdk.kms.aliyun.credentials; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class EcsRamRoleCredentials extends BasicSessionCredentials { private final Long expiration; private final Double expireFact = 0.95; private final Long refreshIntervalInMillSeconds = 180000L; private long lastFailedRefreshTime = 0; public EcsRamRoleCredentials(String accessKeyId, String accessKeySecret, String sessionToken, String expiration, long roleSessionDurationSeconds) { super(accessKeyId, accessKeySecret, sessionToken, roleSessionDurationSeconds); SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); parser.setTimeZone(TimeZone.getTimeZone("GMT")); try { Date date = parser.parse(expiration.replace('T', ' ').replace('Z', ' ')); this.expiration = date.getTime(); } catch (ParseException e) { throw new IllegalArgumentException("Failed to get valid expiration time from ECS Metadata service."); } } @Override public boolean willSoonExpire() { long now = System.currentTimeMillis(); return this.roleSessionDurationSeconds * (1 - expireFact) > (expiration - now) / 1000; } public boolean isExpired() { long now = System.currentTimeMillis(); return now >= expiration - refreshIntervalInMillSeconds; } public boolean shouldRefresh() { long now = System.currentTimeMillis(); return now - lastFailedRefreshTime > refreshIntervalInMillSeconds; } public void setLastFailedRefreshTime() { lastFailedRefreshTime = System.currentTimeMillis(); } }