Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<url>https://github.com/clean-arch-enablers-project/cae-utils-http-client/blob/main/README.md</url>
<groupId>com.clean-arch-enablers</groupId>
<artifactId>cae-http-client</artifactId>
<version>1.1.0</version>
<version>2.0.0</version>
<packaging>jar</packaging>
<licenses>
<license>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CaeHttpClientFactory {
public class CaeHttpClient {

public static final HttpRequestStarter REQUEST_STARTER = new HttpRequestStarterImplementation();

public static HttpRequestStarter getSingletonClient(){
return CaeHttpClientFactory.REQUEST_STARTER;
public static HttpRequestStarter getStarter(){
return CaeHttpClient.REQUEST_STARTER;
}

}
4 changes: 2 additions & 2 deletions src/main/java/com/cae/http_client/HttpRequestBuilder.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.cae.http_client;

public interface HttpRequestBuilder extends HttpRequestBuilderForHandlers, HttpRequestBuilderForRetrying{
public interface HttpRequestBuilder extends HttpRequestBuilderForHandlers{

HttpRequestBuilder headerOf(String key, String value);
HttpRequestBuilder headersFactory(HttpRequestHeaderFactory httpRequestHeaderFactory);
HttpRequestBuilder pathVariableOf(String pathVariablePlaceholder, String pathVariableValue);
HttpRequestBuilder queryParameterOf(String queryParameterName, String queryParameterValue);
HttpRequestBuilder proxyAddress(String host, Integer port);
HttpRequestModel finishBuildingModel();
HttpRequestModel buildRequestModel();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.cae.http_client.commons.RetriersByExceptionTypeFactory;

public interface HttpRequestBuilderForRetrying {
interface HttpRequestBuilderForRetrying {

HttpRequestBuilder retrierByHttpStatusCode(Integer statusCode, RetrierModel retrierModel);
HttpRequestBuilder retriersByHttpStatusCodeFactory(RetriersByStatusCodeFactory retriersByStatusCodeFactory);
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/cae/http_client/HttpRequestMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@


import com.cae.http_client.implementations.AbstractHttpRequestModel;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public interface HttpRequestMethod {

HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException;
HttpResponse execute(AbstractHttpRequestModel httpRequestModel);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@

import java.util.Map;

public interface RetriersByStatusCodeFactory extends RetriersFactory<Map<Integer, RetrierModel>> {
interface RetriersByStatusCodeFactory extends RetriersFactory<Map<Integer, RetrierModel>> {
}
2 changes: 1 addition & 1 deletion src/main/java/com/cae/http_client/RetryCounter.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.cae.http_client;

public interface RetryCounter {
interface RetryCounter {
boolean thereIsRetryAvailable();
void decreaseRetriesAvailable();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,5 @@ public abstract class AbstractHttpRequestModel implements HttpRequestModel {
protected HttpResponseHandler genericResponseHandler;
protected final Map<Integer, HttpResponseHandler> responseHandlersByStatusCode = new HashMap<>();
protected final Map<Class<? extends Exception>, ExceptionHandler> exceptionHandlersByExceptionType = new HashMap<>();
protected final Map<Integer, RetryCounter> retryCountersByStatusCode = new HashMap<>();
protected final Map<Class<? extends Exception>, RetryCounter> retryCountersByExceptionType = new HashMap<>();

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.cae.http_client.implementations;

import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;

Expand All @@ -16,11 +15,6 @@ public static ExceptionThrownByHttpRequestChecker of(AbstractHttpRequestModel ht
}

public void checkOn(Exception e) {
var retryCounterByExceptionType = ofNullable(this.httpRequestModel.retryCountersByExceptionType.get(e.getClass()));
if (retryCounterByExceptionType.isPresent() && retryCounterByExceptionType.get().thereIsRetryAvailable()) {
retryCounterByExceptionType.get().decreaseRetriesAvailable();
throw new RetryNeededOnExceptionThrownException(e.getClass());
}
var handlerByThisException = ofNullable(this.httpRequestModel.exceptionHandlersByExceptionType.get(e.getClass()));
handlerByThisException.ifPresent(handler -> handler.handle(e));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@


import com.cae.http_client.*;
import com.cae.http_client.commons.RetriersByExceptionTypeFactory;

public class HttpRequestBuilderImplementation extends AbstractHttpRequestBuilder {

Expand Down Expand Up @@ -45,7 +44,7 @@ public HttpRequestBuilder proxyAddress(String host, Integer port) {
}

@Override
public HttpRequestModel finishBuildingModel() {
public HttpRequestModel buildRequestModel() {
return this.httpRequest;
}

Expand Down Expand Up @@ -79,27 +78,4 @@ public HttpRequestBuilder handlersByExceptionTypeFactory(HttpExceptionHandlersBy
return this;
}

@Override
public HttpRequestBuilder retrierByHttpStatusCode(Integer statusCode, RetrierModel retrierModel) {
this.httpRequest.retryCountersByStatusCode.put(statusCode, RetryCounterImplementation.of(retrierModel));
return this;
}

@Override
public HttpRequestBuilder retriersByHttpStatusCodeFactory(RetriersByStatusCodeFactory retriersByStatusCodeFactory) {
retriersByStatusCodeFactory.makeRetriers().forEach((statusCode, retrierModel) -> this.httpRequest.retryCountersByStatusCode.put(statusCode, RetryCounterImplementation.of(retrierModel)));
return this;
}

@Override
public HttpRequestBuilder retrierByExceptionType(Class<? extends Exception> exceptionType, RetrierModel retrierModel) {
this.httpRequest.retryCountersByExceptionType.put(exceptionType, RetryCounterImplementation.of(retrierModel));
return this;
}

@Override
public HttpRequestBuilder retriersByExceptionTypeFactory(RetriersByExceptionTypeFactory retriersByExceptionTypeFactory) {
retriersByExceptionTypeFactory.makeRetriers().forEach((exceptionType, retrierModel) -> this.httpRequest.retryCountersByExceptionType.put(exceptionType, RetryCounterImplementation.of(retrierModel)));
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@

import com.cae.http_client.HttpRequestMethod;
import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public class HttpRequestDeleteMethod implements HttpRequestMethod {

@Override
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException {
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) {
var finalRequest = FinalHttpRequestFactory.makeFinalRequestForDeleteMethodFrom(httpRequestModel);
try {
var unwrappedResponse = FinalHttpRequestExecutor.of(httpRequestModel).execute(finalRequest);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.cae.http_client.implementations;

import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;
import com.cae.http_client.implementations.exceptions.RetryNeededOnHttpStatusCodeException;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

Expand All @@ -18,13 +16,9 @@ static HttpRequestExecutionManager of(AbstractHttpRequestModel httpRequest){
}

protected HttpResponse run() {
try {
var response = this.httpRequest.method.execute(this.httpRequest);
response.ifNeedsHandling(HttpResponseStatusCodeChecker.of(this.httpRequest)::checkOutHandlersFor);
return response;
} catch (RetryNeededOnHttpStatusCodeException | RetryNeededOnExceptionThrownException exception) {
return this.run();
}
var response = this.httpRequest.method.execute(this.httpRequest);
response.ifNeedsHandling(HttpResponseStatusCodeChecker.of(this.httpRequest)::checkOutHandlersFor);
return response;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@

import com.cae.http_client.HttpRequestMethod;
import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public class HttpRequestGetMethod implements HttpRequestMethod {

@Override
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException {
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) {
var finalRequest = FinalHttpRequestFactory.makeFinalRequestForGetMethodFrom(httpRequestModel);
try {
var unwrappedResponse = FinalHttpRequestExecutor.of(httpRequestModel).execute(finalRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

import com.cae.http_client.HttpRequestMethod;
import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public class HttpRequestPatchMethod implements HttpRequestMethod {
@Override
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException {
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) {
var finalRequest = FinalHttpRequestFactory.makeFinalRequestForPatchMethodFrom(httpRequestModel);
try {
var unwrappedResponse = FinalHttpRequestExecutor.of(httpRequestModel).execute(finalRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@

import com.cae.http_client.HttpRequestMethod;
import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public class HttpRequestPostMethod implements HttpRequestMethod {

@Override
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException {
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) {
var finalRequest = FinalHttpRequestFactory.makeFinalRequestForPostMethodFrom(httpRequestModel);
try {
var unwrappedResponse = FinalHttpRequestExecutor.of(httpRequestModel).execute(finalRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@

import com.cae.http_client.HttpRequestMethod;
import com.cae.http_client.HttpResponse;
import com.cae.http_client.implementations.exceptions.RetryNeededOnExceptionThrownException;

public class HttpRequestPutMethod implements HttpRequestMethod {

@Override
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) throws RetryNeededOnExceptionThrownException {
public HttpResponse execute(AbstractHttpRequestModel httpRequestModel) {
var finalRequest = FinalHttpRequestFactory.makeFinalRequestForPutMethodFrom(httpRequestModel);
try {
var unwrappedResponse = FinalHttpRequestExecutor.of(httpRequestModel).execute(finalRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.cae.http_client.HttpResponse;
import com.cae.http_client.HttpResponseHandler;
import com.cae.http_client.implementations.exceptions.NoResponseHandlersAvailableForExecutionException;
import com.cae.http_client.implementations.exceptions.RetryNeededOnHttpStatusCodeException;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

Expand All @@ -13,30 +12,19 @@
public class HttpResponseStatusCodeChecker {

private final AbstractHttpRequestModel httpRequest;
private HttpResponse httpResponse;

public static HttpResponseStatusCodeChecker of(AbstractHttpRequestModel httpRequest){
return new HttpResponseStatusCodeChecker(httpRequest);
}

public void checkOutHandlersFor(HttpResponse response) throws RetryNeededOnHttpStatusCodeException {
this.httpResponse = response;
public void checkOutHandlersFor(HttpResponse response) {
var statusCodeReceived = response.getStatusCode();
var retryCounterForStatusCodeReceived = ofNullable(this.httpRequest.retryCountersByStatusCode.get(statusCodeReceived));
if (retryCounterForStatusCodeReceived.isPresent() && retryCounterForStatusCodeReceived.get().thereIsRetryAvailable()){
retryCounterForStatusCodeReceived.get().decreaseRetriesAvailable();
throw new RetryNeededOnHttpStatusCodeException(response);
}
this.executeHandlerIfAnyIsPresentForTheResponseReceived();
var handler = ofNullable(this.httpRequest.responseHandlersByStatusCode.get(statusCodeReceived))
.orElseGet(() -> this.getGenericHandler(response));
handler.handle(response);
}

private void executeHandlerIfAnyIsPresentForTheResponseReceived() {
var statusCodeReceived = this.httpResponse.getStatusCode();
var handler = ofNullable(this.httpRequest.responseHandlersByStatusCode.get(statusCodeReceived)).orElseGet(this::getGenericHandler);
handler.handle(this.httpResponse);
}

private HttpResponseHandler getGenericHandler() {
return ofNullable(this.httpRequest.genericResponseHandler).orElseThrow(() -> new NoResponseHandlersAvailableForExecutionException(this.httpResponse));
private HttpResponseHandler getGenericHandler(HttpResponse response) {
return ofNullable(this.httpRequest.genericResponseHandler).orElseThrow(() -> new NoResponseHandlersAvailableForExecutionException(response));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import lombok.Getter;

@Getter
public class RetryNeededOnExceptionThrownException extends RuntimeException{
class RetryNeededOnExceptionThrownException extends RuntimeException{

private final Class<? extends Exception> exceptionType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import lombok.Getter;

@Getter
public class RetryNeededOnHttpStatusCodeException extends RuntimeException{
class RetryNeededOnHttpStatusCodeException extends RuntimeException{

private final HttpResponse httpResponse;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
class CaeHttpClientFactoryTest {
class CaeHttpClientTest {

@Test
void shouldReturnFilledInstance(){
Assertions.assertNotNull(CaeHttpClientFactory.REQUEST_STARTER);
Assertions.assertNotNull(CaeHttpClient.REQUEST_STARTER);
}

@Test
void shouldReturnSingletonInstanceWhenDirectlyCallingAttribute(){
var resultFromCallOne = CaeHttpClientFactory.REQUEST_STARTER;
var resultFromCallTwo = CaeHttpClientFactory.REQUEST_STARTER;
var resultFromCallThree = CaeHttpClientFactory.REQUEST_STARTER;
var resultFromCallOne = CaeHttpClient.REQUEST_STARTER;
var resultFromCallTwo = CaeHttpClient.REQUEST_STARTER;
var resultFromCallThree = CaeHttpClient.REQUEST_STARTER;
Assertions.assertEquals(resultFromCallOne, resultFromCallTwo);
Assertions.assertEquals(resultFromCallTwo, resultFromCallThree);
}

@Test
void shouldReturnSingletonInstanceWhenCallingGetter(){
var resultFromCallOne = CaeHttpClientFactory.getSingletonClient();
var resultFromCallTwo = CaeHttpClientFactory.getSingletonClient();
var resultFromCallThree = CaeHttpClientFactory.getSingletonClient();
var resultFromCallOne = CaeHttpClient.getStarter();
var resultFromCallTwo = CaeHttpClient.getStarter();
var resultFromCallThree = CaeHttpClient.getStarter();
Assertions.assertEquals(resultFromCallOne, resultFromCallTwo);
Assertions.assertEquals(resultFromCallTwo, resultFromCallThree);
}
Expand Down
Loading