Skip to content

Commit 6198fd6

Browse files
mnoman09aliabbasrizvi
authored andcommitted
(feat): Feature Management isFeatureEnabled Listener (#271)
1 parent 1f634cd commit 6198fd6

File tree

3 files changed

+395
-13
lines changed

3 files changed

+395
-13
lines changed

core-api/src/main/java/com/optimizely/ab/Optimizely.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,12 @@ public Boolean isFeatureEnabled(@Nonnull String featureKey,
387387
}
388388

389389
Map<String, ?> copiedAttributes = copyAttributes(attributes);
390-
FeatureDecision featureDecision = decisionService.getVariationForFeature(featureFlag, userId, copiedAttributes);
390+
FeatureDecision.DecisionSource decisionSource = FeatureDecision.DecisionSource.ROLLOUT;
391+
String sourceExperimentKey = null;
392+
String sourceVariationKey = null;
391393

394+
FeatureDecision featureDecision = decisionService.getVariationForFeature(featureFlag, userId, copiedAttributes);
395+
Boolean featureEnabled = false;
392396
if (featureDecision.variation != null) {
393397
if (featureDecision.decisionSource.equals(FeatureDecision.DecisionSource.FEATURE_TEST)) {
394398
sendImpression(
@@ -397,18 +401,32 @@ public Boolean isFeatureEnabled(@Nonnull String featureKey,
397401
userId,
398402
copiedAttributes,
399403
featureDecision.variation);
404+
decisionSource = featureDecision.decisionSource;
405+
sourceVariationKey = featureDecision.variation.getKey();
406+
sourceExperimentKey = featureDecision.experiment.getKey();
400407
} else {
401408
logger.info("The user \"{}\" is not included in an experiment for feature \"{}\".",
402409
userId, featureKey);
403410
}
404411
if (featureDecision.variation.getFeatureEnabled()) {
405412
logger.info("Feature \"{}\" is enabled for user \"{}\".", featureKey, userId);
406-
return true;
413+
featureEnabled = true;
407414
}
408415
}
409416

417+
DecisionNotification decisionNotification = DecisionNotification.newFeatureDecisionNotificationBuilder()
418+
.withUserId(userId)
419+
.withAttributes(copiedAttributes)
420+
.withFeatureKey(featureKey)
421+
.withFeatureEnabled(featureEnabled)
422+
.withSource(decisionSource)
423+
.withExperimentKey(sourceExperimentKey)
424+
.withVariationKey(sourceVariationKey)
425+
.build();
426+
notificationCenter.sendNotifications(decisionNotification);
427+
410428
logger.info("Feature \"{}\" is not enabled for user \"{}\".", featureKey, userId);
411-
return false;
429+
return featureEnabled;
412430
}
413431

414432
/**

core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616

1717
package com.optimizely.ab.notification;
1818

19-
2019
import com.optimizely.ab.bucketing.FeatureDecision;
21-
import com.optimizely.ab.config.FeatureVariable;
2220
import com.optimizely.ab.config.Variation;
2321

2422
import javax.annotation.Nonnull;
@@ -69,8 +67,8 @@ public static ExperimentDecisionNotificationBuilder newExperimentDecisionNotific
6967
}
7068

7169
public static class ExperimentDecisionNotificationBuilder {
72-
public final static String EXPERIMENT_KEY = "experiment_key";
73-
public final static String VARIATION_KEY = "variation_key";
70+
public final static String EXPERIMENT_KEY = "experimentKey";
71+
public final static String VARIATION_KEY = "variationKey";
7472

7573
private String type;
7674
private String experimentKey;
@@ -116,4 +114,81 @@ public DecisionNotification build() {
116114
decisionInfo);
117115
}
118116
}
117+
118+
public static FeatureDecisionNotificationBuilder newFeatureDecisionNotificationBuilder() {
119+
return new FeatureDecisionNotificationBuilder();
120+
}
121+
122+
public static class FeatureDecisionNotificationBuilder {
123+
public final static String FEATURE_KEY = "featureKey";
124+
public final static String FEATURE_ENABLED = "featureEnabled";
125+
public final static String SOURCE = "source";
126+
public final static String SOURCE_INFO = "sourceInfo";
127+
public final static String EXPERIMENT_KEY = "experimentKey";
128+
public final static String VARIATION_KEY = "variationKey";
129+
130+
private String featureKey;
131+
private Boolean featureEnabled;
132+
private String experimentKey;
133+
private String variationKey;
134+
private FeatureDecision.DecisionSource source;
135+
private String userId;
136+
private Map<String, ?> attributes;
137+
private Map<String, Object> decisionInfo;
138+
139+
public FeatureDecisionNotificationBuilder withUserId(String userId) {
140+
this.userId = userId;
141+
return this;
142+
}
143+
144+
public FeatureDecisionNotificationBuilder withAttributes(Map<String, ?> attributes) {
145+
this.attributes = attributes;
146+
return this;
147+
}
148+
149+
public FeatureDecisionNotificationBuilder withExperimentKey(String experimentKey) {
150+
this.experimentKey = experimentKey;
151+
return this;
152+
}
153+
154+
public FeatureDecisionNotificationBuilder withVariationKey(String variationKey) {
155+
this.variationKey = variationKey;
156+
return this;
157+
}
158+
159+
public FeatureDecisionNotificationBuilder withSource(FeatureDecision.DecisionSource source) {
160+
this.source = source;
161+
return this;
162+
}
163+
164+
public FeatureDecisionNotificationBuilder withFeatureKey(String featureKey) {
165+
this.featureKey = featureKey;
166+
return this;
167+
}
168+
169+
public FeatureDecisionNotificationBuilder withFeatureEnabled(Boolean featureEnabled) {
170+
this.featureEnabled = featureEnabled;
171+
return this;
172+
}
173+
174+
public DecisionNotification build() {
175+
decisionInfo = new HashMap<>();
176+
decisionInfo.put(FEATURE_KEY, featureKey);
177+
decisionInfo.put(FEATURE_ENABLED, featureEnabled);
178+
decisionInfo.put(SOURCE, source);
179+
180+
Map<String, String> sourceInfo = new HashMap<>();
181+
if (source.equals(FeatureDecision.DecisionSource.FEATURE_TEST)) {
182+
sourceInfo.put(EXPERIMENT_KEY, experimentKey);
183+
sourceInfo.put(VARIATION_KEY, variationKey);
184+
}
185+
decisionInfo.put(SOURCE_INFO, sourceInfo);
186+
187+
return new DecisionNotification(
188+
NotificationCenter.DecisionNotificationType.FEATURE.toString(),
189+
userId,
190+
attributes,
191+
decisionInfo);
192+
}
193+
}
119194
}

0 commit comments

Comments
 (0)