|
1 | 1 | /****************************************************************************
|
2 |
| - * Copyright 2017-2021, Optimizely, Inc. and contributors * |
| 2 | + * Copyright 2017-2022, Optimizely, Inc. and contributors * |
3 | 3 | * *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); *
|
5 | 5 | * you may not use this file except in compliance with the License. *
|
|
16 | 16 | package com.optimizely.ab.bucketing;
|
17 | 17 |
|
18 | 18 | import com.optimizely.ab.OptimizelyDecisionContext;
|
| 19 | +import com.optimizely.ab.OptimizelyForcedDecision; |
19 | 20 | import com.optimizely.ab.OptimizelyRuntimeException;
|
20 | 21 | import com.optimizely.ab.OptimizelyUserContext;
|
21 | 22 | import com.optimizely.ab.config.*;
|
@@ -469,6 +470,39 @@ String getBucketingId(@Nonnull String userId,
|
469 | 470 | return bucketingId;
|
470 | 471 | }
|
471 | 472 |
|
| 473 | + /** |
| 474 | + * Find a validated forced decision |
| 475 | + * |
| 476 | + * @param optimizelyDecisionContext The OptimizelyDecisionContext containing flagKey and ruleKey |
| 477 | + * @param projectConfig The Project config |
| 478 | + * @param user The OptimizelyUserContext |
| 479 | + * @return Returns a DecisionResponse structure of type Variation, otherwise null result with reasons |
| 480 | + */ |
| 481 | + public DecisionResponse<Variation> validatedForcedDecision(@Nonnull OptimizelyDecisionContext optimizelyDecisionContext, @Nonnull ProjectConfig projectConfig, @Nonnull OptimizelyUserContext user) { |
| 482 | + DecisionReasons reasons = DefaultDecisionReasons.newInstance(); |
| 483 | + String userId = user.getUserId(); |
| 484 | + OptimizelyForcedDecision optimizelyForcedDecision = user.findForcedDecision(optimizelyDecisionContext); |
| 485 | + String variationKey = optimizelyForcedDecision != null ? optimizelyForcedDecision.getVariationKey() : null; |
| 486 | + if (projectConfig != null && variationKey != null) { |
| 487 | + Variation variation = projectConfig.getFlagVariationByKey(optimizelyDecisionContext.getFlagKey(), variationKey); |
| 488 | + String ruleKey = optimizelyDecisionContext.getRuleKey(); |
| 489 | + String flagKey = optimizelyDecisionContext.getFlagKey(); |
| 490 | + String info; |
| 491 | + String target = ruleKey != OptimizelyDecisionContext.OPTI_NULL_RULE_KEY ? String.format("flag (%s), rule (%s)", flagKey, ruleKey) : String.format("flag (%s)", flagKey); |
| 492 | + if (variation != null) { |
| 493 | + info = String.format("Variation (%s) is mapped to %s and user (%s) in the forced decision map.", variationKey, target, userId); |
| 494 | + logger.debug(info); |
| 495 | + reasons.addInfo(info); |
| 496 | + return new DecisionResponse(variation, reasons); |
| 497 | + } else { |
| 498 | + info = String.format("Invalid variation is mapped to %s and user (%s) in the forced decision map.", target, userId); |
| 499 | + logger.debug(info); |
| 500 | + reasons.addInfo(info); |
| 501 | + } |
| 502 | + } |
| 503 | + return new DecisionResponse<>(null, reasons); |
| 504 | + } |
| 505 | + |
472 | 506 | public ConcurrentHashMap<String, ConcurrentHashMap<String, String>> getForcedVariationMapping() {
|
473 | 507 | return forcedVariationMapping;
|
474 | 508 | }
|
@@ -591,7 +625,7 @@ public DecisionResponse<Variation> getVariationFromExperimentRule(@Nonnull Proje
|
591 | 625 | String ruleKey = rule != null ? rule.getKey() : null;
|
592 | 626 | // Check Forced-Decision
|
593 | 627 | OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, ruleKey);
|
594 |
| - DecisionResponse<Variation> forcedDecisionResponse = user.findValidatedForcedDecision(optimizelyDecisionContext); |
| 628 | + DecisionResponse<Variation> forcedDecisionResponse = validatedForcedDecision(optimizelyDecisionContext, projectConfig, user); |
595 | 629 |
|
596 | 630 | reasons.merge(forcedDecisionResponse.getReasons());
|
597 | 631 |
|
@@ -640,7 +674,7 @@ DecisionResponse<AbstractMap.SimpleEntry> getVariationFromDeliveryRule(@Nonnull
|
640 | 674 | // Check forced-decisions first
|
641 | 675 | Experiment rule = rules.get(ruleIndex);
|
642 | 676 | OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flagKey, rule.getKey());
|
643 |
| - DecisionResponse<Variation> forcedDecisionResponse = user.findValidatedForcedDecision(optimizelyDecisionContext); |
| 677 | + DecisionResponse<Variation> forcedDecisionResponse = validatedForcedDecision(optimizelyDecisionContext, projectConfig, user); |
644 | 678 | reasons.merge(forcedDecisionResponse.getReasons());
|
645 | 679 |
|
646 | 680 | Variation variation = forcedDecisionResponse.getResult();
|
|
0 commit comments