From 6214f4d4b678f3713e4b44d8cd73087f0384c6d9 Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Sun, 20 Oct 2024 19:20:16 +0300 Subject: [PATCH] fix(java): expose EvaluationException instead of the RuntimeException Signed-off-by: Roman Dmytrenko --- flipt-java/src/main/java/examples/Main.java | 60 ++++--- .../io/flipt/api/evaluation/Evaluation.java | 156 ++++-------------- .../api/evaluation/EvaluationException.java | 12 ++ flipt-java/src/test/java/TestFliptClient.java | 77 ++++----- 4 files changed, 108 insertions(+), 197 deletions(-) create mode 100644 flipt-java/src/main/java/io/flipt/api/evaluation/EvaluationException.java diff --git a/flipt-java/src/main/java/examples/Main.java b/flipt-java/src/main/java/examples/Main.java index b4a019f9..7575bd12 100644 --- a/flipt-java/src/main/java/examples/Main.java +++ b/flipt-java/src/main/java/examples/Main.java @@ -1,53 +1,51 @@ package examples; import io.flipt.api.FliptClient; +import io.flipt.api.evaluation.EvaluationException; import io.flipt.api.evaluation.models.*; + import java.util.*; public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws EvaluationException { FliptClient fliptClient = FliptClient.builder().build(); Map context = new HashMap<>(); context.put("fizz", "buzz"); - EvaluationRequest variantEvaluationRequest = - EvaluationRequest.builder() - .namespaceKey("default") - .flagKey("flag1") - .entityId("entity") - .context(context) - .build(); - - EvaluationRequest booleanEvaluationRequest = - EvaluationRequest.builder() - .namespaceKey("default") - .flagKey("flag_boolean") - .entityId("entity") - .context(context) - .build(); - - EvaluationRequest errorEvaluationRequest = - EvaluationRequest.builder() - .namespaceKey("default") - .flagKey("flag1234") - .entityId("entityId") - .build(); + EvaluationRequest variantEvaluationRequest = EvaluationRequest.builder() + .namespaceKey("default") + .flagKey("flag1") + .entityId("entity") + .context(context) + .build(); + + EvaluationRequest booleanEvaluationRequest = EvaluationRequest.builder() + .namespaceKey("default") + .flagKey("flag_boolean") + .entityId("entity") + .context(context) + .build(); + + EvaluationRequest errorEvaluationRequest = EvaluationRequest.builder() + .namespaceKey("default") + .flagKey("flag1234") + .entityId("entityId") + .build(); List evaluationRequests = new ArrayList<>(); evaluationRequests.add(variantEvaluationRequest); evaluationRequests.add(booleanEvaluationRequest); evaluationRequests.add(errorEvaluationRequest); - VariantEvaluationResponse variantEvaluationResponse = - fliptClient.evaluation().evaluateVariant(variantEvaluationRequest); + VariantEvaluationResponse variantEvaluationResponse = fliptClient.evaluation() + .evaluateVariant(variantEvaluationRequest); - BooleanEvaluationResponse booleanEvaluationResponse = - fliptClient.evaluation().evaluateBoolean(booleanEvaluationRequest); + BooleanEvaluationResponse booleanEvaluationResponse = fliptClient.evaluation() + .evaluateBoolean(booleanEvaluationRequest); - BatchEvaluationResponse batchEvaluationResponse = - fliptClient - .evaluation() - .evaluateBatch(BatchEvaluationRequest.builder().requests(evaluationRequests).build()); + BatchEvaluationResponse batchEvaluationResponse = fliptClient + .evaluation() + .evaluateBatch(BatchEvaluationRequest.builder().requests(evaluationRequests).build()); } } diff --git a/flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java b/flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java index 191448ea..d1ea47ac 100644 --- a/flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java +++ b/flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java @@ -9,6 +9,8 @@ import io.flipt.api.evaluation.models.*; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import okhttp3.*; @@ -25,11 +27,10 @@ private Evaluation(EvaluationBuilder builder) { this.baseURL = builder.baseURL; this.authenticationStrategy = builder.authenticationStrategy; this.headers = builder.headers; - this.objectMapper = - JsonMapper.builder() - .addModule(new Jdk8Module()) - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .build(); + this.objectMapper = JsonMapper.builder() + .addModule(new Jdk8Module()) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); } public static EvaluationBuilder builder() { @@ -42,7 +43,8 @@ public static class EvaluationBuilder { private AuthenticationStrategy authenticationStrategy; private Map headers; - private EvaluationBuilder() {} + private EvaluationBuilder() { + } public EvaluationBuilder httpClient(OkHttpClient httpClient) { this.httpClient = httpClient; @@ -69,146 +71,54 @@ public Evaluation build() { } } - @SuppressWarnings("resource") - public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) { - URL url; - - final String path = "/evaluate/v1/variant"; - - try { - url = new URL(String.format("%s%s", this.baseURL, path)); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - Request.Builder requestBuilder = makeRequest(request, url); - - Response response = null; + public VariantEvaluationResponse evaluateVariant(EvaluationRequest request) throws EvaluationException { + return this.makeRequest(request, "/evaluate/v1/variant", VariantEvaluationResponse.class); + } - try { - response = httpClient.newCall(requestBuilder.build()).execute(); - assert response.body() != null; + public BooleanEvaluationResponse evaluateBoolean(EvaluationRequest request) throws EvaluationException { + return this.makeRequest(request, "/evaluate/v1/boolean", BooleanEvaluationResponse.class); + } - if (!response.isSuccessful()) { - Error error = this.objectMapper.readValue(response.body().string(), Error.class); - throw new RuntimeException(error); - } - return this.objectMapper.readValue(response.body().string(), VariantEvaluationResponse.class); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - if (response != null) { - response.close(); - } - } + public BatchEvaluationResponse evaluateBatch(BatchEvaluationRequest request) throws EvaluationException { + return this.makeRequest(request, "/evaluate/v1/batch", BatchEvaluationResponse.class); } - @SuppressWarnings("resource") - public BooleanEvaluationResponse evaluateBoolean(EvaluationRequest request) { + private T makeRequest(Object request, String path, Class clazz) throws EvaluationException { URL url; - - final String path = "/evaluate/v1/boolean"; - try { - url = new URL(String.format("%s%s", this.baseURL, path)); - } catch (MalformedURLException e) { - throw new RuntimeException(e); + url = new URI(String.format("%s%s", this.baseURL, path)).toURL(); + } catch (URISyntaxException | MalformedURLException e) { + throw new EvaluationException(e); } - Request.Builder requestBuilder = makeRequest(request, url); - Response response = null; try { - response = httpClient.newCall(requestBuilder.build()).execute(); - assert response.body() != null; - if (!response.isSuccessful()) { - Error error = this.objectMapper.readValue(response.body().string(), Error.class); - throw new RuntimeException(error); - } + RequestBody body = RequestBody.create( + this.objectMapper.writeValueAsString(request), MediaType.parse("application/json")); - return this.objectMapper.readValue(response.body().string(), BooleanEvaluationResponse.class); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - if (response != null) { - response.close(); - } - } - } - - @SuppressWarnings("resource") - public BatchEvaluationResponse evaluateBatch(BatchEvaluationRequest request) { - RequestBody body; - - try { - body = - RequestBody.create( - this.objectMapper.writeValueAsString(request), MediaType.parse("application/json")); - } catch (Exception e) { - throw new RuntimeException(e); - } - - URL url; - - final String path = "/evaluate/v1/batch"; + Request.Builder httpRequest = new Request.Builder().url(url).method("POST", body); - try { - url = new URL(String.format("%s%s", this.baseURL, path)); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - Request.Builder httpRequest = new Request.Builder().url(url).method("POST", body); - - if (this.headers != null) { - this.headers.forEach(httpRequest::addHeader); - } - - if (this.authenticationStrategy != null) { - httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader()); - } + if (this.headers != null) { + this.headers.forEach(httpRequest::addHeader); + } - Response response = null; + if (this.authenticationStrategy != null) { + httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader()); + } - try { response = httpClient.newCall(httpRequest.build()).execute(); - assert response.body() != null; + if (!response.isSuccessful()) { Error error = this.objectMapper.readValue(response.body().string(), Error.class); - throw new RuntimeException(error); + throw new EvaluationException(error); } - - return this.objectMapper.readValue(response.body().string(), BatchEvaluationResponse.class); + return this.objectMapper.readValue(response.body().string(), clazz); } catch (IOException e) { - throw new RuntimeException(e); + throw new EvaluationException(e); } finally { if (response != null) { response.close(); } } } - - private Request.Builder makeRequest(EvaluationRequest request, URL url) { - RequestBody body; - - try { - body = - RequestBody.create( - this.objectMapper.writeValueAsString(request), MediaType.parse("application/json")); - } catch (Exception e) { - throw new RuntimeException(e); - } - - Request.Builder httpRequest = new Request.Builder().url(url).method("POST", body); - - if (this.headers != null) { - this.headers.forEach(httpRequest::addHeader); - } - - if (this.authenticationStrategy != null) { - httpRequest.addHeader("Authorization", this.authenticationStrategy.getAuthorizationHeader()); - } - - return httpRequest; - } } diff --git a/flipt-java/src/main/java/io/flipt/api/evaluation/EvaluationException.java b/flipt-java/src/main/java/io/flipt/api/evaluation/EvaluationException.java new file mode 100644 index 00000000..c442dd9e --- /dev/null +++ b/flipt-java/src/main/java/io/flipt/api/evaluation/EvaluationException.java @@ -0,0 +1,12 @@ +package io.flipt.api.evaluation; + +public class EvaluationException extends Exception { + + public EvaluationException() { + super(); + } + + public EvaluationException(Throwable cause) { + super(cause); + } +} diff --git a/flipt-java/src/test/java/TestFliptClient.java b/flipt-java/src/test/java/TestFliptClient.java index 79ead8e7..6c4b54d2 100644 --- a/flipt-java/src/test/java/TestFliptClient.java +++ b/flipt-java/src/test/java/TestFliptClient.java @@ -15,25 +15,22 @@ void testVariantEvaluation() { assert fliptURL != null && !fliptURL.isEmpty(); assert authToken != null && !authToken.isEmpty(); - AuthenticationStrategy authenticationStrategy = - new ClientTokenAuthenticationStrategy(authToken); + AuthenticationStrategy authenticationStrategy = new ClientTokenAuthenticationStrategy(authToken); Map headers = Map.of("Accept", "application/json"); - FliptClient fc = - FliptClient.builder() - .url(fliptURL) - .authentication(authenticationStrategy) - .headers(headers) - .build(); + FliptClient fc = FliptClient.builder() + .url(fliptURL) + .authentication(authenticationStrategy) + .headers(headers) + .build(); Map context = new HashMap<>(); context.put("fizz", "buzz"); - VariantEvaluationResponse variant = - fc.evaluation() - .evaluateVariant( - new EvaluationRequest("default", "flag1", "entity", context, Optional.empty())); + VariantEvaluationResponse variant = Assertions.assertDoesNotThrow(() -> fc.evaluation() + .evaluateVariant( + new EvaluationRequest("default", "flag1", "entity", context, Optional.empty()))); Assertions.assertTrue(variant.isMatch()); Assertions.assertEquals("flag1", variant.getFlagKey()); Assertions.assertEquals("MATCH_EVALUATION_REASON", variant.getReason().toString()); @@ -49,26 +46,23 @@ void testBooleanEvaluation() { assert fliptURL != null && !fliptURL.isEmpty(); assert authToken != null && !authToken.isEmpty(); - AuthenticationStrategy authenticationStrategy = - new ClientTokenAuthenticationStrategy(authToken); + AuthenticationStrategy authenticationStrategy = new ClientTokenAuthenticationStrategy(authToken); Map headers = Map.of("Accept", "application/json"); - FliptClient fc = - FliptClient.builder() - .url(fliptURL) - .authentication(authenticationStrategy) - .headers(headers) - .build(); + FliptClient fc = FliptClient.builder() + .url(fliptURL) + .authentication(authenticationStrategy) + .headers(headers) + .build(); Map context = new HashMap<>(); context.put("fizz", "buzz"); - BooleanEvaluationResponse booleanEvaluation = - fc.evaluation() - .evaluateBoolean( - new EvaluationRequest( - "default", "flag_boolean", "entity", context, Optional.empty())); + BooleanEvaluationResponse booleanEvaluation = Assertions.assertDoesNotThrow(() -> fc.evaluation() + .evaluateBoolean( + new EvaluationRequest( + "default", "flag_boolean", "entity", context, Optional.empty()))); Assertions.assertTrue(booleanEvaluation.isEnabled()); Assertions.assertEquals("flag_boolean", booleanEvaluation.getFlagKey()); @@ -83,37 +77,34 @@ void testBatchEvaluation() { assert fliptURL != null && !fliptURL.isEmpty(); assert authToken != null && !authToken.isEmpty(); - AuthenticationStrategy authenticationStrategy = - new ClientTokenAuthenticationStrategy(authToken); + AuthenticationStrategy authenticationStrategy = new ClientTokenAuthenticationStrategy(authToken); Map headers = Map.of("Accept", "application/json"); - FliptClient fc = - FliptClient.builder() - .url(fliptURL) - .authentication(authenticationStrategy) - .headers(headers) - .build(); + FliptClient fc = FliptClient.builder() + .url(fliptURL) + .authentication(authenticationStrategy) + .headers(headers) + .build(); Map context = new HashMap<>(); context.put("fizz", "buzz"); - EvaluationRequest variantEvaluationRequest = - new EvaluationRequest("default", "flag1", "entity", context, Optional.empty()); - EvaluationRequest booleanEvaluationRequest = - new EvaluationRequest("default", "flag_boolean", "entity", context, Optional.empty()); - EvaluationRequest errorEvaluationRequest = - new EvaluationRequest("default", "flag1234", "entity", new HashMap<>(), Optional.empty()); + EvaluationRequest variantEvaluationRequest = new EvaluationRequest("default", "flag1", "entity", context, + Optional.empty()); + EvaluationRequest booleanEvaluationRequest = new EvaluationRequest("default", "flag_boolean", "entity", context, + Optional.empty()); + EvaluationRequest errorEvaluationRequest = new EvaluationRequest("default", "flag1234", "entity", new HashMap<>(), + Optional.empty()); List evaluationRequests = new ArrayList<>(); evaluationRequests.add(variantEvaluationRequest); evaluationRequests.add(booleanEvaluationRequest); evaluationRequests.add(errorEvaluationRequest); - BatchEvaluationResponse batch = - fc.evaluation() - .evaluateBatch( - new BatchEvaluationRequest(Optional.of(""), evaluationRequests, Optional.empty())); + BatchEvaluationResponse batch = Assertions.assertDoesNotThrow(() -> fc.evaluation() + .evaluateBatch( + new BatchEvaluationRequest(Optional.of(""), evaluationRequests, Optional.empty()))); // Variant EvaluationResponse first = batch.getResponses().get(0);