package io.sphere.sdk.play.metrics;
import io.sphere.sdk.http.HttpClient;
import io.sphere.sdk.http.HttpRequest;
import io.sphere.sdk.http.HttpResponse;
import play.mvc.Http;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletionStage;
public class MetricHttpClient implements HttpClient {
private final HttpClient underlying;
private MetricHttpClient(final HttpClient underlying) {
this.underlying = underlying;
}
@Override
public CompletionStage<HttpResponse> execute(final HttpRequest httpRequest) {
final Optional<Http.Context> contextOptional = Optional.ofNullable(Http.Context.current.get());
final CompletionStage<HttpResponse> result = underlying.execute(httpRequest);
final long startTimestamp = System.currentTimeMillis();
contextOptional.ifPresent(context ->
result.thenAccept(response -> {
final long stopTimestamp = System.currentTimeMillis();
report(context, httpRequest, response, startTimestamp, stopTimestamp);
}));
return result;
}
@SuppressWarnings("unchecked")
private void report(final Http.Context context, final HttpRequest httpRequest, final HttpResponse response, long startTimestamp, long stopTimestamp) {
final Optional<List<ReportRawData>> dataOptional = Optional.ofNullable((List<ReportRawData>) context.args.get(MetricAction.KEY));
dataOptional.ifPresent(data -> data.add(new ReportRawData(httpRequest, response, startTimestamp, stopTimestamp)));
}
@Override
public void close() {
underlying.close();
}
public static MetricHttpClient of(final HttpClient underlying) {
return new MetricHttpClient(underlying);
}
}