package org.wheelmap.android.net.request;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.net.URI;
import de.akquinet.android.androlog.Log;
public class RestTemplateExt extends RestTemplate {
private final static String TAG = RestTemplateExt.class.getSimpleName();
private HttpHeaders requestHeaders = new HttpHeaders();
private HttpHeaders responseHeaders;
public HttpHeaders getRequestHttpHeaders() {
return requestHeaders;
}
public HttpHeaders getResponseHttpHeaders() {
return responseHeaders;
}
@Override
protected <T> T doExecute(URI url, HttpMethod method,
RequestCallback requestCallback,
ResponseExtractor<T> responseExtractor) throws RestClientException {
RequestCallbackDecorator requestCallbackDecorator = new RequestCallbackDecorator(
requestCallback);
ResponseExtractor<T> responseExtractorDecorator = new ResponseExtractorDecorator<T>(
responseExtractor);
return super.doExecute(url, method, requestCallbackDecorator,
responseExtractorDecorator);
}
private class RequestCallbackDecorator implements RequestCallback {
public RequestCallbackDecorator(RequestCallback targetRequestCallback) {
this.targetRequestCallback = targetRequestCallback;
}
private RequestCallback targetRequestCallback;
@Override
public void doWithRequest(ClientHttpRequest request) throws IOException {
request.getHeaders().putAll(requestHeaders);
Log.d(TAG, "requestHeaders" + requestHeaders);
if (null != targetRequestCallback) {
targetRequestCallback.doWithRequest(request);
}
}
}
private class ResponseExtractorDecorator<T> implements ResponseExtractor<T> {
private ResponseExtractor<T> targetResponseExtractor;
public ResponseExtractorDecorator(
ResponseExtractor<T> targetResponseExtractor) {
this.targetResponseExtractor = targetResponseExtractor;
}
@Override
public T extractData(ClientHttpResponse response) throws IOException {
responseHeaders = response.getHeaders();
Log.d(TAG, "responseHeaders: " + responseHeaders);
if (targetResponseExtractor != null) {
return targetResponseExtractor.extractData(response);
}
return null;
}
}
}