content: package com.alipay.api.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();
      }
  }
  