package com.alipay.easysdk.kms.aliyun.credentials.provider; import com.alipay.easysdk.kms.aliyun.credentials.EcsRamRoleCredentials; import com.alipay.easysdk.kms.aliyun.credentials.ICredentials; import com.alipay.easysdk.kms.aliyun.credentials.exceptions.CredentialException; public class EcsRamRoleCredentialsProvider implements ICredentialsProvider { private static final int MAX_ECS_METADATA_FETCH_RETRY_TIMES = 3; private final String roleName; private EcsRamRoleCredentials credentials = null; private ECSMetadataServiceCredentialsFetcher fetcher; public EcsRamRoleCredentialsProvider(String roleName) { if (null == roleName) { throw new NullPointerException("You must specifiy a valid role name."); } this.roleName = roleName; this.fetcher = new ECSMetadataServiceCredentialsFetcher(); this.fetcher.setRoleName(this.roleName); } public EcsRamRoleCredentialsProvider withFetcher(ECSMetadataServiceCredentialsFetcher fetcher) { this.fetcher = fetcher; this.fetcher.setRoleName(roleName); return this; } @Override public ICredentials getCredentials() throws CredentialException { if (credentials == null || credentials.isExpired()) { credentials = fetcher.fetch(MAX_ECS_METADATA_FETCH_RETRY_TIMES); } else if (credentials.willSoonExpire() && credentials.shouldRefresh()) { try { credentials = fetcher.fetch(); } catch (CredentialException e) { // Use the current expiring session token and wait for next round credentials.setLastFailedRefreshTime(); } } return credentials; } }