Skip to content

Commit 37326d9

Browse files
committed
make FeatureProviderStateManager a true wrapper, without implementing FeatureProvider
Signed-off-by: christian.lutnik <[email protected]>
1 parent 8bd726d commit 37326d9

File tree

10 files changed

+136
-211
lines changed

10 files changed

+136
-211
lines changed

src/main/java/dev/openfeature/sdk/EventProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ public boolean equals(Object obj) {
108108
if (obj == null) {
109109
return false;
110110
}
111-
if (obj instanceof StatefulFeatureProvider) {
112-
return this == ((StatefulFeatureProvider) obj).getDelegate();
111+
if (obj instanceof FeatureProviderStateManager) {
112+
return this == ((FeatureProviderStateManager) obj).getProvider();
113113
}
114114
return this == obj;
115115
}

src/main/java/dev/openfeature/sdk/StatefulFeatureProvider.java renamed to src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package dev.openfeature.sdk;
22

33
import dev.openfeature.sdk.exceptions.OpenFeatureError;
4+
import lombok.Getter;
45
import lombok.experimental.Delegate;
56

67
import java.util.concurrent.atomic.AtomicBoolean;
78

8-
class StatefulFeatureProvider implements FeatureProvider, EventProviderListener {
9+
class FeatureProviderStateManager implements EventProviderListener {
910

1011
private interface ExcludeFromDelegate {
1112
void initialize(EvaluationContext evaluationContext) throws Exception;
@@ -18,16 +19,16 @@ private interface ExcludeFromDelegate {
1819
@Delegate(excludes = ExcludeFromDelegate.class)
1920
private final FeatureProvider delegate;
2021
private final AtomicBoolean isInitialized = new AtomicBoolean();
22+
@Getter
2123
private ProviderState state = ProviderState.NOT_READY;
2224

23-
public StatefulFeatureProvider(FeatureProvider delegate) {
25+
public FeatureProviderStateManager(FeatureProvider delegate) {
2426
this.delegate = delegate;
2527
if (delegate instanceof EventProvider) {
2628
((EventProvider) delegate).setEventProviderListener(this);
2729
}
2830
}
2931

30-
@Override
3132
public void initialize(EvaluationContext evaluationContext) throws Exception {
3233
if (isInitialized.getAndSet(true)) {
3334
return;
@@ -50,34 +51,12 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {
5051
}
5152
}
5253

53-
@Override
5454
public void shutdown() {
5555
delegate.shutdown();
5656
state = ProviderState.NOT_READY;
5757
isInitialized.set(false);
5858
}
5959

60-
@Override
61-
public ProviderState getState() {
62-
return state;
63-
}
64-
65-
@Override
66-
public int hashCode() {
67-
return delegate.hashCode();
68-
}
69-
70-
@Override
71-
public boolean equals(Object obj) {
72-
if (this == obj) {
73-
return true;
74-
}
75-
if (obj instanceof StatefulFeatureProvider) {
76-
return delegate.equals(((StatefulFeatureProvider) obj).delegate);
77-
}
78-
return delegate.equals(obj);
79-
}
80-
8160
@Override
8261
public void onEmit(ProviderEvent event, ProviderEventDetails details) {
8362
if (ProviderEvent.PROVIDER_ERROR.equals(event)) {
@@ -93,7 +72,11 @@ public void onEmit(ProviderEvent event, ProviderEventDetails details) {
9372
}
9473
}
9574

96-
FeatureProvider getDelegate() {
75+
FeatureProvider getProvider() {
9776
return delegate;
9877
}
78+
79+
public boolean hasSameProvider(FeatureProvider featureProvider){
80+
return this.delegate.equals(featureProvider);
81+
}
9982
}

src/main/java/dev/openfeature/sdk/NoOpProvider.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,4 @@ public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultVa
6666
.reason(Reason.DEFAULT.toString())
6767
.build();
6868
}
69-
70-
@Override
71-
public boolean equals(Object obj) {
72-
if (obj == null) {
73-
return false;
74-
}
75-
if (obj instanceof StatefulFeatureProvider) {
76-
return ((StatefulFeatureProvider) obj).getDelegate() == this;
77-
}
78-
return obj == this;
79-
}
8069
}

src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public Metadata getProviderMetadata(String domain) {
6565
}
6666

6767
/**
68-
* A factory function for creating new, OpenFeature clients.
68+
* A factory function for creating new, OpenFeature client.
6969
* Clients can contain their own state (e.g. logger, hook, context).
7070
* Multiple clients can be used to segment feature flag configuration.
7171
* All un-named or unbound clients use the default provider.
@@ -77,7 +77,7 @@ public Client getClient() {
7777
}
7878

7979
/**
80-
* A factory function for creating new domainless OpenFeature clients.
80+
* A factory function for creating new domainless OpenFeature client.
8181
* Clients can contain their own state (e.g. logger, hook, context).
8282
* Multiple clients can be used to segment feature flag configuration.
8383
* If there is already a provider bound to this domain, this provider will be used.
@@ -91,7 +91,7 @@ public Client getClient(String domain) {
9191
}
9292

9393
/**
94-
* A factory function for creating new domainless OpenFeature clients.
94+
* A factory function for creating new domainless OpenFeature client.
9595
* Clients can contain their own state (e.g. logger, hook, context).
9696
* Multiple clients can be used to segment feature flag configuration.
9797
* If there is already a provider bound to this domain, this provider will be used.
@@ -103,17 +103,7 @@ public Client getClient(String domain) {
103103
*/
104104
public Client getClient(String domain, String version) {
105105
return new OpenFeatureClient(
106-
new ProviderAccessor() {
107-
@Override
108-
public FeatureProvider getProvider() {
109-
return providerRepository.getProvider(domain);
110-
}
111-
112-
@Override
113-
public ProviderState getProviderState() {
114-
return providerRepository.getProviderState(domain);
115-
}
116-
},
106+
() -> providerRepository.getFeatureProviderStateManager(domain),
117107
this,
118108
domain,
119109
version

src/main/java/dev/openfeature/sdk/OpenFeatureClient.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public OpenFeatureClient(
6363

6464
@Override
6565
public ProviderState getProviderState() {
66-
return providerAccessor.getProviderState();
66+
return providerAccessor.getProviderStateManager().getState();
6767
}
6868

6969
/**
@@ -122,8 +122,9 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(FlagValueType type, String key
122122

123123
try {
124124
// openfeatureApi.getProvider() must be called once to maintain a consistent reference
125-
provider = providerAccessor.getProvider();
126-
ProviderState state = providerAccessor.getProviderState();
125+
FeatureProviderStateManager stateManager = providerAccessor.getProviderStateManager();
126+
provider = stateManager.getProvider();
127+
ProviderState state = stateManager.getState();
127128
if (ProviderState.NOT_READY.equals(state)) {
128129
throw new ProviderNotReadyError("provider not yet initialized");
129130
}

src/main/java/dev/openfeature/sdk/ProviderAccessor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
/**
44
* Provides access to the future provider for the domain of the client.
55
*/
6-
public interface ProviderAccessor {
7-
FeatureProvider getProvider();
8-
9-
ProviderState getProviderState();
6+
@FunctionalInterface
7+
interface ProviderAccessor {
8+
FeatureProviderStateManager getProviderStateManager();
109
}

0 commit comments

Comments
 (0)