// Path: app-desktop/src/main/java/com/google/ce/media/contentuploader/message/AuthInfo.java
// public class AuthInfo {
// 
//   private String bucket;
//   private String accessToken;
//   private String refreshToken;
// 
//   private String userId, name, email, pictureUrl;
// 
//   private Long issuedSeconds, expirationSeconds;
// 
//   private List<Destination> destinations;
// 
//   private List<Destination> authorizedDestinations;
// 
//   private String analyticsEndpoint;
// 
//   private String analyticsUsername, analyticsPassword;
// 
//   public String getBucket() {
//     return bucket;
//   }
// 
//   public void setBucket(String bucket) {
//     this.bucket = bucket;
//   }
// 
//   public String getAccessToken() {
//     return accessToken;
//   }
// 
//   public void setAccessToken(String accessToken) {
//     this.accessToken = accessToken;
//   }
// 
//   public String getRefreshToken() {
//     return refreshToken;
//   }
// 
//   public void setRefreshToken(String refreshToken) {
//     this.refreshToken = refreshToken;
//   }
// 
//   public String getUserId() {
//     return userId;
//   }
// 
//   public void setUserId(String userId) {
//     this.userId = userId;
//   }
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public String getPictureUrl() {
//     return pictureUrl;
//   }
// 
//   public void setPictureUrl(String pictureUrl) {
//     this.pictureUrl = pictureUrl;
//   }
// 
//   public Long getIssuedSeconds() {
//     return issuedSeconds;
//   }
// 
//   public void setIssuedSeconds(Long issuedSeconds) {
//     this.issuedSeconds = issuedSeconds;
//   }
// 
//   public Long getExpirationSeconds() {
//     return expirationSeconds;
//   }
// 
//   public void setExpirationSeconds(Long expirationSeconds) {
//     this.expirationSeconds = expirationSeconds;
//   }
// 
//   public List<Destination> getDestinations() {
//     return destinations;
//   }
// 
//   public void setDestinations(List<Destination> destinations) {
//     this.destinations = destinations;
//   }
// 
//   public String getAnalyticsEndpoint() {
//     return analyticsEndpoint;
//   }
// 
//   public void setAnalyticsEndpoint(String analyticsEndpoint) {
//     this.analyticsEndpoint = analyticsEndpoint;
//   }
// 
//   public String getAnalyticsUsername() {
//     return analyticsUsername;
//   }
// 
//   public void setAnalyticsUsername(String analyticsUsername) {
//     this.analyticsUsername = analyticsUsername;
//   }
// 
//   public String getAnalyticsPassword() {
//     return analyticsPassword;
//   }
// 
//   public void setAnalyticsPassword(String analyticsPassword) {
//     this.analyticsPassword = analyticsPassword;
//   }
// 
//   public List<Destination> getAuthorizedDestinations() {
//     return authorizedDestinations;
//   }
// 
//   public void setAuthorizedDestinations(List<Destination> authorizedDestinations) {
//     this.authorizedDestinations = authorizedDestinations;
//   }
// }
// 
// Path: app-desktop/src/main/java/com/google/ce/media/contentuploader/message/Destination.java
// public class Destination {
//   private String gcsBucket;
//   private String gcsFolder;
//   private String displayName;
// 
//   private Destination() {
//   }
// 
//   public Destination(String gcsBucket, String gcsFolder, String displayName) {
//     this.gcsBucket = gcsBucket;
//     this.gcsFolder = gcsFolder;
//     this.displayName = displayName;
//   }
// 
//   public String getGcsBucket() {
//     return gcsBucket;
//   }
// 
//   public String getGcsFolder() {
//     return gcsFolder;
//   }
// 
//   public String getDisplayName() {
//     return displayName;
//   }
// 
//   @Override
//   public String toString() {
//     return displayName;
//   }
// }


import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.api.gax.paging.Page;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.ce.media.contentuploader.message.AuthInfo;
import com.google.ce.media.contentuploader.message.Destination;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageException;
import com.google.cloud.storage.StorageOptions;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
    return authInfo;
  }

  public Storage getStorage() {
    synchronized (REFRESH_LOCK) {
      if((authInfo.getExpirationSeconds() - (System.currentTimeMillis()/1000L)) < REFRESH_THRESHOLD_SECS) {
        updateToken(null);
      }
      return storage;
    }
  }

  public AuthInfo getAuthInfo() {
    return authInfo;
  }

  private void buildStorage() {
    storage = StorageOptions
            .newBuilder()
            .setCredentials(credentials)
            .build()
            .getService();
  }

  public interface AuthConfigListener {
    public void authInfoUpdated();
    public void authInfoError(Exception e);
  }

  private void validateAuthorization() {
// Path: app-desktop/src/main/java/com/google/ce/media/contentuploader/message/AuthInfo.java
// public class AuthInfo {
// 
//   private String bucket;
//   private String accessToken;
//   private String refreshToken;
// 
//   private String userId, name, email, pictureUrl;
// 
//   private Long issuedSeconds, expirationSeconds;
// 
//   private List<Destination> destinations;
// 
//   private List<Destination> authorizedDestinations;
// 
//   private String analyticsEndpoint;
// 
//   private String analyticsUsername, analyticsPassword;
// 
//   public String getBucket() {
//     return bucket;
//   }
// 
//   public void setBucket(String bucket) {
//     this.bucket = bucket;
//   }
// 
//   public String getAccessToken() {
//     return accessToken;
//   }
// 
//   public void setAccessToken(String accessToken) {
//     this.accessToken = accessToken;
//   }
// 
//   public String getRefreshToken() {
//     return refreshToken;
//   }
// 
//   public void setRefreshToken(String refreshToken) {
//     this.refreshToken = refreshToken;
//   }
// 
//   public String getUserId() {
//     return userId;
//   }
// 
//   public void setUserId(String userId) {
//     this.userId = userId;
//   }
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public String getPictureUrl() {
//     return pictureUrl;
//   }
// 
//   public void setPictureUrl(String pictureUrl) {
//     this.pictureUrl = pictureUrl;
//   }
// 
//   public Long getIssuedSeconds() {
//     return issuedSeconds;
//   }
// 
//   public void setIssuedSeconds(Long issuedSeconds) {
//     this.issuedSeconds = issuedSeconds;
//   }
// 
//   public Long getExpirationSeconds() {
//     return expirationSeconds;
//   }
// 
//   public void setExpirationSeconds(Long expirationSeconds) {
//     this.expirationSeconds = expirationSeconds;
//   }
// 
//   public List<Destination> getDestinations() {
//     return destinations;
//   }
// 
//   public void setDestinations(List<Destination> destinations) {
//     this.destinations = destinations;
//   }
// 
//   public String getAnalyticsEndpoint() {
//     return analyticsEndpoint;
//   }
// 
//   public void setAnalyticsEndpoint(String analyticsEndpoint) {
//     this.analyticsEndpoint = analyticsEndpoint;
//   }
// 
//   public String getAnalyticsUsername() {
//     return analyticsUsername;
//   }
// 
//   public void setAnalyticsUsername(String analyticsUsername) {
//     this.analyticsUsername = analyticsUsername;
//   }
// 
//   public String getAnalyticsPassword() {
//     return analyticsPassword;
//   }
// 
//   public void setAnalyticsPassword(String analyticsPassword) {
//     this.analyticsPassword = analyticsPassword;
//   }
// 
//   public List<Destination> getAuthorizedDestinations() {
//     return authorizedDestinations;
//   }
// 
//   public void setAuthorizedDestinations(List<Destination> authorizedDestinations) {
//     this.authorizedDestinations = authorizedDestinations;
//   }
// }
// 
// Path: app-desktop/src/main/java/com/google/ce/media/contentuploader/message/Destination.java
// public class Destination {
//   private String gcsBucket;
//   private String gcsFolder;
//   private String displayName;
// 
//   private Destination() {
//   }
// 
//   public Destination(String gcsBucket, String gcsFolder, String displayName) {
//     this.gcsBucket = gcsBucket;
//     this.gcsFolder = gcsFolder;
//     this.displayName = displayName;
//   }
// 
//   public String getGcsBucket() {
//     return gcsBucket;
//   }
// 
//   public String getGcsFolder() {
//     return gcsFolder;
//   }
// 
//   public String getDisplayName() {
//     return displayName;
//   }
// 
//   @Override
//   public String toString() {
//     return displayName;
//   }
// }


// Path: app-desktop/src/main/java/com/google/ce/media/contentuploader/config/AuthConfig.java
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.api.gax.paging.Page;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.ce.media.contentuploader.message.AuthInfo;
import com.google.ce.media.contentuploader.message.Destination;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageException;
import com.google.cloud.storage.StorageOptions;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

    return authInfo;
  }

  public Storage getStorage() {
    synchronized (REFRESH_LOCK) {
      if((authInfo.getExpirationSeconds() - (System.currentTimeMillis()/1000L)) < REFRESH_THRESHOLD_SECS) {
        updateToken(null);
      }
      return storage;
    }
  }

  public AuthInfo getAuthInfo() {
    return authInfo;
  }

  private void buildStorage() {
    storage = StorageOptions
            .newBuilder()
            .setCredentials(credentials)
            .build()
            .getService();
  }

  public interface AuthConfigListener {
    public void authInfoUpdated();
    public void authInfoError(Exception e);
  }

  private void validateAuthorization() {
    List<Destination> destinations = authInfo.getDestinations();