001
002package io.vrap.rmf.base.client;
003
004import java.net.URI;
005import java.util.concurrent.CompletableFuture;
006
007import com.fasterxml.jackson.core.type.TypeReference;
008import com.fasterxml.jackson.databind.JavaType;
009
010import io.vrap.rmf.base.client.http.HandlerStack;
011
012import org.apache.commons.lang3.builder.EqualsBuilder;
013import org.apache.commons.lang3.builder.HashCodeBuilder;
014
015/**
016 * Default implementation of an {@link ApiHttpClient}
017 */
018public class ApiHttpClientImpl extends AutoCloseableService implements ApiHttpClient {
019
020    private final HandlerStack stack;
021    private final URI baseUri;
022    private final ResponseSerializer serializer;
023
024    public ApiHttpClientImpl(final String baseUri, final HandlerStack stack) {
025        this(URI.create(baseUri), stack, ResponseSerializer.of());
026    }
027
028    public ApiHttpClientImpl(final URI baseUri, final HandlerStack stack) {
029        this(baseUri, stack, ResponseSerializer.of());
030    }
031
032    public ApiHttpClientImpl(final URI baseUri, final HandlerStack stack, final ResponseSerializer serializer) {
033        this.stack = stack;
034        this.baseUri = baseUri;
035        this.serializer = serializer;
036    }
037
038    @Override
039    public CompletableFuture<ApiHttpResponse<byte[]>> execute(final ApiHttpRequest request) {
040        rejectExecutionIfClosed(CLOSED_MESSAGE);
041        return stack.execute(request.resolve(baseUri));
042    }
043
044    @Override
045    public <O> CompletableFuture<ApiHttpResponse<O>> execute(final ClientRequestCommand<O> method) {
046        return method.execute(this);
047    }
048
049    @Override
050    public <O> CompletableFuture<ApiHttpResponse<O>> execute(final ApiHttpRequest request, final Class<O> outputType) {
051        return execute(request).thenApply(response -> serializer.convertResponse(response, outputType));
052    }
053
054    @Override
055    public <O> CompletableFuture<ApiHttpResponse<O>> execute(final ApiHttpRequest request,
056            final TypeReference<O> outputType) {
057        return execute(request).thenApply(response -> serializer.convertResponse(response, outputType));
058    }
059
060    @Override
061    public <O> CompletableFuture<ApiHttpResponse<O>> execute(final ApiHttpRequest request, final JavaType outputType) {
062        return execute(request).thenApply(response -> serializer.convertResponse(response, outputType));
063    }
064
065    @Override
066    public URI getBaseUri() {
067        return baseUri;
068    }
069
070    @Override
071    public ResponseSerializer getSerializerService() {
072        return serializer;
073    }
074
075    @Override
076    protected void internalClose() {
077        closeQuietly(stack);
078    }
079
080    @Override
081    public boolean equals(Object o) {
082        if (this == o)
083            return true;
084
085        if (o == null || getClass() != o.getClass())
086            return false;
087
088        ApiHttpClientImpl that = (ApiHttpClientImpl) o;
089
090        return new EqualsBuilder().append(stack, that.stack)
091                .append(baseUri, that.baseUri)
092                .append(serializer, that.serializer)
093                .isEquals();
094    }
095
096    @Override
097    public int hashCode() {
098        return new HashCodeBuilder(17, 37).append(stack).append(baseUri).append(serializer).toHashCode();
099    }
100}