@@ -43,8 +43,8 @@ public FeatureProvider getProvider(String name) {
43
43
44
44
public List <String > getClientNamesForProvider (FeatureProvider provider ) {
45
45
return providers .entrySet ().stream ()
46
- .filter (entry -> entry .getValue ().equals (provider ))
47
- .map (entry -> entry .getKey ()).collect (Collectors .toList ());
46
+ .filter (entry -> entry .getValue ().equals (provider ))
47
+ .map (entry -> entry .getKey ()).collect (Collectors .toList ());
48
48
}
49
49
50
50
public Set <String > getAllBoundClientNames () {
@@ -62,58 +62,76 @@ public void setProvider(FeatureProvider provider,
62
62
Consumer <FeatureProvider > afterSet ,
63
63
Consumer <FeatureProvider > afterInit ,
64
64
Consumer <FeatureProvider > afterShutdown ,
65
- BiConsumer <FeatureProvider , String > afterError ) {
65
+ BiConsumer <FeatureProvider , String > afterError ,
66
+ boolean waitForInit ) {
66
67
if (provider == null ) {
67
68
throw new IllegalArgumentException ("Provider cannot be null" );
68
69
}
69
- initializeProvider (null , provider , afterSet , afterInit , afterShutdown , afterError );
70
+ prepareAndInitializeProvider (null , provider , afterSet , afterInit , afterShutdown , afterError , waitForInit );
70
71
}
71
72
72
73
/**
73
74
* Add a provider for a named client.
74
75
*
75
- * @param clientName The name of the client.
76
- * @param provider The provider to set.
76
+ * @param clientName The name of the client.
77
+ * @param provider The provider to set.
78
+ * @param waitForInit When true, wait for initialization to finish, then returns.
79
+ * Otherwise, initialization happens in the background.
77
80
*/
78
81
public void setProvider (String clientName ,
79
- FeatureProvider provider ,
80
- Consumer <FeatureProvider > afterSet ,
81
- Consumer <FeatureProvider > afterInit ,
82
- Consumer <FeatureProvider > afterShutdown ,
83
- BiConsumer <FeatureProvider , String > afterError ) {
82
+ FeatureProvider provider ,
83
+ Consumer <FeatureProvider > afterSet ,
84
+ Consumer <FeatureProvider > afterInit ,
85
+ Consumer <FeatureProvider > afterShutdown ,
86
+ BiConsumer <FeatureProvider , String > afterError ,
87
+ boolean waitForInit ) {
84
88
if (provider == null ) {
85
89
throw new IllegalArgumentException ("Provider cannot be null" );
86
90
}
87
91
if (clientName == null ) {
88
92
throw new IllegalArgumentException ("clientName cannot be null" );
89
93
}
90
- initializeProvider (clientName , provider , afterSet , afterInit , afterShutdown , afterError );
94
+ prepareAndInitializeProvider (clientName , provider , afterSet , afterInit , afterShutdown , afterError , waitForInit );
91
95
}
92
96
93
- private void initializeProvider (@ Nullable String clientName ,
94
- FeatureProvider newProvider ,
95
- Consumer <FeatureProvider > afterSet ,
96
- Consumer <FeatureProvider > afterInit ,
97
- Consumer <FeatureProvider > afterShutdown ,
98
- BiConsumer <FeatureProvider , String > afterError ) {
97
+ private void prepareAndInitializeProvider (@ Nullable String clientName ,
98
+ FeatureProvider newProvider ,
99
+ Consumer <FeatureProvider > afterSet ,
100
+ Consumer <FeatureProvider > afterInit ,
101
+ Consumer <FeatureProvider > afterShutdown ,
102
+ BiConsumer <FeatureProvider , String > afterError ,
103
+ boolean waitForInit ) {
104
+
99
105
// provider is set immediately, on this thread
100
106
FeatureProvider oldProvider = clientName != null
101
- ? this .providers .put (clientName , newProvider )
102
- : this .defaultProvider .getAndSet (newProvider );
107
+ ? this .providers .put (clientName , newProvider )
108
+ : this .defaultProvider .getAndSet (newProvider );
103
109
afterSet .accept (newProvider );
104
- taskExecutor .submit (() -> {
105
- // initialization happens in a different thread
106
- try {
107
- if (ProviderState .NOT_READY .equals (newProvider .getState ())) {
108
- newProvider .initialize (OpenFeatureAPI .getInstance ().getEvaluationContext ());
109
- afterInit .accept (newProvider );
110
- }
111
- shutDownOld (oldProvider , afterShutdown );
112
- } catch (Exception e ) {
113
- log .error ("Exception when initializing feature provider {}" , newProvider .getClass ().getName (), e );
114
- afterError .accept (newProvider , e .getMessage ());
110
+ if (waitForInit ) {
111
+ initializeProvider (newProvider , afterInit , afterShutdown , afterError , oldProvider );
112
+ } else {
113
+ taskExecutor .submit (() -> {
114
+ // initialization happens in a different thread if we're not waiting it
115
+ initializeProvider (newProvider , afterInit , afterShutdown , afterError , oldProvider );
116
+ });
117
+ }
118
+ }
119
+
120
+ private void initializeProvider (FeatureProvider newProvider ,
121
+ Consumer <FeatureProvider > afterInit ,
122
+ Consumer <FeatureProvider > afterShutdown ,
123
+ BiConsumer <FeatureProvider , String > afterError ,
124
+ FeatureProvider oldProvider ) {
125
+ try {
126
+ if (ProviderState .NOT_READY .equals (newProvider .getState ())) {
127
+ newProvider .initialize (OpenFeatureAPI .getInstance ().getEvaluationContext ());
128
+ afterInit .accept (newProvider );
115
129
}
116
- });
130
+ shutDownOld (oldProvider , afterShutdown );
131
+ } catch (Exception e ) {
132
+ log .error ("Exception when initializing feature provider {}" , newProvider .getClass ().getName (), e );
133
+ afterError .accept (newProvider , e .getMessage ());
134
+ }
117
135
}
118
136
119
137
private void shutDownOld (FeatureProvider oldProvider ,Consumer <FeatureProvider > afterShutdown ) {
@@ -157,7 +175,7 @@ public void shutdown() {
157
175
},
158
176
(FeatureProvider fp ,
159
177
String message ) -> {
160
- });
178
+ }, false );
161
179
this .providers .clear ();
162
180
taskExecutor .shutdown ();
163
181
}
0 commit comments