33import java .util .ArrayList ;
44import java .util .Arrays ;
55import java .util .List ;
6+ import java .util .Optional ;
67import java .util .Set ;
78import java .util .function .Consumer ;
89
@@ -100,12 +101,12 @@ public EvaluationContext getEvaluationContext() {
100101 public void setProvider (FeatureProvider provider ) {
101102 try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
102103 providerRepository .setProvider (
103- provider ,
104+ provider ,
104105 this ::attachEventProvider ,
105106 this ::emitReady ,
106107 this ::detachEventProvider ,
107108 this ::emitError ,
108- false );
109+ false );
109110 }
110111 }
111112
@@ -118,12 +119,12 @@ public void setProvider(FeatureProvider provider) {
118119 public void setProvider (String clientName , FeatureProvider provider ) {
119120 try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
120121 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 );
127128 }
128129 }
129130
@@ -133,12 +134,12 @@ public void setProvider(String clientName, FeatureProvider provider) {
133134 public void setProviderAndWait (FeatureProvider provider ) {
134135 try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
135136 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 );
142143 }
143144 }
144145
@@ -151,18 +152,18 @@ public void setProviderAndWait(FeatureProvider provider) {
151152 public void setProviderAndWait (String clientName , FeatureProvider provider ) {
152153 try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
153154 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 );
160161 }
161162 }
162163
163164 private void attachEventProvider (FeatureProvider provider ) {
164165 if (provider instanceof EventProvider ) {
165- ((EventProvider )provider ).attach ((p , event , details ) -> {
166+ ((EventProvider ) provider ).attach ((p , event , details ) -> {
166167 runHandlersForProvider (p , event , details );
167168 });
168169 }
@@ -174,7 +175,7 @@ private void emitReady(FeatureProvider provider) {
174175
175176 private void detachEventProvider (FeatureProvider provider ) {
176177 if (provider instanceof EventProvider ) {
177- ((EventProvider )provider ).detach ();
178+ ((EventProvider ) provider ).detach ();
178179 }
179180 }
180181
@@ -229,9 +230,10 @@ public void clearHooks() {
229230
230231 /**
231232 * 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.
233235 * Once shut down is complete, API is reset and ready to use again.
234- * * /
236+ */
235237 public void shutdown () {
236238 try (AutoCloseableLock __ = lock .writeLockAutoCloseable ()) {
237239 providerRepository .shutdown ();
@@ -302,9 +304,9 @@ void removeHandler(String clientName, ProviderEvent event, Consumer<EventDetails
302304
303305 void addHandler (String clientName , ProviderEvent event , Consumer <EventDetails > handler ) {
304306 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 )) {
308310 eventSupport .runHandler (handler , EventDetails .builder ().clientName (clientName ).build ());
309311 }
310312 eventSupport .addClientHandler (clientName , event , handler );
@@ -315,30 +317,36 @@ void addHandler(String clientName, ProviderEvent event, Consumer<EventDetails> h
315317 * Runs the handlers associated with a particular provider.
316318 *
317319 * @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
320322 */
321323 private void runHandlersForProvider (FeatureProvider provider , ProviderEvent event , ProviderEventDetails details ) {
322324 try (AutoCloseableLock __ = lock .readLockAutoCloseable ()) {
323-
325+
324326 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+
327333 // run the global handlers
328- eventSupport .runGlobalHandlers (event , EventDetails .fromProviderEventDetails (details ));
334+ eventSupport .runGlobalHandlers (event , EventDetails .fromProviderEventDetails (details , providerName ));
329335
330336 // 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 ));
333340 });
334-
341+
335342 if (providerRepository .isDefaultProvider (provider )) {
336343 // run handlers for clients that have no bound providers (since this is the default)
337344 Set <String > allClientNames = eventSupport .getAllClientNames ();
338345 Set <String > boundClientNames = providerRepository .getAllBoundClientNames ();
339346 allClientNames .removeAll (boundClientNames );
340347 allClientNames .forEach (name -> {
341- eventSupport .runClientHandlers (name , event , EventDetails .fromProviderEventDetails (details , name ));
348+ eventSupport .runClientHandlers (name , event ,
349+ EventDetails .fromProviderEventDetails (details , providerName , name ));
342350 });
343351 }
344352 }
0 commit comments