com.bandwidth.controllers.BaseController Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bandwidth-sdk Show documentation
Show all versions of bandwidth-sdk Show documentation
The official client SDK for Bandwidth's Voice, Messaging, MFA, and WebRTC APIs
/*
* BandwidthLib
*
* This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
*/
package com.bandwidth.controllers;
import com.bandwidth.AuthManager;
import com.bandwidth.Configuration;
import com.bandwidth.exceptions.ApiException;
import com.bandwidth.http.client.HttpCallback;
import com.bandwidth.http.client.HttpClient;
import com.bandwidth.http.client.HttpContext;
import com.bandwidth.http.request.HttpRequest;
import com.bandwidth.http.response.ApiResponse;
import com.bandwidth.http.response.HttpResponse;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
/**
* Base class for all Controllers.
*/
public abstract class BaseController {
protected static final String userAgent = "java-sdk";
/**
* Protected variables to hold an instance of Configuration.
*/
protected final Configuration config;
/**
* Protected variable to hold an instance of HttpCallback if the user provides it.
*/
protected final HttpCallback httpCallback;
protected Map authManagers;
private HttpClient httpClient;
protected BaseController(Configuration config, HttpClient httpClient,
Map authManagers) {
this(config, httpClient, authManagers, null);
}
protected BaseController(Configuration config, HttpClient httpClient,
Map authManagers, HttpCallback httpCallback) {
this.config = config;
this.httpClient = httpClient;
this.authManagers = authManagers;
this.httpCallback = httpCallback;
}
/**
* Get httpCallback associated with this controller.
* @return HttpCallback
*/
public HttpCallback getHttpCallback() {
return httpCallback;
}
/**
* Shared instance of the Http client.
* @return The shared instance of the http client
*/
public HttpClient getClientInstance() {
return httpClient;
}
/**
* Validates the response against HTTP errors defined at the API level.
* @param response The response recieved
* @param context Context of the request and the recieved response
* @throws ApiException Represents error response from the server.
*/
protected void validateResponse(HttpResponse response, HttpContext context)
throws ApiException {
//get response status code to validate
int responseCode = response.getStatusCode();
if ((responseCode < 200) || (responseCode > 208)) { //[200,208] = HTTP OK
throw new ApiException("HTTP Response Not OK", context);
}
}
/**
* RequestSupplier.
*/
protected interface RequestSupplier {
/**
* Supplies the HttpRequest object.
* @return An object of type HttpRequest
* @throws ApiException Represents error response from the server.
* @throws IOException Signals that an I/O exception of some sort has occurred.
*/
HttpRequest supply() throws ApiException, IOException;
}
/**
* RequestExecutor.
*/
protected interface RequestExecutor {
/**
* Execute a given HttpRequest to get the response back.
* @param request The given HttpRequest to execute
* @return CompletableFuture of HttpResponse after execution
*/
CompletableFuture execute(HttpRequest request);
}
/**
* ResponseHandler.
*/
protected interface ResponseHandler {
/**
* Handles the response for an endpoint.
* @param context HttpContext of the request and the received response
* @return An object of type T wrapped in ApiResponse.
* @throws ApiException Represents error response from the server.
* @throws IOException Signals that an I/O exception of some sort has occurred.
*/
ApiResponse handle(HttpContext context) throws ApiException, IOException;
}
/**
* Make an asynchronous HTTP endpoint call.
* @param The type of the object for response
* @param requestSupplier An object of RequestSupplier to supply an instance of HttpRequest
* @param requestExecutor An object of RequestExecutor to execute the given request
* @param responseHandler An object of ResponseHandler to handle the endpoint response
* @return An object of type CompletableFuture of T
*/
public CompletableFuture> makeHttpCallAsync(RequestSupplier requestSupplier,
RequestExecutor requestExecutor, ResponseHandler responseHandler) {
final HttpRequest request;
try {
request = requestSupplier.supply();
} catch (Exception e) {
CompletableFuture> futureResponse = new CompletableFuture<>();
futureResponse.completeExceptionally(e);
return futureResponse;
}
// Invoke request and get response
return requestExecutor.execute(request).thenApplyAsync(response -> {
HttpContext context = new HttpContext(request, response);
try {
return responseHandler.handle(context);
} catch (Exception e) {
throw new CompletionException(e);
}
});
}
}