Skip to content

Commit dbfcab6

Browse files
HookSupport improvements: rename back to old name, move code from static factory method to ctor
Signed-off-by: Alexandra Oberaigner <[email protected]>
1 parent e0935f3 commit dbfcab6

File tree

3 files changed

+51
-44
lines changed

3 files changed

+51
-44
lines changed

src/main/java/dev/openfeature/sdk/HookExecutor.java renamed to src/main/java/dev/openfeature/sdk/HookSupport.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,12 @@
88
import lombok.extern.slf4j.Slf4j;
99

1010
@Slf4j
11-
class HookExecutor {
11+
class HookSupport {
1212
private List<Pair<Hook, HookContext>> hooks;
1313
private EvaluationContext evaluationContext;
1414
private final Map<String, Object> hints;
1515

16-
private HookExecutor(
17-
List<Pair<Hook, HookContext>> hooks, EvaluationContext evaluationContext, Map<String, Object> hints) {
18-
this.hooks = hooks;
19-
this.evaluationContext = evaluationContext;
20-
this.hints = hints;
21-
}
22-
23-
public static HookExecutor create(
16+
HookSupport(
2417
List<Hook> hooks,
2518
SharedHookContext sharedContext,
2619
EvaluationContext evaluationContext,
@@ -32,7 +25,9 @@ public static HookExecutor create(
3225
hookContextPairs.add(Pair.of(hook, curContext));
3326
}
3427
}
35-
return new HookExecutor(hookContextPairs, evaluationContext, hints);
28+
this.hooks = hookContextPairs;
29+
this.evaluationContext = evaluationContext;
30+
this.hints = hints;
3631
}
3732

3833
public EvaluationContext getEvaluationContext() {

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
162162
var hints = Collections.unmodifiableMap(flagOptions.getHookHints());
163163

164164
FlagEvaluationDetails<T> details = null;
165-
HookExecutor hookExecutor = null;
165+
HookSupport hookSupport = null;
166166

167167
try {
168168
final var stateManager = openfeatureApi.getFeatureProviderStateManager(this.domain);
@@ -177,9 +177,9 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
177177
new SharedHookContext(key, type, this.getMetadata(), provider.getMetadata(), defaultValue);
178178

179179
var evalContext = mergeEvaluationContext(ctx);
180-
hookExecutor = HookExecutor.create(mergedHooks, sharedHookContext, evalContext, hints);
180+
hookSupport = new HookSupport(mergedHooks, sharedHookContext, evalContext, hints);
181181

182-
hookExecutor.executeBeforeHooks();
182+
hookSupport.executeBeforeHooks();
183183

184184
// "short circuit" if the provider is in NOT_READY or FATAL state
185185
if (ProviderState.NOT_READY.equals(state)) {
@@ -190,16 +190,16 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
190190
}
191191

192192
var providerEval = (ProviderEvaluation<T>)
193-
createProviderEvaluation(type, key, defaultValue, provider, hookExecutor.getEvaluationContext());
193+
createProviderEvaluation(type, key, defaultValue, provider, hookSupport.getEvaluationContext());
194194

195195
details = FlagEvaluationDetails.from(providerEval, key);
196196
if (details.getErrorCode() != null) {
197197
var error =
198198
ExceptionUtils.instantiateErrorByErrorCode(details.getErrorCode(), details.getErrorMessage());
199199
enrichDetailsWithErrorDefaults(defaultValue, details);
200-
hookExecutor.executeErrorHooks(error);
200+
hookSupport.executeErrorHooks(error);
201201
} else {
202-
hookExecutor.executeAfterHooks(details);
202+
hookSupport.executeAfterHooks(details);
203203
}
204204
} catch (Exception e) {
205205
if (details == null) {
@@ -212,10 +212,10 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
212212
}
213213
details.setErrorMessage(e.getMessage());
214214
enrichDetailsWithErrorDefaults(defaultValue, details);
215-
hookExecutor.executeErrorHooks(e);
215+
hookSupport.executeErrorHooks(e);
216216
} finally {
217-
if (hookExecutor != null) {
218-
hookExecutor.executeAfterAllHooks(details);
217+
if (hookSupport != null) {
218+
hookSupport.executeAfterAllHooks(details);
219219
}
220220
}
221221

src/test/java/dev/openfeature/sdk/HookExecutorTest.java renamed to src/test/java/dev/openfeature/sdk/HookSupportTest.java

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.junit.jupiter.params.ParameterizedTest;
1919
import org.junit.jupiter.params.provider.EnumSource;
2020

21-
class HookExecutorTest implements HookFixtures {
21+
class HookSupportTest implements HookFixtures {
2222
@Test
2323
@DisplayName("should merge EvaluationContexts on before hooks correctly")
2424
void shouldMergeEvaluationContextsOnBeforeHooksCorrectly() {
@@ -31,8 +31,11 @@ void shouldMergeEvaluationContextsOnBeforeHooksCorrectly() {
3131
when(hook1.before(any(), any())).thenReturn(Optional.of(evaluationContextWithValue("bla", "blubber")));
3232
when(hook2.before(any(), any())).thenReturn(Optional.of(evaluationContextWithValue("foo", "bar")));
3333

34-
HookExecutor executor = HookExecutor.create(
35-
Arrays.asList(hook1, hook2), getBaseHookContextForType(FlagValueType.STRING), baseContext, Collections.emptyMap());
34+
HookSupport executor = new HookSupport(
35+
Arrays.asList(hook1, hook2),
36+
getBaseHookContextForType(FlagValueType.STRING),
37+
baseContext,
38+
Collections.emptyMap());
3639

3740
executor.executeBeforeHooks();
3841

@@ -49,9 +52,13 @@ void shouldMergeEvaluationContextsOnBeforeHooksCorrectly() {
4952
void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
5053
Hook<?> genericHook = mockGenericHook();
5154

52-
HookExecutor hookExecutor = HookExecutor.create(List.of(genericHook), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY, Collections.emptyMap());
55+
HookSupport hookSupport = new HookSupport(
56+
List.of(genericHook),
57+
getBaseHookContextForType(flagValueType),
58+
ImmutableContext.EMPTY,
59+
Collections.emptyMap());
5360

54-
callAllHooks(hookExecutor);
61+
callAllHooks(hookSupport);
5562

5663
verify(genericHook).before(any(), any());
5764
verify(genericHook).after(any(), any(), any());
@@ -64,18 +71,22 @@ void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
6471
@DisplayName("should allow hooks to store and retrieve data across stages")
6572
void shouldPassDataAcrossStages(FlagValueType flagValueType) {
6673
var testHook = new TestHookWithData();
67-
HookExecutor hookExecutor = HookExecutor.create(List.of(testHook), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY, Collections.emptyMap());
74+
HookSupport hookSupport = new HookSupport(
75+
List.of(testHook),
76+
getBaseHookContextForType(flagValueType),
77+
ImmutableContext.EMPTY,
78+
Collections.emptyMap());
6879

69-
hookExecutor.executeBeforeHooks();
80+
hookSupport.executeBeforeHooks();
7081
assertHookData(testHook, "before");
7182

72-
hookExecutor.executeAfterHooks(FlagEvaluationDetails.builder().build());
83+
hookSupport.executeAfterHooks(FlagEvaluationDetails.builder().build());
7384
assertHookData(testHook, "before", "after");
7485

75-
hookExecutor.executeAfterAllHooks(FlagEvaluationDetails.builder().build());
86+
hookSupport.executeAfterAllHooks(FlagEvaluationDetails.builder().build());
7687
assertHookData(testHook, "before", "after", "finallyAfter");
7788

78-
hookExecutor.executeErrorHooks(mock(Exception.class));
89+
hookSupport.executeErrorHooks(mock(Exception.class));
7990
assertHookData(testHook, "before", "after", "finallyAfter", "error");
8091
}
8192

@@ -86,48 +97,49 @@ void shouldIsolateDataBetweenHooks(FlagValueType flagValueType) {
8697
var testHook1 = new TestHookWithData(1);
8798
var testHook2 = new TestHookWithData(2);
8899

89-
HookExecutor hookExecutor = HookExecutor.create(List.of(testHook1, testHook2), getBaseHookContextForType(flagValueType), ImmutableContext.EMPTY, Collections.emptyMap());
100+
HookSupport hookSupport = new HookSupport(
101+
List.of(testHook1, testHook2),
102+
getBaseHookContextForType(flagValueType),
103+
ImmutableContext.EMPTY,
104+
Collections.emptyMap());
90105

91-
callAllHooks(hookExecutor);
106+
callAllHooks(hookSupport);
92107

93108
assertHookData(testHook1, 1, "before", "after", "finallyAfter", "error");
94109
assertHookData(testHook2, 2, "before", "after", "finallyAfter", "error");
95110
}
96111

97-
private static void callAllHooks(HookExecutor hookExecutor) {
98-
hookExecutor.executeBeforeHooks();
99-
hookExecutor.executeAfterHooks(FlagEvaluationDetails.builder().build());
100-
hookExecutor.executeAfterAllHooks(FlagEvaluationDetails.builder().build());
101-
hookExecutor.executeErrorHooks(mock(Exception.class));
112+
private static void callAllHooks(HookSupport hookSupport) {
113+
hookSupport.executeBeforeHooks();
114+
hookSupport.executeAfterHooks(FlagEvaluationDetails.builder().build());
115+
hookSupport.executeAfterAllHooks(FlagEvaluationDetails.builder().build());
116+
hookSupport.executeErrorHooks(mock(Exception.class));
102117
}
103118

104-
private static void assertHookData(TestHookWithData testHook, String ... expectedKeys) {
119+
private static void assertHookData(TestHookWithData testHook, String... expectedKeys) {
105120
for (String expectedKey : expectedKeys) {
106121
assertThat(testHook.hookData.get(expectedKey))
107122
.withFailMessage("Expected key %s not present in hook data", expectedKey)
108123
.isNotNull();
109124
}
110125
}
111126

112-
private static void assertHookData(TestHookWithData testHook, Object expectedValue, String ... expectedKeys) {
127+
private static void assertHookData(TestHookWithData testHook, Object expectedValue, String... expectedKeys) {
113128
for (String expectedKey : expectedKeys) {
114129
assertThat(testHook.hookData.get(expectedKey))
115130
.withFailMessage("Expected key '%s' not present in hook data", expectedKey)
116131
.isNotNull();
117132
assertThat(testHook.hookData.get(expectedKey))
118-
.withFailMessage("Expected key '%s' not containing expected value. Expected '%s' but found '%s'",
133+
.withFailMessage(
134+
"Expected key '%s' not containing expected value. Expected '%s' but found '%s'",
119135
expectedKey, expectedValue, testHook.hookData.get(expectedKey))
120136
.isEqualTo(expectedValue);
121137
}
122138
}
123139

124140
private SharedHookContext getBaseHookContextForType(FlagValueType flagValueType) {
125141
return new SharedHookContext<>(
126-
"flagKey",
127-
flagValueType,
128-
() -> "client",
129-
() -> "provider",
130-
createDefaultValue(flagValueType));
142+
"flagKey", flagValueType, () -> "client", () -> "provider", createDefaultValue(flagValueType));
131143
}
132144

133145
private Object createDefaultValue(FlagValueType flagValueType) {

0 commit comments

Comments
 (0)