|
1 | 1 | package dev.openfeature.contrib.providers.flagd.resolver.process.targeting;
|
2 | 2 |
|
3 |
| -import java.util.HashMap; |
4 |
| -import java.util.Map; |
5 |
| -import java.util.Optional; |
6 |
| -import java.time.Instant; |
7 |
| - |
8 | 3 | import dev.openfeature.sdk.EvaluationContext;
|
9 | 4 | import io.github.jamsesso.jsonlogic.JsonLogic;
|
10 | 5 | import io.github.jamsesso.jsonlogic.JsonLogicException;
|
11 | 6 | import lombok.Getter;
|
12 | 7 |
|
| 8 | +import java.time.Instant; |
| 9 | +import java.util.HashMap; |
| 10 | +import java.util.Map; |
| 11 | +import java.util.Optional; |
| 12 | + |
13 | 13 | /**
|
14 | 14 | * Targeting operator wraps JsonLogic handlers and expose a simple API for
|
15 | 15 | * external layers.
|
@@ -46,49 +46,57 @@ public Object apply(final String flagKey, final String targetingRule, final Eval
|
46 | 46 | long unixTimestamp = Instant.now().getEpochSecond();
|
47 | 47 | flagdProperties.put(TIME_STAMP, unixTimestamp);
|
48 | 48 |
|
49 |
| - final Map<String, Object> valueMap = ctx.asObjectMap(); |
50 |
| - valueMap.put(FLAGD_PROPS_KEY, flagdProperties); |
| 49 | + final Map<String, Object> targetingCtxData = ctx.asObjectMap(); |
| 50 | + |
| 51 | + // asObjectMap() does not provide explicitly set targeting key (ex:- new ImmutableContext("TargetingKey") ). |
| 52 | + // Hence, we add this explicitly here for targeting rule processing. |
| 53 | + targetingCtxData.put(TARGET_KEY, ctx.getTargetingKey()); |
| 54 | + targetingCtxData.put(FLAGD_PROPS_KEY, flagdProperties); |
51 | 55 |
|
52 | 56 | try {
|
53 |
| - return jsonLogicHandler.apply(targetingRule, valueMap); |
| 57 | + return jsonLogicHandler.apply(targetingRule, targetingCtxData); |
54 | 58 | } catch (JsonLogicException e) {
|
55 | 59 | throw new TargetingRuleException("Error evaluating json logic", e);
|
56 | 60 | }
|
57 | 61 | }
|
58 | 62 |
|
| 63 | + /** |
| 64 | + * A utility class to extract well-known properties such as flag key, targeting key and timestamp from json logic |
| 65 | + * evaluation context data for further processing at evaluators. |
| 66 | + */ |
59 | 67 | @Getter
|
60 | 68 | static class FlagProperties {
|
61 |
| - private final Object flagKey; |
62 |
| - private final Object timestamp; |
63 |
| - private final String targetingKey; |
| 69 | + private Object flagKey = null; |
| 70 | + private Object timestamp = null; |
| 71 | + private String targetingKey = null; |
64 | 72 |
|
65 | 73 | FlagProperties(Object from) {
|
66 |
| - if (from instanceof Map) { |
67 |
| - Map<?, ?> dataMap = (Map<?, ?>) from; |
68 |
| - |
69 |
| - this.flagKey = extractSubPropertyFromFlagd(dataMap, FLAG_KEY); |
70 |
| - this.timestamp = extractSubPropertyFromFlagd(dataMap, TIME_STAMP); |
71 |
| - |
72 |
| - final Object targetKey = dataMap.get(TARGET_KEY); |
73 |
| - |
74 |
| - if (targetKey instanceof String) { |
75 |
| - targetingKey = (String) targetKey; |
76 |
| - } else { |
77 |
| - targetingKey = null; |
78 |
| - } |
79 |
| - |
80 |
| - } else { |
81 |
| - flagKey = null; |
82 |
| - timestamp = null; |
83 |
| - targetingKey = null; |
| 74 | + if (!(from instanceof Map)) { |
| 75 | + return; |
| 76 | + } |
| 77 | + |
| 78 | + final Map<?, ?> dataMap = (Map<?, ?>) from; |
| 79 | + final Object targetKey = dataMap.get(TARGET_KEY); |
| 80 | + if (targetKey instanceof String) { |
| 81 | + targetingKey = (String) targetKey; |
| 82 | + } |
| 83 | + |
| 84 | + final Map<?, ?> flagdPropertyMap = flagdPropertyMap(dataMap); |
| 85 | + if (flagdPropertyMap == null){ |
| 86 | + return; |
84 | 87 | }
|
| 88 | + |
| 89 | + this.flagKey = flagdPropertyMap.get(FLAG_KEY); |
| 90 | + this.timestamp = flagdPropertyMap.get(TIME_STAMP); |
85 | 91 | }
|
86 | 92 |
|
87 |
| - private static Object extractSubPropertyFromFlagd(Map<?, ?> dataMap, String propertyName) { |
88 |
| - return Optional.ofNullable(dataMap.get(FLAGD_PROPS_KEY)) |
89 |
| - .filter(flagdProps -> flagdProps instanceof Map) |
90 |
| - .map(flagdProps -> ((Map<?, ?>) flagdProps).get(propertyName)) |
91 |
| - .orElse(null); |
92 |
| - } |
| 93 | + private static Map<?, ?> flagdPropertyMap(Map<?, ?> dataMap) { |
| 94 | + Object o = dataMap.get(FLAGD_PROPS_KEY); |
| 95 | + if (o instanceof Map) { |
| 96 | + return (Map<?, ?>) o; |
| 97 | + } |
| 98 | + |
| 99 | + return null; |
| 100 | + } |
93 | 101 | }
|
94 | 102 | }
|
0 commit comments