88@ Slf4j
99class FeatureProviderStateManager implements EventProviderListener {
1010 private final FeatureProvider delegate ;
11+ private final boolean delegateManagesState ;
1112 private final AtomicBoolean isInitialized = new AtomicBoolean ();
1213 private final AtomicReference <ProviderState > state = new AtomicReference <>(ProviderState .NOT_READY );
1314
1415 public FeatureProviderStateManager (FeatureProvider delegate ) {
1516 this .delegate = delegate ;
17+ this .delegateManagesState = delegate instanceof StateManagingProvider ;
1618 if (delegate instanceof EventProvider ) {
1719 ((EventProvider ) delegate ).setEventProviderListener (this );
1820 }
@@ -24,30 +26,41 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {
2426 }
2527 try {
2628 delegate .initialize (evaluationContext );
27- setState (ProviderState .READY );
29+ if (!delegateManagesState ) {
30+ setState (ProviderState .READY );
31+ }
2832 } catch (OpenFeatureError openFeatureError ) {
29- if (ErrorCode .PROVIDER_FATAL .equals (openFeatureError .getErrorCode ())) {
30- setState (ProviderState .FATAL );
31- } else {
32- setState (ProviderState .ERROR );
33+ if (!delegateManagesState ) {
34+ if (ErrorCode .PROVIDER_FATAL .equals (openFeatureError .getErrorCode ())) {
35+ setState (ProviderState .FATAL );
36+ } else {
37+ setState (ProviderState .ERROR );
38+ }
3339 }
3440 isInitialized .set (false );
3541 throw openFeatureError ;
3642 } catch (Exception e ) {
37- setState (ProviderState .ERROR );
43+ if (!delegateManagesState ) {
44+ setState (ProviderState .ERROR );
45+ }
3846 isInitialized .set (false );
3947 throw e ;
4048 }
4149 }
4250
4351 public void shutdown () {
4452 delegate .shutdown ();
45- setState (ProviderState .NOT_READY );
53+ if (!delegateManagesState ) {
54+ setState (ProviderState .NOT_READY );
55+ }
4656 isInitialized .set (false );
4757 }
4858
4959 @ Override
5060 public void onEmit (ProviderEvent event , ProviderEventDetails details ) {
61+ if (delegateManagesState ) {
62+ return ;
63+ }
5164 if (ProviderEvent .PROVIDER_ERROR .equals (event )) {
5265 if (details != null && details .getErrorCode () == ErrorCode .PROVIDER_FATAL ) {
5366 setState (ProviderState .FATAL );
@@ -75,13 +88,23 @@ private void setState(ProviderState state) {
7588 }
7689
7790 public ProviderState getState () {
91+ if (delegateManagesState ) {
92+ return delegate .getState ();
93+ }
7894 return state .get ();
7995 }
8096
8197 FeatureProvider getProvider () {
8298 return delegate ;
8399 }
84100
101+ /**
102+ * Returns true if the delegate provider manages its own state.
103+ */
104+ boolean delegateManagesState () {
105+ return delegateManagesState ;
106+ }
107+
85108 public boolean hasSameProvider (FeatureProvider featureProvider ) {
86109 return this .delegate .equals (featureProvider );
87110 }
0 commit comments