Skip to content

Commit 8bf6faf

Browse files
Update OptimizelyUserContext to copy FD, update DecisionService to user SimpleEntry from AbstractMap instead of Pair since no longer supported in Java 11
1 parent d0aced2 commit 8bf6faf

File tree

3 files changed

+30
-23
lines changed

3 files changed

+30
-23
lines changed

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,20 @@ public OptimizelyUserContext(@Nonnull Optimizely optimizely,
5353
}
5454
}
5555

56+
public OptimizelyUserContext(@Nonnull Optimizely optimizely,
57+
@Nonnull String userId,
58+
@Nonnull Map<String, ?> attributes,
59+
@Nullable Map<String, OptimizelyForcedDecision> forcedDecisionsMap) {
60+
this.optimizely = optimizely;
61+
this.userId = userId;
62+
if (attributes != null) {
63+
this.attributes = Collections.synchronizedMap(new HashMap<>(attributes));
64+
} else {
65+
this.attributes = Collections.synchronizedMap(new HashMap<>());
66+
}
67+
this.forcedDecisionsMap = forcedDecisionsMap;
68+
}
69+
5670
public OptimizelyUserContext(@Nonnull Optimizely optimizely, @Nonnull String userId) {
5771
this(optimizely, userId, Collections.EMPTY_MAP);
5872
}
@@ -70,7 +84,7 @@ public Optimizely getOptimizely() {
7084
}
7185

7286
public OptimizelyUserContext copy() {
73-
return new OptimizelyUserContext(optimizely, userId, attributes);
87+
return new OptimizelyUserContext(optimizely, userId, attributes, forcedDecisionsMap);
7488
}
7589

7690
/**

core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,7 @@
3030
import org.slf4j.LoggerFactory;
3131
import javax.annotation.Nonnull;
3232
import javax.annotation.Nullable;
33-
import java.util.Collections;
34-
import java.util.HashMap;
35-
import java.util.List;
36-
import java.util.Map;
33+
import java.util.*;
3734
import java.util.concurrent.ConcurrentHashMap;
3835

3936
import static com.optimizely.ab.internal.LoggingConstants.LoggingEntityType.EXPERIMENT;
@@ -311,7 +308,7 @@ DecisionResponse<FeatureDecision> getVariationForFeatureInRollout(@Nonnull Featu
311308
int index = 0;
312309
while (index < rolloutRulesLength) {
313310

314-
DecisionResponse<Map> decisionVariationResponse = getVariationFromDeliveryRule(
311+
DecisionResponse<AbstractMap.SimpleEntry> decisionVariationResponse = getVariationFromDeliveryRule(
315312
projectConfig,
316313
featureFlag.getKey(),
317314
rollout.getExperiments(),
@@ -320,9 +317,9 @@ DecisionResponse<FeatureDecision> getVariationForFeatureInRollout(@Nonnull Featu
320317
);
321318
reasons.merge(decisionVariationResponse.getReasons());
322319

323-
Map<Variation, Boolean> response = decisionVariationResponse.getResult();
324-
Variation variation = (Variation)response.keySet().toArray()[0];
325-
Boolean skipToEveryoneElse = response.get(variation);
320+
AbstractMap.SimpleEntry<Variation, Boolean> response = decisionVariationResponse.getResult();
321+
Variation variation = response.getKey();
322+
Boolean skipToEveryoneElse = response.getValue();
326323
if (variation != null) {
327324
Experiment rule = rollout.getExperiments().get(index);
328325
FeatureDecision featureDecision = new FeatureDecision(rule, variation, FeatureDecision.DecisionSource.ROLLOUT);
@@ -631,15 +628,14 @@ private boolean validateUserId(String userId) {
631628
* @return Returns a DecisionResponse Object containing a Pair<Variation, Boolean>
632629
* where the Variation is the result and the Boolean is the skipToEveryoneElse.
633630
*/
634-
DecisionResponse<Map> getVariationFromDeliveryRule(@Nonnull ProjectConfig projectConfig,
631+
DecisionResponse<AbstractMap.SimpleEntry> getVariationFromDeliveryRule(@Nonnull ProjectConfig projectConfig,
635632
@Nonnull String flagKey,
636633
@Nonnull List<Experiment> rules,
637634
@Nonnull int ruleIndex,
638635
@Nonnull OptimizelyUserContext user) {
639636
DecisionReasons reasons = DefaultDecisionReasons.newInstance();
640637
Boolean skipToEveryoneElse = false;
641-
Map<Variation, Boolean> variationToSkipToEveryoneElse = new HashMap<>();;
642-
638+
AbstractMap.SimpleEntry<Variation, Boolean> variationToSkipToEveryoneElsePair;
643639
// Check forced-decisions first
644640
Experiment rule = rules.get(ruleIndex);
645641
OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, rule.getKey());
@@ -648,8 +644,8 @@ DecisionResponse<Map> getVariationFromDeliveryRule(@Nonnull ProjectConfig projec
648644

649645
Variation variation = forcedDecisionResponse.getResult();
650646
if (variation != null) {
651-
variationToSkipToEveryoneElse.put(variation, false);
652-
return new DecisionResponse(variationToSkipToEveryoneElse, reasons);
647+
variationToSkipToEveryoneElsePair = new AbstractMap.SimpleEntry<>(variation, false);
648+
return new DecisionResponse(variationToSkipToEveryoneElsePair, reasons);
653649
}
654650

655651
// Handle a regular decision
@@ -694,8 +690,8 @@ DecisionResponse<Map> getVariationFromDeliveryRule(@Nonnull ProjectConfig projec
694690
reasons.addInfo(message);
695691
logger.debug(message);
696692
}
697-
variationToSkipToEveryoneElse.put(bucketedVariation, skipToEveryoneElse);
698-
return new DecisionResponse(variationToSkipToEveryoneElse, reasons);
693+
variationToSkipToEveryoneElsePair = new AbstractMap.SimpleEntry<>(bucketedVariation, skipToEveryoneElse);
694+
return new DecisionResponse(variationToSkipToEveryoneElsePair, reasons);
699695
}
700696

701697
}

