All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.clouway.oauth2.client.ReuseTokenSource Maven / Gradle / Ivy

package com.clouway.oauth2.client;

import java.io.IOException;
import java.util.Date;
import java.util.Optional;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReuseTokenSource is a token source which resuses token until it expires or it's replaced with
 * a new token.
 *
 * @author Miroslav Genov ([email protected])
 */
class ReuseTokenSource implements TokenSource {
  /**
   * Lock used to protect Token which will be re-used by multiple threads.
   */
  private final ReentrantLock lock = new ReentrantLock();
  /**
   * TokenSource used as source of tokens.
   */
  private final TokenSource source;

  // A Mutable state which is protected by {@link ReentrantLock}
  private Token token;

  public ReuseTokenSource(Token token, TokenSource source) {
    this.token = token;
    this.source = source;
  }

  @Override
  public Optional token(Date instant) throws IOException {
    lock.lock();
    try {
      // No token was specified
      if (token == null) {
        return refreshTokenFromSource(instant);
      }

      if (token.isAvailableAt(instant)) {
        return Optional.of(token);
      }

      return refreshTokenFromSource(instant);
    } finally {
      lock.unlock();
    }
  }
  // The caller need to ensure that token is safe for update by multiple threads
  private Optional refreshTokenFromSource(Date instant) throws IOException {
    Optional possibleToken = source.token(instant);
    if (!possibleToken.isPresent()) {
      return possibleToken;
    }
    // It's safe to be updated cause it's protected by the caller
    token = possibleToken.get();

    return possibleToken;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy