From 3679a1c40e894bee0a978afe033f30fceeb554d3 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Fri, 24 May 2024 11:41:31 +0700 Subject: [PATCH] refactored RestTemplate --- .../repository/InstanceRepositoryImpl.java | 15 +-- .../impl/repository/RoomRepositoryImpl.java | 13 +-- .../picker/api/impl/util/RestTemplate.java | 92 +++++++++---------- 3 files changed, 59 insertions(+), 61 deletions(-) diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/InstanceRepositoryImpl.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/InstanceRepositoryImpl.java index 5ee4abc..339f2f3 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/InstanceRepositoryImpl.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/InstanceRepositoryImpl.java @@ -1,5 +1,6 @@ package ru.dragonestia.picker.api.impl.repository; +import com.fasterxml.jackson.core.type.TypeReference; import ru.dragonestia.picker.api.impl.util.RestTemplate; import ru.dragonestia.picker.api.impl.util.type.HttpMethod; import ru.dragonestia.picker.api.model.entity.EntityId; @@ -21,22 +22,22 @@ public class InstanceRepositoryImpl implements InstanceRepository { @Override public List allInstancesIds() { - return Arrays.stream(rest.query("/instances", HttpMethod.GET, String[].class)) - .map(InstanceId::of) - .toList(); + List id = rest.queryWithRequest("/instances", HttpMethod.GET); + return id.stream().map(InstanceId::of).toList(); } @Override public Instance getInstance(InstanceId id) { - return rest.query("/instances/target/" + id.getValue(), HttpMethod.GET, ResponseObject.RInstance.class).convert(); + ResponseObject.RInstance instance = rest.queryWithRequest("/instances/target/" + id.getValue(), HttpMethod.GET); + return instance.convert(); } @Override public Map getInstances(Collection ids) { var map = new HashMap(); - Arrays.stream(rest.query("/instances/target/list", HttpMethod.GET, ResponseObject.RInstance[].class, params -> { + rest.queryWithRequest("/instances/target/list", HttpMethod.GET, new TypeReference>() {}, params -> { params.put("id", String.join(",", ids.stream().map(InstanceId::getValue).toList())); - })).map(ResponseObject.RInstance::convert).forEach(instance -> map.put(instance.id(), instance)); + }).stream().map(ResponseObject.RInstance::convert).forEach(instance -> map.put(instance.id(), instance)); return map; } @@ -64,7 +65,7 @@ public class InstanceRepositoryImpl implements InstanceRepository { @Override public ResponseObject.PickedRoom pickRoom(InstanceId id, Collection entities, boolean dontReturnEntities) { - return rest.queryPostWithBody("/instances/target/" + id.getValue() + "/pick", ResponseObject.PickedRoom.class, params -> { + return rest.queryPostWithBodyRequest("/instances/target/" + id.getValue() + "/pick", params -> { params.put("dontReturnEntities", Boolean.toString(dontReturnEntities)); }, String.join(",", entities.stream().map(EntityId::getValue).toList())); } diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java index ce98cc5..38c47f4 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java @@ -1,5 +1,6 @@ package ru.dragonestia.picker.api.impl.repository; +import com.fasterxml.jackson.core.type.TypeReference; import ru.dragonestia.picker.api.impl.util.RestTemplate; import ru.dragonestia.picker.api.impl.util.type.HttpMethod; import ru.dragonestia.picker.api.model.instance.InstanceId; @@ -20,22 +21,22 @@ public class RoomRepositoryImpl implements RoomRepository { @Override public List allRoomsIds(InstanceId instanceId) { - return Arrays.stream(rest.query("/instances/target/%s/rooms".formatted(instanceId.getValue()), HttpMethod.GET, String[].class)) - .map(RoomId::of) - .toList(); + List id = rest.queryWithRequest("/instances/target/%s/rooms".formatted(instanceId.getValue()), HttpMethod.GET); + return id.stream().map(RoomId::of).toList(); } @Override public Room getRoom(InstanceId instanceId, RoomId roomId) { - return rest.query("/instances/target/%s/rooms/target/%s".formatted(instanceId.getValue(), roomId.getValue()), HttpMethod.GET, ResponseObject.RRoom.class).covert(); + ResponseObject.RRoom room = rest.queryWithRequest("/instances/target/%s/rooms/target/%s".formatted(instanceId.getValue(), roomId.getValue()), HttpMethod.GET); + return room.covert(); } @Override public Map getRooms(InstanceId instanceId, Collection rooms) { var map = new HashMap(); - Arrays.stream(rest.query("/instances/target/%s/rooms/list".formatted(instanceId.getValue()), HttpMethod.GET, ResponseObject.RRoom[].class, params -> { + rest.queryWithRequest("/instances/target/%s/rooms/list".formatted(instanceId.getValue()), HttpMethod.GET, new TypeReference>() {}, params -> { params.put("id", String.join(",", rooms.stream().map(RoomId::getValue).toList())); - })).map(ResponseObject.RRoom::covert).forEach(room -> map.put(room.id(), room)); + }).stream().map(ResponseObject.RRoom::covert).forEach(room -> map.put(room.id(), room)); return map; } diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java index d25c5e3..e920fd0 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java @@ -2,6 +2,7 @@ package ru.dragonestia.picker.api.impl.util; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.*; import org.jetbrains.annotations.ApiStatus.Internal; @@ -48,67 +49,40 @@ public class RestTemplate { } public void query(String uri, HttpMethod method, ParamsConsumer paramsConsumer) { - var request = client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) + execute(client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) .method(method.name(), method == HttpMethod.GET? null : new FormBody.Builder().build()) - .build(); - - try (var response = httpClient.newCall(request).execute()) { - checkResponseForErrors(response); - } catch (JsonProcessingException ex) { - throw new RuntimeException("Json processing error", ex); - } catch (IOException ex) { - throw new RuntimeException(ex); - } + .build()); } - public T query(String uri, HttpMethod method, Class clazz) { - return query(uri, method, clazz, ParamsConsumer.NONE); + public T queryWithRequest(String uri, HttpMethod method) { + return queryWithRequest(uri, method, ParamsConsumer.NONE); } - public T query(String uri, HttpMethod method, Class clazz, ParamsConsumer paramsConsumer) { - var request = client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) + public T queryWithRequest(String uri, HttpMethod method, ParamsConsumer paramsConsumer) { + return queryWithRequest(uri, method, new TypeReference<>(){}, paramsConsumer); + } + + public T queryWithRequest(String uri, HttpMethod method, TypeReference type, ParamsConsumer paramsConsumer) { + return execute(client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) .method(method.name(), method == HttpMethod.GET? null : new FormBody.Builder().build()) - .build(); - - try (var response = httpClient.newCall(request).execute()) { - checkResponseForErrors(response); - - return json.readValue(new String(Objects.requireNonNull(response.body()).bytes(), StandardCharsets.UTF_8), clazz); - } catch (JsonProcessingException ex) { - throw new RuntimeException("Json processing error", ex); - } catch (IOException ex) { - throw new RuntimeException(ex); - } + .build(), + type); } - public T queryPostWithBody(String uri, Class clazz, ParamsConsumer paramsConsumer, String body) { - var request = client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) - .post(RequestBody.create(body, MediaType.get("text/plain"))) - .build(); + public T queryPostWithBodyRequest(String uri, ParamsConsumer paramsConsumer, String body) { + return queryPostWithBodyRequest(uri, new TypeReference<>() {}, paramsConsumer, body); + } - try (var response = httpClient.newCall(request).execute()) { - checkResponseForErrors(response); - - return json.readValue(new String(Objects.requireNonNull(response.body()).bytes(), StandardCharsets.UTF_8), clazz); - } catch (JsonProcessingException ex) { - throw new RuntimeException("Json processing error", ex); - } catch (IOException ex) { - throw new RuntimeException(ex); - } + public T queryPostWithBodyRequest(String uri, TypeReference type, ParamsConsumer paramsConsumer, String body) { + return execute(client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) + .post(RequestBody.create(body, MediaType.get("text/plain"))) + .build(), type); } public void queryPostWithBody(String uri, ParamsConsumer paramsConsumer, String body) { - var request = client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) + execute(client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) .post(RequestBody.create(body, MediaType.get("text/plain"))) - .build(); - - try (var response = httpClient.newCall(request).execute()) { - checkResponseForErrors(response); - } catch (JsonProcessingException ex) { - throw new RuntimeException("Json processing error", ex); - } catch (IOException ex) { - throw new RuntimeException(ex); - } + .build()); } private String queryEncode(ParamsConsumer paramsConsumer) { @@ -124,6 +98,28 @@ public class RestTemplate { return "?" + String.join("&", pairs); } + private void execute(Request request) { + try (var response = httpClient.newCall(request).execute()) { + checkResponseForErrors(response); + } catch (JsonProcessingException ex) { + throw new RuntimeException("Json processing error", ex); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private T execute(Request request, TypeReference type) { + try (var response = httpClient.newCall(request).execute()) { + checkResponseForErrors(response); + + return json.readValue(new String(Objects.requireNonNull(response.body()).bytes(), StandardCharsets.UTF_8), type); + } catch (JsonProcessingException ex) { + throw new RuntimeException("Json processing error", ex); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + private void checkResponseForErrors(Response response) throws IOException { var code = response.code(); var statusCode = code / 100;