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

Commit 16e2cdc

Browse files
author
Dan Richelson
committed
Add allFlags() method
1 parent 5c62208 commit 16e2cdc

File tree

3 files changed

+40
-28
lines changed

3 files changed

+40
-28
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,19 @@ static Map<String, FeatureFlag> fromJsonMap(String json) {
5353
}
5454

5555
EvalResult evaluate(LDUser user, FeatureStore featureStore) throws EvaluationException {
56+
if (user == null || user.getKeyAsString().isEmpty()) {
57+
logger.warn("Null user or null/empty user key when evaluating flag: " + key + "; returning null");
58+
return null;
59+
}
5660
List<FeatureRequestEvent> prereqEvents = new ArrayList<>();
57-
JsonElement value = evaluate(user, featureStore, prereqEvents);
58-
return new EvalResult(value, prereqEvents);
61+
if (isOn()) {
62+
JsonElement value = evaluate(user, featureStore, prereqEvents);
63+
if (value != null) {
64+
return new EvalResult(value, prereqEvents);
65+
}
66+
}
67+
JsonElement offVariation = getOffVariationValue();
68+
return new EvalResult(offVariation, prereqEvents);
5969
}
6070

6171
// Returning either a JsonElement or null indicating prereq failure/error.

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

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -184,33 +184,42 @@ private void sendFlagRequestEvent(String featureKey, LDUser user, JsonElement va
184184
}
185185

186186
/**
187-
* Returns a map from feature flag keys to Boolean feature flag values for a given user. The map will contain {@code null}
188-
* entries for any flags that are off or for any feature flags with non-boolean variations. If the client is offline or
189-
* has not been initialized, a {@code null} map will be returned.
187+
* Returns a map from feature flag keys to {@code JsonElement} feature flag values for a given user.
188+
* If the result of a flag's evaluation would have returned the default variation, it will have a null entry
189+
* in the map. If the client is offline, has not been initialized, or a null user or user with null/empty user key a {@code null} map will be returned.
190190
* This method will not send analytics events back to LaunchDarkly.
191191
* <p>
192192
* The most common use case for this method is to bootstrap a set of client-side feature flags from a back-end service.
193193
*
194194
* @param user the end user requesting the feature flags
195-
* @return a map from feature flag keys to JsonElement values for the specified user
195+
* @return a map from feature flag keys to {@code JsonElement} for the specified user
196196
*/
197-
public Map<String, Boolean> allFlags(LDUser user) {
197+
public Map<String, JsonElement> allFlags(LDUser user) {
198198
if (isOffline()) {
199+
logger.warn("allFlags() was called when client is in offline mode! Returning null.");
199200
return null;
200201
}
201202

202203
if (!initialized()) {
204+
logger.warn("allFlags() was called before Client has been initialized! Returning null.");
205+
return null;
206+
}
207+
208+
if (user == null || user.getKeyAsString().isEmpty()) {
209+
logger.warn("allFlags() was called with null user or null/empty user key! returning null");
203210
return null;
204211
}
205212

206213
Map<String, FeatureFlag> flags = this.config.featureStore.all();
207-
Map<String, Boolean> result = new HashMap<>();
214+
Map<String, JsonElement> result = new HashMap<>();
208215

209-
for (String key : flags.keySet()) {
210-
JsonElement evalResult = evaluate(key, user, null);
211-
if (evalResult.isJsonPrimitive() && evalResult.getAsJsonPrimitive().isBoolean()) {
212-
result.put(key, evalResult.getAsBoolean());
216+
for (Map.Entry<String, FeatureFlag> entry : flags.entrySet()) {
217+
try {
218+
JsonElement evalResult = entry.getValue().evaluate(user, config.featureStore).getValue();
219+
result.put(entry.getKey(), evalResult);
213220

221+
} catch (EvaluationException e) {
222+
logger.error("Exception caught when evaluating all flags:", e);
214223
}
215224
}
216225
return result;
@@ -325,22 +334,15 @@ private JsonElement evaluate(String featureKey, LDUser user, JsonElement default
325334
sendFlagRequestEvent(featureKey, user, defaultValue, defaultValue, null);
326335
return defaultValue;
327336
}
328-
if (featureFlag.isOn()) {
329-
FeatureFlag.EvalResult evalResult = featureFlag.evaluate(user, config.featureStore);
330-
if (!isOffline()) {
331-
for (FeatureRequestEvent event : evalResult.getPrerequisiteEvents()) {
332-
eventProcessor.sendEvent(event);
333-
}
334-
}
335-
if (evalResult.getValue() != null) {
336-
sendFlagRequestEvent(featureKey, user, evalResult.getValue(), defaultValue, featureFlag.getVersion());
337-
return evalResult.getValue();
338-
}
337+
FeatureFlag.EvalResult evalResult = featureFlag.evaluate(user, config.featureStore);
338+
if (!isOffline()) {
339+
for (FeatureRequestEvent event : evalResult.getPrerequisiteEvents()) {
340+
eventProcessor.sendEvent(event);
341+
}
339342
}
340-
JsonElement offVariation = featureFlag.getOffVariationValue();
341-
if (offVariation != null) {
342-
sendFlagRequestEvent(featureKey, user, offVariation, defaultValue, featureFlag.getVersion());
343-
return offVariation;
343+
if (evalResult.getValue() != null) {
344+
sendFlagRequestEvent(featureKey, user, evalResult.getValue(), defaultValue, featureFlag.getVersion());
345+
return evalResult.getValue();
344346
}
345347
} catch (Exception e) {
346348
logger.error("Encountered exception in LaunchDarkly client", e);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void testPrereqCollectsEventsForPrereqs() throws EvaluationException {
6262

6363
FeatureFlag.EvalResult flagCResult = flagC.evaluate(user, featureStore);
6464
Assert.assertNotNull(flagCResult);
65-
Assert.assertEquals(new JsonPrimitive(0), flagCResult.getValue());
65+
Assert.assertEquals(null, flagCResult.getValue());
6666
Assert.assertEquals(0, flagCResult.getPrerequisiteEvents().size());
6767
}
6868

0 commit comments

Comments
 (0)