Skip to content

Commit

Permalink
fix(java): expose EvaluationException instead of the RuntimeException
Browse files Browse the repository at this point in the history
Signed-off-by: Roman Dmytrenko <rdmytrenko@gmail.com>
  • Loading branch information
erka committed Oct 20, 2024
1 parent 52f89f2 commit 6214f4d
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 197 deletions.
60 changes: 29 additions & 31 deletions flipt-java/src/main/java/examples/Main.java
Original file line number Diff line number Diff line change
@@ -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<String, String> 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<EvaluationRequest> 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());
}
}
156 changes: 33 additions & 123 deletions flipt-java/src/main/java/io/flipt/api/evaluation/Evaluation.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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() {
Expand All @@ -42,7 +43,8 @@ public static class EvaluationBuilder {
private AuthenticationStrategy authenticationStrategy;
private Map<String, String> headers;

private EvaluationBuilder() {}
private EvaluationBuilder() {
}

public EvaluationBuilder httpClient(OkHttpClient httpClient) {
this.httpClient = httpClient;
Expand All @@ -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> T makeRequest(Object request, String path, Class<T> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.flipt.api.evaluation;

public class EvaluationException extends Exception {

public EvaluationException() {
super();
}

public EvaluationException(Throwable cause) {
super(cause);
}
}
Loading

0 comments on commit 6214f4d

Please sign in to comment.