core-api/src/test/java/com/optimizely/ab/bucketing/DecisionServiceTest.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@
3232
import org.mockito.junit.MockitoJUnit;
3333
import org.mockito.junit.MockitoRule;
3434

35-
import java.util.Collections;
36-
import java.util.HashMap;
37-
import java.util.List;
38-
import java.util.Map;
35+
import java.util.*;
3936

4037
import static com.optimizely.ab.config.DatafileProjectConfigTestUtils.*;
4138
import static com.optimizely.ab.config.ValidProjectConfigV4.*;
@@ -727,16 +724,16 @@ public void getVariationFromDeliveryRuleTest() {
727724
expectedVariation = variation;
728725
}
729726
}
730-
DecisionResponse<Map> decisionResponse = decisionService.getVariationFromDeliveryRule(
727+
DecisionResponse<AbstractMap.SimpleEntry> decisionResponse = decisionService.getVariationFromDeliveryRule(
731728
v4ProjectConfig,
732729
FEATURE_FLAG_MULTI_VARIATE_FEATURE.getKey(),
733730
rules,
734731
index,
735732
optimizely.createUserContext(genericUserId, Collections.singletonMap(ATTRIBUTE_NATIONALITY_KEY, AUDIENCE_ENGLISH_CITIZENS_VALUE))
736733
);
737734

738-
Variation variation = (Variation) decisionResponse.getResult().values().toArray()[0];
739-
Boolean skipToEveryoneElse = (Boolean) decisionResponse.getResult().get(variation);
735+
Variation variation = (Variation) decisionResponse.getResult().getKey();
736+
Boolean skipToEveryoneElse = (Boolean) decisionResponse.getResult().getValue();
740737
assertNotNull(decisionResponse.getResult());
741738
assertNotNull(variation);
742739
assertNotNull(expectedVariation);

0 commit comments

Comments
 (0)