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}