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

org.opentripplanner.ext.ridehailing.service.oauth.CachingOAuthService Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.ridehailing.service.oauth;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.opentripplanner.ext.ridehailing.RideHailingService;
import org.opentripplanner.framework.json.ObjectMappers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A base class for OAuth implementations for retrieving and caching access tokens.
 */
public abstract class CachingOAuthService implements OAuthService {

  private static final ObjectMapper MAPPER = ObjectMappers.ignoringExtraFields();
  private static final Logger LOG = LoggerFactory.getLogger(RideHailingService.class);
  private CachedOAuthToken cachedToken = CachedOAuthToken.empty();

  /**
   * Obtains and caches an OAuth API access token.
   * @return A token holder with the token value (including null token values if the call was unsuccessful).
   */
  @Override
  public String getToken() throws IOException {
    if (cachedToken.isExpired()) {
      // prepare request to get token
      try {
        var request = oauthTokenRequest();
        LOG.info("Requesting new {} access token", request.uri());
        var response = HttpClient.newHttpClient()
          .send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
          LOG.error(
            "Error fetching OAuth token from {}. Response: {}",
            request.uri(),
            response.body()
          );
          throw new IOException("Could not fetch OAuth token from %s".formatted(request.uri()));
        }

        var token = MAPPER.readValue(response.body(), SerializedOAuthToken.class);
        this.cachedToken = new CachedOAuthToken(token);

        LOG.info("Received new access token from URL {}", request.uri());
      } catch (InterruptedException e) {
        throw new IOException(e);
      }
    }

    return cachedToken.value;
  }

  protected abstract HttpRequest oauthTokenRequest();

  public record SerializedOAuthToken(String access_token, long expires_in) {}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy