From 75e0f51960f8b4c4b3a707942f9f587e02ff15e4 Mon Sep 17 00:00:00 2001 From: Chantal Chung Date: Thu, 15 Sep 2022 14:08:30 -0700 Subject: [PATCH 1/2] log errors in DVCLocalClient instead of throwing exceptions --- .../java/sdk/app/controller/HelloWorld.java | 21 +++++--- .../server/local/api/DVCLocalApiClient.java | 1 - .../sdk/server/local/api/DVCLocalClient.java | 49 +++++++++++++------ .../local/managers/EventQueueManager.java | 3 +- .../local/model/BucketedUserConfig.java | 1 - .../sdk/server/local/DVCLocalClientTest.java | 7 ++- 6 files changed, 51 insertions(+), 31 deletions(-) diff --git a/example/src/main/java/com/devcycle/example/java/sdk/app/controller/HelloWorld.java b/example/src/main/java/com/devcycle/example/java/sdk/app/controller/HelloWorld.java index f2024171..354f0043 100644 --- a/example/src/main/java/com/devcycle/example/java/sdk/app/controller/HelloWorld.java +++ b/example/src/main/java/com/devcycle/example/java/sdk/app/controller/HelloWorld.java @@ -16,7 +16,7 @@ public class HelloWorld { DVCCloudClient dvcCloud; DVCLocalClient dvcLocal; - public HelloWorld(@Qualifier("devcycleServerKey") String serverKey) throws Exception { + public HelloWorld(@Qualifier("devcycleServerKey") String serverKey) { dvcCloud = new DVCCloudClient(serverKey); dvcLocal = new DVCLocalClient(serverKey); } @@ -35,7 +35,7 @@ public String homePage(Model model) { @GetMapping("/cloud/activateFlag") public String homePageActivatedFlag(Model model) { - Variable updateHomePage = dvcCloud.variable(getUser(), "string-var", "default string"); + Variable updateHomePage = dvcCloud.variable(getUser(false), "string-var", "default string"); String variationValue = updateHomePage.getValue(); @@ -46,8 +46,8 @@ public String homePageActivatedFlag(Model model) { } @GetMapping("/local/activateFlag") - public String homePageActivatedFlagLocal(Model model) throws Exception { - Variable updateHomePage = dvcLocal.variable(getUser(), "string-var", "default string"); + public String homePageActivatedFlagLocal(Model model) { + Variable updateHomePage = dvcLocal.variable(getUser(true), "string-var", "default string"); String variationValue = updateHomePage.getValue(); @@ -57,9 +57,14 @@ public String homePageActivatedFlagLocal(Model model) throws Exception { return "fragments/flagData :: value "; } - private User getUser() { - return User.builder() - .userId("j_test") - .build(); + private User getUser(boolean isLocal) { + return isLocal ? + User.builder() + .userId("j_test") + .platform("java-local") + .build() : + User.builder() + .userId("j_test") + .build(); } } diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalApiClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalApiClient.java index 12858bb2..2bc8c7c7 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalApiClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalApiClient.java @@ -2,7 +2,6 @@ import com.devcycle.sdk.server.common.api.IDVCApi; import com.devcycle.sdk.server.local.model.DVCLocalOptions; -import com.devcycle.sdk.server.local.model.FlushPayload; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java index e103966d..7a3d7e53 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java @@ -1,6 +1,5 @@ package com.devcycle.sdk.server.local.api; -import java.util.Collections; import java.util.Map; import com.devcycle.sdk.server.common.model.*; @@ -25,15 +24,19 @@ public final class DVCLocalClient { private EventQueueManager eventQueueManager; - public DVCLocalClient(String serverKey) throws Exception { + public DVCLocalClient(String serverKey) { this(serverKey, DVCLocalOptions.builder().build()); } - public DVCLocalClient(String serverKey, DVCLocalOptions dvcOptions) throws Exception { + public DVCLocalClient(String serverKey, DVCLocalOptions dvcOptions) { configManager = new EnvironmentConfigManager(serverKey, localBucketing, dvcOptions); this.serverKey = serverKey; OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); - eventQueueManager = new EventQueueManager(serverKey, localBucketing, dvcOptions); + try { + eventQueueManager = new EventQueueManager(serverKey, localBucketing, dvcOptions); + } catch (Exception e) { + System.out.printf("Error creating event queue due to error: %s%n", e.getMessage()); + } } /** @@ -41,12 +44,19 @@ public DVCLocalClient(String serverKey, DVCLocalOptions dvcOptions) throws Excep * * @param user (required) */ - public Map allFeatures(User user) throws JsonProcessingException { + public Map allFeatures(User user) { validateUser(user); localBucketing.setPlatformData(user.getPlatformData().toString()); - String userString = OBJECT_MAPPER.writeValueAsString(user); + String userString = null; + BucketedUserConfig bucketedUserConfig = null; + + try { + userString = OBJECT_MAPPER.writeValueAsString(user); - BucketedUserConfig bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); + bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); + } catch (JsonProcessingException e) { + System.out.printf("Unable to parse JSON for allFeatures due to error: %s%n", e.getMessage()); + } return bucketedUserConfig.features; } @@ -59,7 +69,7 @@ public Map allFeatures(User user) throws JsonProcessingExceptio * (required) * @return Variable */ - public Variable variable(User user, String key, T defaultValue) throws Exception { + public Variable variable(User user, String key, T defaultValue) { validateUser(user); localBucketing.setPlatformData(user.getPlatformData().toString()); @@ -95,13 +105,13 @@ public Variable variable(User user, String key, T defaultValue) throws Ex eventQueueManager.queueAggregateEvent(Event.builder().type("aggVariableDefaulted").target(key).build(), bucketedUserConfig); return defaultVariable; } - } catch (JsonProcessingException e) { + } catch (Exception e) { System.out.printf("Unable to parse JSON for Variable %s due to error: %s", key, e.toString()); } try { eventQueueManager.queueAggregateEvent(Event.builder().type("aggVariableDefaulted").target(key).build(), null); - } catch (JsonProcessingException e) { + } catch (Exception e) { System.out.printf("Unable to parse aggVariableDefaulted event for Variable %s due to error: %s", key, e.toString()); } return defaultVariable; @@ -112,12 +122,17 @@ public Variable variable(User user, String key, T defaultValue) throws Ex * * @param user (required) */ - public Map allVariables(User user) throws JsonProcessingException { + public Map allVariables(User user) { validateUser(user); localBucketing.setPlatformData(user.getPlatformData().toString()); - String userString = OBJECT_MAPPER.writeValueAsString(user); + BucketedUserConfig bucketedUserConfig = null; + try { + String userString = OBJECT_MAPPER.writeValueAsString(user); - BucketedUserConfig bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); + bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); + } catch (JsonProcessingException e) { + System.out.printf("Unable to parse JSON for allVariables due to error: %s%n", e.getMessage()); + } return bucketedUserConfig.variables; } @@ -127,11 +142,15 @@ public Map allVariables(User user) throws JsonProcessingExcept * @param user (required) * @param event (required) */ - public void track(User user, Event event) throws Exception { + public void track(User user, Event event) { validateUser(user); localBucketing.setPlatformData(user.getPlatformData().toString()); - eventQueueManager.queueEvent(user, event); + try { + eventQueueManager.queueEvent(user, event); + } catch (Exception e) { + System.out.printf("Failed to queue event due to error: %s%n", e.getMessage()); + } } private void validateUser(User user) { diff --git a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java index ea53879e..3a6f127d 100644 --- a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java +++ b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java @@ -6,7 +6,6 @@ import com.devcycle.sdk.server.local.bucketing.LocalBucketing; import com.devcycle.sdk.server.local.model.*; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import retrofit2.Call; import retrofit2.Response; @@ -73,7 +72,7 @@ public void flushEvents() throws Exception { if (isFlushingEvents) return; if (serverKey == null || serverKey.equals("")) { - throw new Exception("DevCycle is not yet initialized to publish events."); // TODO: change to DVCException + throw new Exception("DevCycle is not yet initialized to publish events."); } FlushPayload[] flushPayloads = new FlushPayload[0]; diff --git a/src/main/java/com/devcycle/sdk/server/local/model/BucketedUserConfig.java b/src/main/java/com/devcycle/sdk/server/local/model/BucketedUserConfig.java index 864533f1..5d8be2bc 100644 --- a/src/main/java/com/devcycle/sdk/server/local/model/BucketedUserConfig.java +++ b/src/main/java/com/devcycle/sdk/server/local/model/BucketedUserConfig.java @@ -3,7 +3,6 @@ import com.devcycle.sdk.server.common.model.Feature; import com.devcycle.sdk.server.common.model.Variable; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; diff --git a/src/test/java/com/devcycle/sdk/server/local/DVCLocalClientTest.java b/src/test/java/com/devcycle/sdk/server/local/DVCLocalClientTest.java index ede073e7..66bdf5d0 100644 --- a/src/test/java/com/devcycle/sdk/server/local/DVCLocalClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/local/DVCLocalClientTest.java @@ -17,7 +17,6 @@ import com.devcycle.sdk.server.helpers.WhiteBox; import com.devcycle.sdk.server.local.api.DVCLocalClient; import com.devcycle.sdk.server.local.bucketing.LocalBucketing; -import com.fasterxml.jackson.core.JsonProcessingException; @RunWith(MockitoJUnitRunner.class) public class DVCLocalClientTest { @@ -38,7 +37,7 @@ public static void setup() throws Exception { WhiteBox.setInternalState(client, "eventQueueManager", eventQueueManager); } @Test - public void variableTest() throws Exception { + public void variableTest() { User user = getUser(); user.setEmail("giveMeVariationOff@email.com"); Variable var = client.variable(user, "string-var", "default string"); @@ -50,7 +49,7 @@ public void variableTest() throws Exception { } @Test - public void allFeaturesTest() throws JsonProcessingException { + public void allFeaturesTest() { User user = getUser(); Map features = client.allFeatures(user); Assert.assertEquals(features.get("a-cool-new-feature").getId(), "62fbf6566f1ba302829f9e32"); @@ -58,7 +57,7 @@ public void allFeaturesTest() throws JsonProcessingException { } @Test - public void allVariablesTest() throws JsonProcessingException { + public void allVariablesTest() { User user = getUser(); Map variables = client.allVariables(user); Assert.assertEquals(variables.get("string-var").getId(), "63125320a4719939fd57cb2b"); From b068493232bd2c87a07c6846ce80675f3c2015bb Mon Sep 17 00:00:00 2001 From: Chantal Chung Date: Fri, 16 Sep 2022 11:14:17 -0700 Subject: [PATCH 2/2] return empty map in catch --- .../java/com/devcycle/sdk/server/local/api/DVCLocalClient.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java index 7a3d7e53..0487a49a 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DVCLocalClient.java @@ -1,5 +1,6 @@ package com.devcycle.sdk.server.local.api; +import java.util.Collections; import java.util.Map; import com.devcycle.sdk.server.common.model.*; @@ -56,6 +57,7 @@ public Map allFeatures(User user) { bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); } catch (JsonProcessingException e) { System.out.printf("Unable to parse JSON for allFeatures due to error: %s%n", e.getMessage()); + return Collections.emptyMap(); } return bucketedUserConfig.features; } @@ -132,6 +134,7 @@ public Map allVariables(User user) { bucketedUserConfig = localBucketing.generateBucketedConfig(serverKey, userString); } catch (JsonProcessingException e) { System.out.printf("Unable to parse JSON for allVariables due to error: %s%n", e.getMessage()); + return Collections.emptyMap(); } return bucketedUserConfig.variables; }