Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit 2f7adbc

Browse files
committed
Better support for non-string custom attribute values
1 parent 6529231 commit 2f7adbc

File tree

2 files changed

+54
-51
lines changed

2 files changed

+54
-51
lines changed

src/main/java/com/launchdarkly/client/Variation.java

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static class Builder<E> {
9292
Builder(E value, int weight) {
9393
this.value = value;
9494
this.weight = weight;
95-
this.userTarget = new TargetRule("key", "in", new ArrayList<Object>());
95+
this.userTarget = new TargetRule("key", "in", new ArrayList<JsonPrimitive>());
9696
targets = new ArrayList<TargetRule>();
9797
}
9898

@@ -115,79 +115,69 @@ Variation<E> build() {
115115
static class TargetRule {
116116
String attribute;
117117
String operator;
118-
List<Object> values;
118+
List<JsonPrimitive> values;
119119

120120
private final Logger logger = LoggerFactory.getLogger(TargetRule.class);
121121

122122
public TargetRule() {
123123

124124
}
125125

126-
TargetRule(String attribute, String operator, List<Object> values) {
126+
TargetRule(String attribute, String operator, List<JsonPrimitive> values) {
127127
this.attribute = attribute;
128128
this.operator = operator;
129-
this.values = new ArrayList<Object>(values);
129+
this.values = new ArrayList<JsonPrimitive>(values);
130130
}
131131

132-
TargetRule(String attribute, List<Object> values) {
132+
TargetRule(String attribute, List<JsonPrimitive> values) {
133133
this(attribute, "in", values);
134134
}
135135

136-
private boolean matchCustom(JsonPrimitive prim, List<Object> values) {
137-
if (prim.isNumber()) {
138-
return values.contains(prim.getAsDouble());
139-
} else if (prim.isBoolean()) {
140-
return values.contains(prim.getAsBoolean());
141-
} else {
142-
return values.contains(prim.getAsString());
143-
}
144-
}
145-
146136
public boolean matchTarget(LDUser user) {
147137
Object uValue = null;
148138
if (attribute.equals("key")) {
149139
if (user.getKey() != null) {
150-
uValue = user.getKey();
140+
uValue = new JsonPrimitive(user.getKey());
151141
}
152142
}
153143
else if (attribute.equals("ip") && user.getIp() != null) {
154144
if (user.getIp() != null) {
155-
uValue = user.getIp();
145+
uValue = new JsonPrimitive(user.getIp());
156146
}
157147
}
158148
else if (attribute.equals("country")) {
159149
if (user.getCountry() != null) {
160-
uValue = user.getCountry().getAlpha2();
150+
uValue = new JsonPrimitive(user.getCountry().getAlpha2());
161151
}
162152
}
163153
else if (attribute.equals("email")) {
164154
if (user.getEmail() != null) {
165-
uValue = user.getEmail();
155+
uValue = new JsonPrimitive(user.getEmail());
166156
}
167157
}
168158
else if (attribute.equals("firstName")) {
169159
if (user.getFirstName() != null ) {
170-
uValue = user.getFirstName();
160+
uValue = new JsonPrimitive(user.getFirstName());
171161
}
172162
}
173163
else if (attribute.equals("lastName")) {
174164
if (user.getLastName() != null) {
175-
uValue = user.getLastName();
165+
uValue = new JsonPrimitive(user.getLastName());
176166
}
177167
}
178168
else if (attribute.equals("avatar")) {
179169
if (user.getAvatar() != null) {
180-
uValue = user.getAvatar();
170+
uValue = new JsonPrimitive(user.getAvatar());
181171
}
182172
}
183173
else if (attribute.equals("name")) {
184174
if (user.getName() != null) {
185-
uValue = user.getName();
175+
uValue = new JsonPrimitive(user.getName());
186176
}
187177
}
188178
else if (attribute.equals("anonymous")) {
189179
if (user.getAnonymous() != null) {
190-
uValue = user.getAnonymous();
180+
uValue = new JsonPrimitive(user.getAnonymous());
191181
}
192182
}
193183
else { // Custom attribute
@@ -201,14 +191,14 @@ else if (attribute.equals("anonymous")) {
201191
logger.error("Invalid custom attribute value in user object: " + elt);
202192
return false;
203193
}
204-
else if (matchCustom(elt.getAsJsonPrimitive(), values)) {
194+
else if (values.contains(elt.getAsJsonPrimitive())) {
205195
return true;
206196
}
207197
}
208198
return false;
209199
}
210200
else if (custom.isJsonPrimitive()) {
211-
return matchCustom(custom.getAsJsonPrimitive(), values);
201+
return values.contains(custom.getAsJsonPrimitive());
212202
}
213203
}
214204
return false;

src/test/java/com/launchdarkly/client/FeatureRepTest.java

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.launchdarkly.client;
22

3+
import com.google.gson.JsonPrimitive;
4+
import org.glassfish.jersey.server.JSONP;
35
import org.junit.Test;
46

57
import java.util.Arrays;
@@ -8,24 +10,24 @@
810

911
public class FeatureRepTest {
1012

11-
private final Variation.TargetRule targetUserOn = new Variation.TargetRule("key", Collections.<Object>singletonList("targetOn@test.com"));
13+
private final Variation.TargetRule targetUserOn = new Variation.TargetRule("key", Collections.<JsonPrimitive>singletonList(new JsonPrimitive("targetOn@test.com")));
1214

13-
private final Variation.TargetRule targetGroupOn = new Variation.TargetRule("groups", Arrays.<Object>asList("google", "microsoft"));
15+
private final Variation.TargetRule targetGroupOn = new Variation.TargetRule("groups", Arrays.<JsonPrimitive>asList(new JsonPrimitive("google"), new JsonPrimitive("microsoft")));
1416

1517
// GSON will deserialize numbers as decimals
16-
private final Variation.TargetRule targetFavoriteNumberOn = new Variation.TargetRule("favorite_number", Arrays.<Object>asList(42.0));
18+
private final Variation.TargetRule targetFavoriteNumberOn = new Variation.TargetRule("favorite_number", Arrays.<JsonPrimitive>asList(new JsonPrimitive(42)));
1719

18-
private final Variation.TargetRule targetLikesCatsOn = new Variation.TargetRule("likes_cats", Arrays.<Object>asList(true));
20+
private final Variation.TargetRule targetLikesCatsOn = new Variation.TargetRule("likes_cats", Arrays.<JsonPrimitive>asList(new JsonPrimitive(true)));
1921

20-
private final Variation.TargetRule targetUserOff = new Variation.TargetRule("key", Collections.<Object>singletonList("targetOff@test.com"));
22+
private final Variation.TargetRule targetUserOff = new Variation.TargetRule("key", Collections.<JsonPrimitive>singletonList(new JsonPrimitive("targetOff@test.com")));
2123

22-
private final Variation.TargetRule targetGroupOff = new Variation.TargetRule("groups", Arrays.<Object>asList("oracle"));
24+
private final Variation.TargetRule targetGroupOff = new Variation.TargetRule("groups", Arrays.<JsonPrimitive>asList(new JsonPrimitive("oracle")));
2325

24-
private final Variation.TargetRule targetFavoriteNumberOff = new Variation.TargetRule("favorite_number", Arrays.<Object>asList(33.0));
26+
private final Variation.TargetRule targetFavoriteNumberOff = new Variation.TargetRule("favorite_number", Arrays.<JsonPrimitive>asList(new JsonPrimitive(33.0)));
2527

26-
private final Variation.TargetRule targetLikesDogsOff = new Variation.TargetRule("likes_dogs", Arrays.<Object>asList(false));
28+
private final Variation.TargetRule targetLikesDogsOff = new Variation.TargetRule("likes_dogs", Arrays.<JsonPrimitive>asList(new JsonPrimitive(false)));
2729

28-
private final Variation.TargetRule targetAnonymousOn = new Variation.TargetRule("anonymous", Collections.<Object>singletonList(true));
30+
private final Variation.TargetRule targetAnonymousOn = new Variation.TargetRule("anonymous", Collections.<JsonPrimitive>singletonList(new JsonPrimitive(true)));
2931

3032
private final Variation<Boolean> trueVariation = new Variation.Builder<Boolean>(true, 80)
3133
.target(targetUserOn)
@@ -119,16 +121,27 @@ public void testFlagForTargetNumericTestOn() {
119121
assertEquals(true, b);
120122
}
121123

122-
@Test
123-
public void testFlagForTargetBooleanTestOn() {
124-
LDUser user = new LDUser.Builder("targetOther@test.com")
125-
.custom("likes_cats", true)
126-
.build();
124+
@Test
125+
public void testFlagForTargetNumericListTestOn() {
126+
LDUser user = new LDUser.Builder("targetOther@test.com")
127+
.customNumber("favorite_number", Arrays.<Number>asList(42, 32))
128+
.build();
127129

128-
Boolean b = simpleFlag.evaluate(user);
130+
Boolean b = simpleFlag.evaluate(user);
129131

130-
assertEquals(true, b);
131-
}
132+
assertEquals(true, b);
133+
}
134+
135+
@Test
136+
public void testFlagForTargetBooleanTestOn() {
137+
LDUser user = new LDUser.Builder("targetOther@test.com")
138+
.custom("likes_cats", true)
139+
.build();
140+
141+
Boolean b = simpleFlag.evaluate(user);
142+
143+
assertEquals(true, b);
144+
}
132145

133146
@Test
134147
public void testFlagForTargetGroupOff() {
@@ -152,16 +165,16 @@ public void testFlagForTargetNumericTestOff() {
152165
assertEquals(false, b);
153166
}
154167

155-
@Test
156-
public void testFlagForTargetBooleanTestOff() {
157-
LDUser user = new LDUser.Builder("targetOther@test.com")
158-
.custom("likes_dogs", false)
159-
.build();
168+
@Test
169+
public void testFlagForTargetBooleanTestOff() {
170+
LDUser user = new LDUser.Builder("targetOther@test.com")
171+
.custom("likes_dogs", false)
172+
.build();
160173

161-
Boolean b = simpleFlag.evaluate(user);
174+
Boolean b = simpleFlag.evaluate(user);
162175

163-
assertEquals(false, b);
164-
}
176+
assertEquals(false, b);
177+
}
165178

166179
@Test
167180
public void testDisabledFlagAlwaysOff() {

0 commit comments

Comments
 (0)