package com.pivotallabs.api;
import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import java.io.IOException;
import java.io.InputStream;
public class ApiGateway {
private final Http http = new Http();
public <T extends ApiResponse> void makeRequest(ApiRequest<T> apiRequest, final ApiResponseCallbacks<T> responseCallbacks) {
new RemoteCallTask(responseCallbacks).execute(apiRequest);
}
protected void dispatch(ApiResponse apiResponse, ApiResponseCallbacks responseCallbacks) {
if (apiResponse.isSuccess()) {
try {
responseCallbacks.onSuccess(apiResponse);
} catch (Exception e) {
Log.e(ApiGateway.class.getName(), "Error proccessing response", e);
responseCallbacks.onFailure(apiResponse);
}
} else {
responseCallbacks.onFailure(apiResponse);
}
responseCallbacks.onComplete();
}
private class RemoteCallTask extends AsyncTask<ApiRequest, Void, ApiResponse> {
private final ApiResponseCallbacks responseCallbacks;
public RemoteCallTask(ApiResponseCallbacks responseCallbacks) {
this.responseCallbacks = responseCallbacks;
}
@Override
protected ApiResponse doInBackground(ApiRequest... apiRequests) {
ApiRequest apiRequest = apiRequests[0];
InputStream responseBody = null;
try {
Http.Response response;
if (HttpPost.METHOD_NAME.equals(apiRequest.getMethod())) {
response = http.post(apiRequest.getUrlString(), apiRequest.getHeaders(), apiRequest.getPostBody(), apiRequest.getUsername(), apiRequest.getPassword());
} else if (HttpGet.METHOD_NAME.equals(apiRequest.getMethod())) {
response = http.get(apiRequest.getUrlString(), apiRequest.getHeaders(), apiRequest.getUsername(), apiRequest.getPassword());
} else {
throw new RuntimeException("Unsupported Http Method!");
}
responseBody = response.getResponseBody();
ApiResponse apiResponse = apiRequest.createResponse(response.getStatusCode());
apiResponse.consumeResponse(responseBody);
return apiResponse;
} catch (Exception e) {
return apiRequest.createResponse(-1);
} finally {
if (responseBody != null) {
try {
responseBody.close();
} catch (IOException ignored) {
}
}
}
}
@Override
protected void onPostExecute(ApiResponse apiResponse) {
dispatch(apiResponse, responseCallbacks);
}
}
}