2
2
3
3
import dev .openfeature .sdk .exceptions .OpenFeatureError ;
4
4
import java .util .concurrent .atomic .AtomicBoolean ;
5
- import lombok .Getter ;
5
+ import java .util .concurrent .atomic .AtomicReference ;
6
+ import lombok .extern .slf4j .Slf4j ;
6
7
8
+ @ Slf4j
7
9
class FeatureProviderStateManager implements EventProviderListener {
8
10
private final FeatureProvider delegate ;
9
11
private final AtomicBoolean isInitialized = new AtomicBoolean ();
10
-
11
- @ Getter
12
- private ProviderState state = ProviderState .NOT_READY ;
12
+ private final AtomicReference <ProviderState > state = new AtomicReference <>(ProviderState .NOT_READY );
13
13
14
14
public FeatureProviderStateManager (FeatureProvider delegate ) {
15
15
this .delegate = delegate ;
@@ -24,43 +24,60 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {
24
24
}
25
25
try {
26
26
delegate .initialize (evaluationContext );
27
- state = ProviderState .READY ;
27
+ setState ( ProviderState .READY ) ;
28
28
} catch (OpenFeatureError openFeatureError ) {
29
29
if (ErrorCode .PROVIDER_FATAL .equals (openFeatureError .getErrorCode ())) {
30
- state = ProviderState .FATAL ;
30
+ setState ( ProviderState .FATAL ) ;
31
31
} else {
32
- state = ProviderState .ERROR ;
32
+ setState ( ProviderState .ERROR ) ;
33
33
}
34
34
isInitialized .set (false );
35
35
throw openFeatureError ;
36
36
} catch (Exception e ) {
37
- state = ProviderState .ERROR ;
37
+ setState ( ProviderState .ERROR ) ;
38
38
isInitialized .set (false );
39
39
throw e ;
40
40
}
41
41
}
42
42
43
43
public void shutdown () {
44
44
delegate .shutdown ();
45
- state = ProviderState .NOT_READY ;
45
+ setState ( ProviderState .NOT_READY ) ;
46
46
isInitialized .set (false );
47
47
}
48
48
49
49
@ Override
50
50
public void onEmit (ProviderEvent event , ProviderEventDetails details ) {
51
51
if (ProviderEvent .PROVIDER_ERROR .equals (event )) {
52
52
if (details != null && details .getErrorCode () == ErrorCode .PROVIDER_FATAL ) {
53
- state = ProviderState .FATAL ;
53
+ setState ( ProviderState .FATAL ) ;
54
54
} else {
55
- state = ProviderState .ERROR ;
55
+ setState ( ProviderState .ERROR ) ;
56
56
}
57
57
} else if (ProviderEvent .PROVIDER_STALE .equals (event )) {
58
- state = ProviderState .STALE ;
58
+ setState ( ProviderState .STALE ) ;
59
59
} else if (ProviderEvent .PROVIDER_READY .equals (event )) {
60
- state = ProviderState .READY ;
60
+ setState (ProviderState .READY );
61
+ }
62
+ }
63
+
64
+ private void setState (ProviderState state ) {
65
+ ProviderState oldState = this .state .getAndSet (state );
66
+ if (oldState != state ) {
67
+ String providerName ;
68
+ if (delegate .getMetadata () == null || delegate .getMetadata ().getName () == null ) {
69
+ providerName = "unknown" ;
70
+ } else {
71
+ providerName = delegate .getMetadata ().getName ();
72
+ }
73
+ log .info ("Provider {} transitioned from state {} to state {}" , providerName , oldState , state );
61
74
}
62
75
}
63
76
77
+ public ProviderState getState () {
78
+ return state .get ();
79
+ }
80
+
64
81
FeatureProvider getProvider () {
65
82
return delegate ;
66
83
}
0 commit comments