Skip to content

Commit 54ef290

Browse files
PR suggestion: make HookSupportData a real POJO
Signed-off-by: Alexandra Oberaigner <[email protected]>
1 parent 1a7e5af commit 54ef290

File tree

6 files changed

+52
-41
lines changed

6 files changed

+52
-41
lines changed

src/main/java/dev/openfeature/sdk/HookContext.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
55
import java.util.Objects;
66
import lombok.EqualsAndHashCode;
7-
import lombok.Generated;
87
import lombok.NonNull;
98
import lombok.ToString;
109

src/main/java/dev/openfeature/sdk/HookSupport.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,42 @@
99
@Slf4j
1010
class HookSupport {
1111

12+
/**
13+
* Updates the evaluation context in the given data object's eval context and each hooks eval context.
14+
*
15+
* @param hookSupportData the data object to modify
16+
* @param evaluationContext the new context to set
17+
*/
18+
public void updateEvaluationContext(HookSupportData hookSupportData, EvaluationContext evaluationContext) {
19+
hookSupportData.evaluationContext = evaluationContext;
20+
if (hookSupportData.hooks != null) {
21+
for (Pair<Hook, HookContext> hookContextPair : hookSupportData.hooks) {
22+
hookContextPair.getValue().setCtx(evaluationContext);
23+
}
24+
}
25+
}
26+
27+
/**
28+
* Sets the {@link Hook}-{@link HookContext}-{@link Pair} list in the given data object.
29+
*
30+
* @param hookSupportData the data object to modify
31+
* @param hooks the new hooks to set
32+
* @param sharedContext the shared context across all hooks from which each hook's {@link HookContext} is
33+
* created
34+
* @param evaluationContext the evaluation context which is
35+
*/
36+
public void setHookSupportDataHooks(HookSupportData hookSupportData, List<Hook> hooks,
37+
SharedHookContext sharedContext, EvaluationContext evaluationContext) {
38+
List<Pair<Hook, HookContext>> hookContextPairs = new ArrayList<>();
39+
for (Hook hook : hooks) {
40+
if (hook.supportsFlagValueType(sharedContext.getType())) {
41+
HookContext curContext = sharedContext.hookContextFor(evaluationContext, new DefaultHookData());
42+
hookContextPairs.add(Pair.of(hook, curContext));
43+
}
44+
}
45+
hookSupportData.hooks = hookContextPairs;
46+
}
47+
1248
public void executeBeforeHooks(HookSupportData data) {
1349
// These traverse backwards from normal.
1450
List<Pair<Hook, HookContext>> reversedHooks = new ArrayList<>(data.getHooks());
@@ -23,7 +59,7 @@ public void executeBeforeHooks(HookSupportData data) {
2359
.orElse(Optional.empty());
2460
if (returnedEvalContext.isPresent()) {
2561
// update shared evaluation context for all hooks
26-
data.setEvaluationContext(data.getEvaluationContext().merge(returnedEvalContext.get()));
62+
updateEvaluationContext(data, data.getEvaluationContext().merge(returnedEvalContext.get()));
2763
}
2864
}
2965
}
Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,19 @@
11
package dev.openfeature.sdk;
22

3-
import java.util.ArrayList;
43
import java.util.List;
54
import java.util.Map;
65
import lombok.Getter;
7-
import lombok.Setter;
86

97
/**
108
* Encapsulates data for hook execution per flag evaluation.
119
*/
1210
@Getter
1311
class HookSupportData {
1412

15-
private List<Pair<Hook, HookContext>> hooks;
16-
private EvaluationContext evaluationContext;
17-
18-
@Setter
19-
private Map<String, Object> hints;
13+
List<Pair<Hook, HookContext>> hooks;
14+
EvaluationContext evaluationContext;
15+
Map<String, Object> hints;
2016

2117
HookSupportData() {}
2218

23-
public void setEvaluationContext(EvaluationContext evaluationContext) {
24-
this.evaluationContext = evaluationContext;
25-
if (hooks != null) {
26-
for (Pair<Hook, HookContext> hookContextPair : hooks) {
27-
hookContextPair.getValue().setCtx(evaluationContext);
28-
}
29-
}
30-
}
31-
32-
public void setHooks(List<Hook> hooks, SharedHookContext sharedContext, EvaluationContext evaluationContext) {
33-
List<Pair<Hook, HookContext>> hookContextPairs = new ArrayList<>();
34-
for (Hook hook : hooks) {
35-
if (hook.supportsFlagValueType(sharedContext.getType())) {
36-
HookContext curContext = sharedContext.hookContextFor(evaluationContext, new DefaultHookData());
37-
hookContextPairs.add(Pair.of(hook, curContext));
38-
}
39-
}
40-
this.hooks = hookContextPairs;
41-
this.evaluationContext = evaluationContext;
42-
}
4319
}

src/main/java/dev/openfeature/sdk/OpenFeatureClient.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
165165

166166
var flagOptions = ObjectUtils.defaultIfNull(
167167
options, () -> FlagEvaluationOptions.builder().build());
168-
var hints = Collections.unmodifiableMap(flagOptions.getHookHints());
169-
hookSupportData.setHints(hints);
168+
hookSupportData.hints = Collections.unmodifiableMap(flagOptions.getHookHints());
170169

171170
try {
172171
final var stateManager = openfeatureApi.getFeatureProviderStateManager(this.domain);
@@ -180,10 +179,10 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
180179
var sharedHookContext =
181180
new SharedHookContext(key, type, this.getMetadata(), provider.getMetadata(), defaultValue);
182181

183-
hookSupportData.setHooks(mergedHooks, sharedHookContext, ctx);
182+
hookSupport.setHookSupportDataHooks(hookSupportData, mergedHooks, sharedHookContext, ctx);
184183

185184
var evalContext = mergeEvaluationContext(ctx);
186-
hookSupportData.setEvaluationContext(evalContext);
185+
hookSupport.updateEvaluationContext(hookSupportData, evalContext);
187186

188187
hookSupport.executeBeforeHooks(hookSupportData);
189188

src/main/java/dev/openfeature/sdk/SharedHookContext.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package dev.openfeature.sdk;
22

3-
import dev.openfeature.sdk.internal.ExcludeFromGeneratedCoverageReport;
4-
import java.util.Objects;
53
import lombok.EqualsAndHashCode;
64
import lombok.Getter;
75

src/test/java/dev/openfeature/sdk/HookSupportTest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,18 @@ class HookSupportTest implements HookFixtures {
2626
void shouldMergeEvaluationContextsOnBeforeHooksCorrectly() {
2727
Map<String, Value> attributes = new HashMap<>();
2828
attributes.put("baseKey", new Value("baseValue"));
29-
EvaluationContext baseContext = new ImmutableContext(attributes);
29+
EvaluationContext baseEvalContext = new ImmutableContext(attributes);
3030

3131
Hook<String> hook1 = mockStringHook();
3232
Hook<String> hook2 = mockStringHook();
3333
when(hook1.before(any(), any())).thenReturn(Optional.of(evaluationContextWithValue("bla", "blubber")));
3434
when(hook2.before(any(), any())).thenReturn(Optional.of(evaluationContextWithValue("foo", "bar")));
3535

36+
var sharedContext = getBaseHookContextForType(FlagValueType.STRING);
3637
var hookSupportData = new HookSupportData();
37-
hookSupportData.setHooks(
38-
Arrays.asList(hook1, hook2), getBaseHookContextForType(FlagValueType.STRING), baseContext);
38+
hookSupport.setHookSupportDataHooks(hookSupportData,
39+
Arrays.asList(hook1, hook2), sharedContext, baseEvalContext);
40+
hookSupport.updateEvaluationContext(hookSupportData, baseEvalContext);
3941

4042
hookSupport.executeBeforeHooks(hookSupportData);
4143

@@ -53,7 +55,7 @@ void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
5355
Hook<?> genericHook = mockGenericHook();
5456

5557
var hookSupportData = new HookSupportData();
56-
hookSupportData.setHooks(
58+
hookSupport.setHookSupportDataHooks(hookSupportData,
5759
List.of(genericHook), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY);
5860

5961
callAllHooks(hookSupportData);
@@ -70,7 +72,8 @@ void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
7072
void shouldPassDataAcrossStages(FlagValueType flagValueType) {
7173
var testHook = new TestHookWithData();
7274
var hookSupportData = new HookSupportData();
73-
hookSupportData.setHooks(List.of(testHook), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY);
75+
hookSupport.setHookSupportDataHooks(hookSupportData,
76+
List.of(testHook), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY);
7477

7578
hookSupport.executeBeforeHooks(hookSupportData);
7679
assertHookData(testHook, "before");
@@ -95,7 +98,7 @@ void shouldIsolateDataBetweenHooks(FlagValueType flagValueType) {
9598
var testHook2 = new TestHookWithData(2);
9699

97100
var hookSupportData = new HookSupportData();
98-
hookSupportData.setHooks(
101+
hookSupport.setHookSupportDataHooks(hookSupportData,
99102
List.of(testHook1, testHook2), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY);
100103

101104
callAllHooks(hookSupportData);

0 commit comments

Comments
 (0)