Skip to content

Commit 328d9ec

Browse files
feat: implement as decorator
1 parent 0ffba67 commit 328d9ec

File tree

5 files changed

+46
-15
lines changed

5 files changed

+46
-15
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import lombok.NonNull;
66
import lombok.Value;
77
import lombok.With;
8-
import lombok.experimental.NonFinal;
98

109
/**
1110
* A data class to hold immutable context that {@link Hook} instances use.
@@ -27,8 +26,6 @@ public class HookContext<T> {
2726
ClientMetadata clientMetadata;
2827
Metadata providerMetadata;
2928

30-
HookData hookData;
31-
3229
/**
3330
* Builds {@link HookContext} instances from request data.
3431
*
@@ -57,4 +54,8 @@ public static <T> HookContext<T> from(
5754
.defaultValue(defaultValue)
5855
.build();
5956
}
57+
58+
HookData getHookData() {
59+
return null;
60+
}
6061
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.openfeature.sdk;
2+
3+
/**
4+
* A base decorator class for {@link HookContext} that enables dynamic enhancement of its functionality.
5+
* This class wraps an existing {@code HookContext<T>} instance and delegates method calls to it.
6+
*
7+
* @param <T> the type for the flag being evaluated
8+
*/
9+
class HookContextDecorator<T> extends HookContext<T> {
10+
11+
HookContext<T> decorated;
12+
13+
protected HookContextDecorator(HookContext<T> context) {
14+
super(context.getFlagKey(), context.getType(), context.getDefaultValue(), context.getCtx(), context.getClientMetadata(),
15+
context.getProviderMetadata());
16+
this.decorated = context;
17+
}
18+
19+
@Override
20+
public HookData getHookData() {
21+
return decorated.getHookData();
22+
}
23+
}
Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package dev.openfeature.sdk;
22

3-
public class HookContextWithData<T> extends HookContext<T> {
3+
/**
4+
* A concrete decorator for {@link HookContext} that adds {@link HookData} to the existing functionality.
5+
*
6+
* @param <T> the type for the flag being evaluated
7+
*/
8+
public class HookContextWithData<T> extends HookContextDecorator<T> {
49

5-
private HookContextWithData(String flagKey, FlagValueType type, T defaultValue,
6-
EvaluationContext ctx, ClientMetadata clientMetadata, Metadata providerMetadata, HookData data) {
7-
super(flagKey, type, defaultValue, ctx, clientMetadata, providerMetadata, data);
10+
private final HookData hookData;
11+
12+
public HookContextWithData(HookContext<T> context, HookData data) {
13+
super(context);
14+
this.hookData = data;
815
}
916

10-
public static <T> HookContextWithData<T> of(HookContext<T> context, HookData data) {
11-
return new HookContextWithData<>(context.getFlagKey(), context.getType(), context.getDefaultValue(), context.getCtx(), context.getClientMetadata(),
12-
context.getProviderMetadata(), data);
17+
@Override
18+
public HookData getHookData() {
19+
return hookData;
1320
}
1421
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ private <T> void executeChecked(
8888
BiConsumer<Hook<T>, HookContext> hookCode,
8989
String hookMethod) {
9090
try {
91-
var hookCtxWithData = HookContextWithData.of(hookContext, hookData);
91+
var hookCtxWithData = new HookContextWithData(hookContext, hookData);
9292
hookCode.accept(hook, hookCtxWithData);
9393
} catch (Exception exception) {
9494
log.error(
@@ -109,7 +109,7 @@ private <T> void executeHooksUnchecked(
109109
for (Pair<Hook, HookData> hookDataPair : hookDataPairs) {
110110
Hook hook = hookDataPair.getLeft();
111111
HookData hookData = hookDataPair.getRight();
112-
var hookCtxWithData = HookContextWithData.of(hookContext, hookData);
112+
var hookCtxWithData = new HookContextWithData(hookContext, hookData);
113113
hookCode.accept(hook, hookCtxWithData);
114114
}
115115
}
@@ -130,7 +130,7 @@ private EvaluationContext callBeforeHooks(
130130
HookData hookData = hookDataPair.getRight();
131131

132132
// Create a new context with this hook's data
133-
HookContext contextWithHookData = HookContextWithData.of(hookCtx, hookData);
133+
HookContext contextWithHookData = new HookContextWithData(hookCtx, hookData);
134134
Optional<EvaluationContext> optional =
135135
Optional.ofNullable(hook.before(contextWithHookData, hints)).orElse(Optional.empty());
136136
if (optional.isPresent()) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void shouldCreateHookContextWithHookData() {
4141
HookData hookData = HookData.create();
4242
hookData.set("test", "value");
4343

44-
HookContextWithData contextWithData = HookContextWithData.of(context, hookData);
44+
HookContextWithData contextWithData = new HookContextWithData(context, hookData);
4545

4646
assertNotNull(contextWithData.getHookData());
4747
assertEquals("value", contextWithData.getHookData().get("test"));
@@ -71,7 +71,7 @@ void shouldCreateHookContextWithHookDataUsingWith() {
7171
HookData hookData = HookData.create();
7272
hookData.set("timing", System.currentTimeMillis());
7373

74-
HookContext<String> contextWithHookData = HookContextWithData.of(originalContext, hookData);
74+
HookContext<String> contextWithHookData = new HookContextWithData(originalContext, hookData);
7575

7676
assertNull(originalContext.getHookData());
7777
assertNotNull(contextWithHookData.getHookData());

0 commit comments

Comments
 (0)