diff --git a/src/main/java/com/launchdarkly/client/LDUser.java b/src/main/java/com/launchdarkly/client/LDUser.java index 6dc26e836..b3edb2f9f 100644 --- a/src/main/java/com/launchdarkly/client/LDUser.java +++ b/src/main/java/com/launchdarkly/client/LDUser.java @@ -2,8 +2,10 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.TypeAdapter; import com.google.gson.internal.Streams; @@ -14,6 +16,8 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -143,6 +147,32 @@ JsonElement getCustom(String key) { return null; } + JsonObject toJsConfig(LDConfig config) { + JsonElement tree = new Gson().toJsonTree(this); + + Set privateAttributeSet = new HashSet<>(); + privateAttributeSet.addAll(this.privateAttributeNames); + privateAttributeSet.addAll(config.privateAttrNames); + + List attrs = new ArrayList<>(); + attrs.addAll(privateAttributeSet); + Collections.sort(attrs); + + JsonArray array = new JsonArray(); + for (String element : attrs) { + array.add(new JsonPrimitive(element)); + } + + JsonObject object = tree.getAsJsonObject(); + object.add("privateAttributeNames", array); + + if (config.allAttributesPrivate) { + object.addProperty("allAttributesPrivate", true); + } + + return object; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/test/java/com/launchdarkly/client/LDUserTest.java b/src/test/java/com/launchdarkly/client/LDUserTest.java index ca8a9f7f4..58d146b16 100644 --- a/src/test/java/com/launchdarkly/client/LDUserTest.java +++ b/src/test/java/com/launchdarkly/client/LDUserTest.java @@ -92,6 +92,56 @@ public void testInvalidCountryNameDoesNotSetCountry() { assert(user.getCountry() == null); } + @Test + public void testLDUserJsConfig() { + LDConfig config = LDConfig.DEFAULT; + LDUser user = new LDUser.Builder("key") + .privateCustom("private-key", "private-value") + .custom("public-key", "public-value") + .build(); + + JsonObject object = user.toJsConfig(config); + + assertEquals("key", object.get("key").getAsString()); + + JsonArray privateAttributeNames = object.get("privateAttributeNames").getAsJsonArray(); + assertEquals(1, privateAttributeNames.size()); + assertEquals("private-key", privateAttributeNames.get(0).getAsString()); + + assertEquals("private-value", object.get("custom").getAsJsonObject().get("private-key").getAsString()); + assertEquals("public-value", object.get("custom").getAsJsonObject().get("public-key").getAsString()); + } + + @Test + public void testLDUserJsConfigAllAttributesPrivate() { + LDConfig config = new LDConfig.Builder() + .allAttributesPrivate(true) + .build(); + LDUser user = new LDUser.Builder("key") + .build(); + + JsonObject object = user.toJsConfig(config); + + assertTrue(object.get("allAttributesPrivate").getAsBoolean()); + } + + @Test + public void testLDUserJsConfigPrivate() { + LDConfig config = new LDConfig.Builder() + .privateAttributeNames("private-key") + .build(); + LDUser user = new LDUser.Builder("key") + .privateCustom("private-key2", "private-value2") + .build(); + + JsonObject object = user.toJsConfig(config); + + JsonArray privateAttributeNames = object.get("privateAttributeNames").getAsJsonArray(); + assertEquals(2, privateAttributeNames.size()); + assertEquals("private-key", privateAttributeNames.get(0).getAsString()); + assertEquals("private-key2", privateAttributeNames.get(1).getAsString()); + } + @Test public void testLDUserJsonSerializationContainsCountryAsTwoDigitCode() { LDConfig config = LDConfig.DEFAULT;