From a9de1eb2986694ed85f6adda6e208cd9de3adf9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerna=C5=9B?= Date: Mon, 4 Mar 2024 14:19:51 +0100 Subject: [PATCH] Implement a RestClient base HermesSender --- .../restclient/RestClientHermesSender.java | 65 +++++++++++++++ .../hermes/client/HermesSenderTest.groovy | 82 ++++++++++--------- 2 files changed, 108 insertions(+), 39 deletions(-) create mode 100644 hermes-client/src/main/java/pl/allegro/tech/hermes/client/restclient/RestClientHermesSender.java diff --git a/hermes-client/src/main/java/pl/allegro/tech/hermes/client/restclient/RestClientHermesSender.java b/hermes-client/src/main/java/pl/allegro/tech/hermes/client/restclient/RestClientHermesSender.java new file mode 100644 index 0000000000..0765c5f450 --- /dev/null +++ b/hermes-client/src/main/java/pl/allegro/tech/hermes/client/restclient/RestClientHermesSender.java @@ -0,0 +1,65 @@ +package pl.allegro.tech.hermes.client.restclient; + +import org.springframework.web.client.RestClient; +import pl.allegro.tech.hermes.client.HermesMessage; +import pl.allegro.tech.hermes.client.HermesResponse; +import pl.allegro.tech.hermes.client.HermesSender; + +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.CompletableFuture; + +import static java.util.stream.Collectors.toMap; +import static pl.allegro.tech.hermes.client.HermesResponseBuilder.hermesResponse; + + +public class RestClientHermesSender implements HermesSender { + + private final RestClient restClient; + + + public RestClientHermesSender(RestClient restClient) { + this.restClient = restClient; + } + + @Override + public CompletableFuture send(URI uri, HermesMessage message) { + CompletableFuture future = new CompletableFuture<>(); + + var received = restClient + .post() + .uri(uri) + .headers(httpHeaders -> httpHeaders.setAll(message.getHeaders())) + .body(message.getBody()) + .exchange((request, response) -> { + if (response.getStatusCode().is2xxSuccessful()) { + return hermesResponse(message) + .withBody(new String(response.getBody().readAllBytes(), StandardCharsets.UTF_8)) + .withHttpStatus(response.getStatusCode().value()) + .withHeaderSupplier(header -> convertToCaseInsensitiveMap(response.getHeaders().toSingleValueMap()).get(header)) + .build(); + } else { + return hermesResponse(message) + .withBody("") + .withHttpStatus(response.getStatusCode().value()) + .withHeaderSupplier(header -> convertToCaseInsensitiveMap(response.getHeaders().toSingleValueMap()).get(header)) + .build(); + } + }); + + future.complete(received); + return future; + } + + private TreeMap convertToCaseInsensitiveMap(Map hashMap) { + return hashMap.entrySet().stream() + .collect(toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (oldVal, newVal) -> newVal, + () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER) + )); + } +} diff --git a/hermes-client/src/test/groovy/pl/allegro/tech/hermes/client/HermesSenderTest.groovy b/hermes-client/src/test/groovy/pl/allegro/tech/hermes/client/HermesSenderTest.groovy index b265ad683f..54c1fdebfc 100644 --- a/hermes-client/src/test/groovy/pl/allegro/tech/hermes/client/HermesSenderTest.groovy +++ b/hermes-client/src/test/groovy/pl/allegro/tech/hermes/client/HermesSenderTest.groovy @@ -1,25 +1,20 @@ package pl.allegro.tech.hermes.client -import com.github.tomakehurst.wiremock.client.WireMock import com.github.tomakehurst.wiremock.junit.WireMockClassRule +import jakarta.ws.rs.client.ClientBuilder import okhttp3.OkHttpClient -import org.springframework.web.reactive.function.client.WebClient -import pl.allegro.tech.hermes.client.webclient.WebClientHermesSender import org.junit.ClassRule +import org.springframework.web.client.RestClient +import org.springframework.web.reactive.function.client.WebClient import pl.allegro.tech.hermes.client.jersey.JerseyHermesSender import pl.allegro.tech.hermes.client.okhttp.OkHttpHermesSender +import pl.allegro.tech.hermes.client.restclient.RestClientHermesSender +import pl.allegro.tech.hermes.client.webclient.WebClientHermesSender import spock.lang.Shared import spock.lang.Specification import spock.lang.Unroll -import jakarta.ws.rs.client.ClientBuilder - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse -import static com.github.tomakehurst.wiremock.client.WireMock.containing -import static com.github.tomakehurst.wiremock.client.WireMock.equalTo -import static com.github.tomakehurst.wiremock.client.WireMock.post -import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.* import static pl.allegro.tech.hermes.client.HermesMessage.hermesMessage class HermesSenderTest extends Specification { @@ -29,7 +24,7 @@ class HermesSenderTest extends Specification { WireMockClassRule service = new WireMockClassRule(14523) void setup() { - WireMock.reset() + reset() } @Unroll @@ -54,10 +49,11 @@ class HermesSenderTest extends Specification { .withRequestBody(containing("Hello!"))) where: - sender | name - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + sender | name + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + new RestClientHermesSender(RestClient.create()) | 'RestClient' } @Unroll @@ -81,10 +77,11 @@ class HermesSenderTest extends Specification { .withRequestBody(containing("Hello!"))) where: - sender | name - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + sender | name + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + new RestClientHermesSender(RestClient.create()) | 'RestClient' } @Unroll @@ -108,10 +105,11 @@ class HermesSenderTest extends Specification { .withRequestBody(containing("Hello!"))) where: - sender | name - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + sender | name + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' + new RestClientHermesSender(RestClient.create()) | 'RestClient' } @Unroll @@ -126,9 +124,9 @@ class HermesSenderTest extends Specification { service.stubFor( post(urlEqualTo('/topics/topic.test')) - .willReturn(aResponse() - .withStatus(201) - .withHeader(header, 'messageId')) + .willReturn(aResponse() + .withStatus(201) + .withHeader(header, 'messageId')) ) when: @@ -143,17 +141,23 @@ class HermesSenderTest extends Specification { response.messageId == 'messageId' where: - sender | name | header - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'Hermes-Message-Id' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'Hermes-Message-Id' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'Hermes-Message-Id' - - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'hermes-message-id' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'hermes-message-id' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'hermes-message-id' - - new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'HERMES-MESSAGE-ID' - new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'HERMES-MESSAGE-ID' - new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'HERMES-MESSAGE-ID' + sender | name | header + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'Hermes-Message-Id' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'Hermes-Message-Id' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'Hermes-Message-Id' + new RestClientHermesSender(RestClient.create()) | 'RestClient' | 'Hermes-Message-Id' + + + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'hermes-message-id' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'hermes-message-id' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'hermes-message-id' + new RestClientHermesSender(RestClient.create()) | 'RestClient' | 'hermes-message-id' + + + new JerseyHermesSender(ClientBuilder.newClient()) | 'JerseySender' | 'HERMES-MESSAGE-ID' + new OkHttpHermesSender(new OkHttpClient()) | 'OkHttpSender' | 'HERMES-MESSAGE-ID' + new WebClientHermesSender(WebClient.create()) | 'WebClientSender' | 'HERMES-MESSAGE-ID' + new RestClientHermesSender(RestClient.create()) | 'RestClient' | 'HERMES-MESSAGE-ID' + } }