11package dev .openfeature .javasdk ;
22
3- import java .util .*;
4- import java .util .function .*;
5- import java .util .stream .Stream ;
6-
73import com .google .common .collect .Lists ;
84import lombok .RequiredArgsConstructor ;
95import lombok .extern .slf4j .Slf4j ;
106
7+ import java .util .List ;
8+ import java .util .Map ;
9+ import java .util .Objects ;
10+ import java .util .Optional ;
11+ import java .util .function .Consumer ;
12+ import java .util .stream .Stream ;
13+
1114@ Slf4j
1215@ RequiredArgsConstructor
1316@ SuppressWarnings ({"unchecked" , "rawtypes" })
1417class HookSupport {
1518
16- public void errorHooks (FlagValueType flagValueType , HookContext hookCtx , Exception e , List <Hook > hooks , Map <String , Object > hints ) {
19+ public void errorHooks (FlagValueType flagValueType , HookContext hookCtx , Exception e , List <Hook > hooks ,
20+ Map <String , Object > hints ) {
1721 executeHooks (flagValueType , hooks , "error" , hook -> hook .error (hookCtx , e , hints ));
1822 }
1923
20- public void afterAllHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks , Map <String , Object > hints ) {
24+ public void afterAllHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks ,
25+ Map <String , Object > hints ) {
2126 executeHooks (flagValueType , hooks , "finally" , hook -> hook .finallyAfter (hookCtx , hints ));
2227 }
2328
24- public void afterHooks (FlagValueType flagValueType , HookContext hookContext , FlagEvaluationDetails details , List <Hook > hooks , Map <String , Object > hints ) {
29+ public void afterHooks (FlagValueType flagValueType , HookContext hookContext , FlagEvaluationDetails details ,
30+ List <Hook > hooks , Map <String , Object > hints ) {
2531 executeHooksUnchecked (flagValueType , hooks , hook -> hook .after (hookContext , details , hints ));
2632 }
2733
2834 private <T > void executeHooks (
29- FlagValueType flagValueType , List <Hook > hooks ,
30- String hookMethod ,
31- Consumer <Hook <T >> hookCode
35+ FlagValueType flagValueType , List <Hook > hooks ,
36+ String hookMethod ,
37+ Consumer <Hook <T >> hookCode
3238 ) {
3339 hooks
34- .stream ()
35- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
36- .forEach (hook -> executeChecked (hook , hookCode , hookMethod ));
40+ .stream ()
41+ .filter (hook -> hook .supportsFlagValueType (flagValueType ))
42+ .forEach (hook -> executeChecked (hook , hookCode , hookMethod ));
3743 }
3844
3945 private <T > void executeHooksUnchecked (
40- FlagValueType flagValueType , List <Hook > hooks ,
41- Consumer <Hook <T >> hookCode
46+ FlagValueType flagValueType , List <Hook > hooks ,
47+ Consumer <Hook <T >> hookCode
4248 ) {
4349 hooks
44- .stream ()
45- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
46- .forEach (hookCode ::accept );
50+ .stream ()
51+ .filter (hook -> hook .supportsFlagValueType (flagValueType ))
52+ .forEach (hookCode ::accept );
4753 }
4854
4955 private <T > void executeChecked (Hook <T > hook , Consumer <Hook <T >> hookCode , String hookMethod ) {
@@ -54,28 +60,31 @@ private <T> void executeChecked(Hook<T> hook, Consumer<Hook<T>> hookCode, String
5460 }
5561 }
5662
57- public EvaluationContext beforeHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks , Map <String , Object > hints ) {
63+ public EvaluationContext beforeHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks ,
64+ Map <String , Object > hints ) {
5865 Stream <EvaluationContext > result = callBeforeHooks (flagValueType , hookCtx , hooks , hints );
5966 return EvaluationContext .merge (hookCtx .getCtx (), collectContexts (result ));
6067 }
6168
62- private Stream <EvaluationContext > callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks , Map <String , Object > hints ) {
69+ private Stream <EvaluationContext > callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx ,
70+ List <Hook > hooks , Map <String , Object > hints ) {
6371 // These traverse backwards from normal.
6472 return Lists
65- .reverse (hooks )
66- .stream ()
67- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
68- .map (hook -> hook .before (hookCtx , hints ))
69- .filter (Objects ::nonNull )
70- .filter (Optional ::isPresent )
71- .map (Optional ::get )
72- .map (EvaluationContext .class ::cast );
73+ .reverse (hooks )
74+ .stream ()
75+ .filter (hook -> hook .supportsFlagValueType (flagValueType ))
76+ .map (hook -> hook .before (hookCtx , hints ))
77+ .filter (Objects ::nonNull )
78+ .filter (Optional ::isPresent )
79+ .map (Optional ::get )
80+ .map (EvaluationContext .class ::cast );
7381 }
7482
75- //for whatever reason, an error `error: incompatible types: invalid method reference` is thrown on compilation with javac
83+ //for whatever reason, an error `error: incompatible types: invalid method reference` is thrown on compilation
84+ // with javac
7685 //when the reduce call is appended directly as stream call chain above. moving it to its own method works however...
7786 private EvaluationContext collectContexts (Stream <EvaluationContext > result ) {
7887 return result
79- .reduce (new EvaluationContext (), EvaluationContext ::merge , EvaluationContext ::merge );
88+ .reduce (new EvaluationContext (), EvaluationContext ::merge , EvaluationContext ::merge );
8089 }
8190}
0 commit comments