3
3
import java .util .ArrayList ;
4
4
import java .util .Arrays ;
5
5
import java .util .List ;
6
+ import java .util .Optional ;
6
7
import java .util .Set ;
7
8
import java .util .function .Consumer ;
8
9
@@ -100,12 +101,12 @@ public EvaluationContext getEvaluationContext() {
100
101
public void setProvider (FeatureProvider provider ) {
101
102
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
102
103
providerRepository .setProvider (
103
- provider ,
104
+ provider ,
104
105
this ::attachEventProvider ,
105
106
this ::emitReady ,
106
107
this ::detachEventProvider ,
107
108
this ::emitError ,
108
- false );
109
+ false );
109
110
}
110
111
}
111
112
@@ -118,12 +119,12 @@ public void setProvider(FeatureProvider provider) {
118
119
public void setProvider (String clientName , FeatureProvider provider ) {
119
120
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
120
121
providerRepository .setProvider (clientName ,
121
- provider ,
122
- this ::attachEventProvider ,
123
- this ::emitReady ,
124
- this ::detachEventProvider ,
125
- this ::emitError ,
126
- false );
122
+ provider ,
123
+ this ::attachEventProvider ,
124
+ this ::emitReady ,
125
+ this ::detachEventProvider ,
126
+ this ::emitError ,
127
+ false );
127
128
}
128
129
}
129
130
@@ -133,12 +134,12 @@ public void setProvider(String clientName, FeatureProvider provider) {
133
134
public void setProviderAndWait (FeatureProvider provider ) {
134
135
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
135
136
providerRepository .setProvider (
136
- provider ,
137
- this ::attachEventProvider ,
138
- this ::emitReady ,
139
- this ::detachEventProvider ,
140
- this ::emitError ,
141
- true );
137
+ provider ,
138
+ this ::attachEventProvider ,
139
+ this ::emitReady ,
140
+ this ::detachEventProvider ,
141
+ this ::emitError ,
142
+ true );
142
143
}
143
144
}
144
145
@@ -151,18 +152,18 @@ public void setProviderAndWait(FeatureProvider provider) {
151
152
public void setProviderAndWait (String clientName , FeatureProvider provider ) {
152
153
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
153
154
providerRepository .setProvider (clientName ,
154
- provider ,
155
- this ::attachEventProvider ,
156
- this ::emitReady ,
157
- this ::detachEventProvider ,
158
- this ::emitError ,
159
- true );
155
+ provider ,
156
+ this ::attachEventProvider ,
157
+ this ::emitReady ,
158
+ this ::detachEventProvider ,
159
+ this ::emitError ,
160
+ true );
160
161
}
161
162
}
162
163
163
164
private void attachEventProvider (FeatureProvider provider ) {
164
165
if (provider instanceof EventProvider ) {
165
- ((EventProvider )provider ).attach ((p , event , details ) -> {
166
+ ((EventProvider ) provider ).attach ((p , event , details ) -> {
166
167
runHandlersForProvider (p , event , details );
167
168
});
168
169
}
@@ -174,7 +175,7 @@ private void emitReady(FeatureProvider provider) {
174
175
175
176
private void detachEventProvider (FeatureProvider provider ) {
176
177
if (provider instanceof EventProvider ) {
177
- ((EventProvider )provider ).detach ();
178
+ ((EventProvider ) provider ).detach ();
178
179
}
179
180
}
180
181
@@ -229,9 +230,10 @@ public void clearHooks() {
229
230
230
231
/**
231
232
* Shut down and reset the current status of OpenFeature API.
232
- * This call cleans up all active providers and attempts to shut down internal event handling mechanisms.
233
+ * This call cleans up all active providers and attempts to shut down internal
234
+ * event handling mechanisms.
233
235
* Once shut down is complete, API is reset and ready to use again.
234
- * * /
236
+ */
235
237
public void shutdown () {
236
238
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
237
239
providerRepository .shutdown ();
@@ -302,9 +304,9 @@ void removeHandler(String clientName, ProviderEvent event, Consumer<EventDetails
302
304
303
305
void addHandler (String clientName , ProviderEvent event , Consumer <EventDetails > handler ) {
304
306
try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
305
- // if the provider is READY , run immediately
306
- if (ProviderEvent . PROVIDER_READY . equals ( event )
307
- && ProviderState . READY . equals ( this . providerRepository . getProvider ( clientName ). getState () )) {
307
+ // if the provider is in the state associated with event , run immediately
308
+ if (Optional . ofNullable ( this . providerRepository . getProvider ( clientName ). getState () )
309
+ . orElse ( ProviderState . READY ). matchesEvent ( event )) {
308
310
eventSupport .runHandler (handler , EventDetails .builder ().clientName (clientName ).build ());
309
311
}
310
312
eventSupport .addClientHandler (clientName , event , handler );
@@ -315,30 +317,36 @@ void addHandler(String clientName, ProviderEvent event, Consumer<EventDetails> h
315
317
* Runs the handlers associated with a particular provider.
316
318
*
317
319
* @param provider the provider from where this event originated
318
- * @param event the event type
319
- * @param details the event details
320
+ * @param event the event type
321
+ * @param details the event details
320
322
*/
321
323
private void runHandlersForProvider (FeatureProvider provider , ProviderEvent event , ProviderEventDetails details ) {
322
324
try (AutoCloseableLock __ = lock .readLockAutoCloseable ()) {
323
-
325
+
324
326
List <String > clientNamesForProvider = providerRepository
325
- .getClientNamesForProvider (provider );
326
-
327
+ .getClientNamesForProvider (provider );
328
+
329
+ final String providerName = Optional .ofNullable (provider .getMetadata ())
330
+ .map (metadata -> metadata .getName ())
331
+ .orElse (null );
332
+
327
333
// run the global handlers
328
- eventSupport .runGlobalHandlers (event , EventDetails .fromProviderEventDetails (details ));
334
+ eventSupport .runGlobalHandlers (event , EventDetails .fromProviderEventDetails (details , providerName ));
329
335
330
336
// run the handlers associated with named clients for this provider
331
- clientNamesForProvider .forEach (name -> {
332
- eventSupport .runClientHandlers (name , event , EventDetails .fromProviderEventDetails (details , name ));
337
+ clientNamesForProvider .forEach (name -> {
338
+ eventSupport .runClientHandlers (name , event ,
339
+ EventDetails .fromProviderEventDetails (details , providerName , name ));
333
340
});
334
-
341
+
335
342
if (providerRepository .isDefaultProvider (provider )) {
336
343
// run handlers for clients that have no bound providers (since this is the default)
337
344
Set <String > allClientNames = eventSupport .getAllClientNames ();
338
345
Set <String > boundClientNames = providerRepository .getAllBoundClientNames ();
339
346
allClientNames .removeAll (boundClientNames );
340
347
allClientNames .forEach (name -> {
341
- eventSupport .runClientHandlers (name , event , EventDetails .fromProviderEventDetails (details , name ));
348
+ eventSupport .runClientHandlers (name , event ,
349
+ EventDetails .fromProviderEventDetails (details , providerName , name ));
342
350
});
343
351
}
344
352
}
0 commit comments