diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml
index ecb443b8..2a1277ea 100644
--- a/.github/workflows/merge.yml
+++ b/.github/workflows/merge.yml
@@ -32,7 +32,7 @@ jobs:
server-password: ${{ secrets.OSSRH_PASSWORD }}
- name: Cache local Maven repository
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c
+ uses: actions/cache@a2ed59d39b352305bdd2f628719a53b2cc4f9613
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -49,7 +49,7 @@ jobs:
run: mvn --batch-mode --update-snapshots verify
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@v3.1.4
+ uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
flags: unittests # optional
diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml
index e47bb931..99d8c2cf 100644
--- a/.github/workflows/pullrequest.yml
+++ b/.github/workflows/pullrequest.yml
@@ -20,12 +20,12 @@ jobs:
cache: maven
- name: Initialize CodeQL
- uses: github/codeql-action/init@96531062ba46eb11dee25758db76518ad30ee4cf
+ uses: github/codeql-action/init@4075abfb065d705660b25161b8db80d9181f0f9a
with:
languages: java
- name: Cache local Maven repository
- uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c
+ uses: actions/cache@a2ed59d39b352305bdd2f628719a53b2cc4f9613
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -36,7 +36,7 @@ jobs:
run: mvn --batch-mode --update-snapshots --activate-profiles e2e verify
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@v3.1.4
+ uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
flags: unittests # optional
@@ -45,4 +45,4 @@ jobs:
verbose: true # optional (default = false)
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@96531062ba46eb11dee25758db76518ad30ee4cf
+ uses: github/codeql-action/analyze@4075abfb065d705660b25161b8db80d9181f0f9a
diff --git a/.github/workflows/static-code-scanning.yaml b/.github/workflows/static-code-scanning.yaml
index c5754d44..aeaaa5c6 100644
--- a/.github/workflows/static-code-scanning.yaml
+++ b/.github/workflows/static-code-scanning.yaml
@@ -33,12 +33,12 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@96531062ba46eb11dee25758db76518ad30ee4cf
+ uses: github/codeql-action/init@4075abfb065d705660b25161b8db80d9181f0f9a
with:
languages: java
- name: Autobuild
- uses: github/codeql-action/autobuild@96531062ba46eb11dee25758db76518ad30ee4cf
+ uses: github/codeql-action/autobuild@4075abfb065d705660b25161b8db80d9181f0f9a
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@96531062ba46eb11dee25758db76518ad30ee4cf
+ uses: github/codeql-action/analyze@4075abfb065d705660b25161b8db80d9181f0f9a
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 0dec4881..badb68b8 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1 +1 @@
-{".":"1.7.3"}
\ No newline at end of file
+{".":"1.7.4"}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index acb6ff20..1deb943c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,49 @@
# Changelog
+## [1.7.4](https://github.com/open-feature/java-sdk/compare/v1.7.3...v1.7.4) (2024-02-13)
+
+
+### ๐ Bug Fixes
+
+* **deps:** update dependency org.slf4j:slf4j-api to v2.0.12 ([#792](https://github.com/open-feature/java-sdk/issues/792)) ([202e7dd](https://github.com/open-feature/java-sdk/commit/202e7dd82f1c21007cdd1949947652bdf3364948))
+* **deps:** update junit5 monorepo ([#790](https://github.com/open-feature/java-sdk/issues/790)) ([1fb6712](https://github.com/open-feature/java-sdk/commit/1fb67125ce334ccd4f650b37b77c2cd3df11c380))
+* setProviderAndWait must throw ([#794](https://github.com/open-feature/java-sdk/issues/794)) ([da47b7f](https://github.com/open-feature/java-sdk/commit/da47b7f9c05372f92dac22823c41ebb4e17cb0df))
+
+
+### ๐งน Chore
+
+* **deps:** update actions/cache digest to 13aacd8 ([#770](https://github.com/open-feature/java-sdk/issues/770)) ([877fa07](https://github.com/open-feature/java-sdk/commit/877fa07e5f8323711fbd57acc145fd9afb1be61d))
+* **deps:** update actions/cache digest to a2ed59d ([#772](https://github.com/open-feature/java-sdk/issues/772)) ([4da6edd](https://github.com/open-feature/java-sdk/commit/4da6edd3b0e387d727a891f6b285a7caf8d84f7e))
+* **deps:** update codecov/codecov-action action to v3.1.5 ([#779](https://github.com/open-feature/java-sdk/issues/779)) ([2ccc855](https://github.com/open-feature/java-sdk/commit/2ccc8557fa7fb805c885d0b51315095d5d408cd1))
+* **deps:** update codecov/codecov-action action to v3.1.6 ([#783](https://github.com/open-feature/java-sdk/issues/783)) ([bab83ae](https://github.com/open-feature/java-sdk/commit/bab83aeaa957e49ad416d9b02c5c8c764ad038c5))
+* **deps:** update codecov/codecov-action action to v4 ([#784](https://github.com/open-feature/java-sdk/issues/784)) ([d2b380f](https://github.com/open-feature/java-sdk/commit/d2b380f9f49e95e58a9c6dfbcac06e278c2305c7))
+* **deps:** update codecov/codecov-action action to v4.0.1 ([#787](https://github.com/open-feature/java-sdk/issues/787)) ([8d6e33f](https://github.com/open-feature/java-sdk/commit/8d6e33f3344730fabe40adbbe0afff218d9c4b6b))
+* **deps:** update dependency com.github.spotbugs:spotbugs-maven-plugin to v4.8.3.0 ([#766](https://github.com/open-feature/java-sdk/issues/766)) ([92f8e99](https://github.com/open-feature/java-sdk/commit/92f8e9908cbf94d91dbcbd9403b071aee1be2867))
+* **deps:** update dependency com.github.spotbugs:spotbugs-maven-plugin to v4.8.3.1 ([#799](https://github.com/open-feature/java-sdk/issues/799)) ([0291a11](https://github.com/open-feature/java-sdk/commit/0291a11d91dfc107a0b70f63bcbe79d5effef50d))
+* **deps:** update dependency com.google.guava:guava to v33 ([#738](https://github.com/open-feature/java-sdk/issues/738)) ([8c9aa70](https://github.com/open-feature/java-sdk/commit/8c9aa707b81018a5c626a38acc90ea5b282e5d4d))
+* **deps:** update dependency org.assertj:assertj-core to v3.25.2 ([#777](https://github.com/open-feature/java-sdk/issues/777)) ([70a7abe](https://github.com/open-feature/java-sdk/commit/70a7abecc9b0c122b23950f6ab6dfbb42c24f89d))
+* **deps:** update dependency org.assertj:assertj-core to v3.25.3 ([#791](https://github.com/open-feature/java-sdk/issues/791)) ([1374a88](https://github.com/open-feature/java-sdk/commit/1374a880066e07ea8660675b80901d2580df4db1))
+* **deps:** update dependency org.cyclonedx:cyclonedx-maven-plugin to v2.7.11 ([#768](https://github.com/open-feature/java-sdk/issues/768)) ([27a9ac6](https://github.com/open-feature/java-sdk/commit/27a9ac68f5d64bd03ed002ec3a94e4d4bc94d7cc))
+* **deps:** update github/codeql-action digest to 1515e2b ([#796](https://github.com/open-feature/java-sdk/issues/796)) ([5159947](https://github.com/open-feature/java-sdk/commit/51599474cdcf5b58ff81a132bdd542ef1d0693f5))
+* **deps:** update github/codeql-action digest to 1615032 ([#778](https://github.com/open-feature/java-sdk/issues/778)) ([ae511d0](https://github.com/open-feature/java-sdk/commit/ae511d09a3c695cce1596fb28440b2079711c255))
+* **deps:** update github/codeql-action digest to 25f779c ([#780](https://github.com/open-feature/java-sdk/issues/780)) ([fa5ae68](https://github.com/open-feature/java-sdk/commit/fa5ae68e3065adff4f3faec6150bc7fcdd0c3e87))
+* **deps:** update github/codeql-action digest to 2eaf014 ([#774](https://github.com/open-feature/java-sdk/issues/774)) ([c028fa3](https://github.com/open-feature/java-sdk/commit/c028fa3c152b0df4c407f4c4fca3313f66ec4f6b))
+* **deps:** update github/codeql-action digest to 39cc02b ([#789](https://github.com/open-feature/java-sdk/issues/789)) ([74352ba](https://github.com/open-feature/java-sdk/commit/74352ba7206d2a86d401180fe387d7f7f78711e8))
+* **deps:** update github/codeql-action digest to 3ab1d29 ([#798](https://github.com/open-feature/java-sdk/issues/798)) ([77446c9](https://github.com/open-feature/java-sdk/commit/77446c973e1445925abcac3b1f9f659a60f85ebd))
+* **deps:** update github/codeql-action digest to 4075abf ([#800](https://github.com/open-feature/java-sdk/issues/800)) ([69f95b1](https://github.com/open-feature/java-sdk/commit/69f95b1bfdb9462d83b280037292242aa85be081))
+* **deps:** update github/codeql-action digest to 483bef1 ([#786](https://github.com/open-feature/java-sdk/issues/786)) ([9c2cbe3](https://github.com/open-feature/java-sdk/commit/9c2cbe3d5d7de6d908f18f170e424e114b6a2fa1))
+* **deps:** update github/codeql-action digest to 4d75a10 ([#769](https://github.com/open-feature/java-sdk/issues/769)) ([1eba495](https://github.com/open-feature/java-sdk/commit/1eba495acea6bc93a737ca0fc9afc2c1ae6dedbf))
+* **deps:** update github/codeql-action digest to 65c7496 ([#775](https://github.com/open-feature/java-sdk/issues/775)) ([0f5ee65](https://github.com/open-feature/java-sdk/commit/0f5ee6556ad1108da57a8969b46b191309ebb3b1))
+* **deps:** update github/codeql-action digest to 81eb6b2 ([#788](https://github.com/open-feature/java-sdk/issues/788)) ([993c4ba](https://github.com/open-feature/java-sdk/commit/993c4ba67be3d9c7482d617f9c82a789d44bea5e))
+* **deps:** update github/codeql-action digest to 932a7d5 ([#795](https://github.com/open-feature/java-sdk/issues/795)) ([d5a0620](https://github.com/open-feature/java-sdk/commit/d5a0620f590c4fb51b74fe802aefb1e282e135eb))
+* **deps:** update github/codeql-action digest to bd67d8d ([#776](https://github.com/open-feature/java-sdk/issues/776)) ([9d9ad85](https://github.com/open-feature/java-sdk/commit/9d9ad85e1f9e9b0cc4a380680a22b9cd43f3432d))
+* **deps:** update github/codeql-action digest to cf7e9f2 ([#793](https://github.com/open-feature/java-sdk/issues/793)) ([302f168](https://github.com/open-feature/java-sdk/commit/302f1688b32eff62754b0a2c5d97c261315b2e18))
+* **deps:** update github/codeql-action digest to d0c8484 ([#773](https://github.com/open-feature/java-sdk/issues/773)) ([c894337](https://github.com/open-feature/java-sdk/commit/c894337c8e6d8bec16f41cad63ec4bb1542501f2))
+* **deps:** update github/codeql-action digest to e345133 ([#785](https://github.com/open-feature/java-sdk/issues/785)) ([8e9ff90](https://github.com/open-feature/java-sdk/commit/8e9ff90985c713d7c2157ef2b19cc758f3dcbb4c))
+* **deps:** update github/codeql-action digest to eab49d7 ([#781](https://github.com/open-feature/java-sdk/issues/781)) ([d8f77e6](https://github.com/open-feature/java-sdk/commit/d8f77e6ce02a3fcc423e9f80abb9c30191618348))
+* **deps:** update github/codeql-action digest to f65ecd0 ([#771](https://github.com/open-feature/java-sdk/issues/771)) ([6926530](https://github.com/open-feature/java-sdk/commit/692653035a94ab750cfcf37872f26d1b7861aff7))
+* various improvements as suggested by sonar ([#797](https://github.com/open-feature/java-sdk/issues/797)) ([6c8657d](https://github.com/open-feature/java-sdk/commit/6c8657d5205c6d8181ecaa14fc52ee2c753d3d01))
+
## [1.7.3](https://github.com/open-feature/java-sdk/compare/v1.7.2...v1.7.3) (2024-01-12)
diff --git a/README.md b/README.md
index 60e73fcc..5b31fa19 100644
--- a/README.md
+++ b/README.md
@@ -18,8 +18,8 @@
-
-
+
+
@@ -59,7 +59,7 @@ Note that this library is intended to be used in server-side contexts and has no
dev.openfeature
sdk
- 1.7.3
+ 1.7.4
```
@@ -84,7 +84,7 @@ If you would like snapshot builds, this is the relevant repository information:
```groovy
dependencies {
- implementation 'dev.openfeature:sdk:1.7.3'
+ implementation 'dev.openfeature:sdk:1.7.4'
}
```
diff --git a/pom.xml b/pom.xml
index a5280ace..36438654 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,13 +4,13 @@
dev.openfeature
sdk
- 1.7.3
+ 1.7.4
UTF-8
1.8
${maven.compiler.source}
- 5.10.1
+ 5.10.2
**/e2e/*.java
${groupId}.${artifactId}
@@ -60,7 +60,7 @@
org.slf4j
slf4j-api
- 2.0.11
+ 2.0.12
@@ -74,7 +74,7 @@
org.assertj
assertj-core
- 3.25.1
+ 3.25.3
test
@@ -109,7 +109,7 @@
org.junit.platform
junit-platform-suite
- 1.10.1
+ 1.10.2
test
@@ -135,7 +135,7 @@
com.google.guava
guava
- 32.1.3-jre
+ 33.0.0-jre
test
@@ -162,7 +162,7 @@
org.junit
junit-bom
- 5.10.1
+ 5.10.2
pom
import
@@ -175,7 +175,7 @@
org.cyclonedx
cyclonedx-maven-plugin
- 2.7.10
+ 2.7.11
library
1.3
@@ -349,7 +349,7 @@
com.github.spotbugs
spotbugs-maven-plugin
- 4.8.2.0
+ 4.8.3.1
spotbugs-exclusions.xml
diff --git a/src/main/java/dev/openfeature/sdk/EventSupport.java b/src/main/java/dev/openfeature/sdk/EventSupport.java
index 7f616554..f9bb67dd 100644
--- a/src/main/java/dev/openfeature/sdk/EventSupport.java
+++ b/src/main/java/dev/openfeature/sdk/EventSupport.java
@@ -163,8 +163,8 @@ static class HandlerStore {
private final Map>> handlerMap;
- {
- handlerMap = new ConcurrentHashMap>>();
+ HandlerStore() {
+ handlerMap = new ConcurrentHashMap<>();
handlerMap.put(ProviderEvent.PROVIDER_READY, new ArrayList<>());
handlerMap.put(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, new ArrayList<>());
handlerMap.put(ProviderEvent.PROVIDER_ERROR, new ArrayList<>());
diff --git a/src/main/java/dev/openfeature/sdk/ImmutableStructure.java b/src/main/java/dev/openfeature/sdk/ImmutableStructure.java
index 7ea1ef65..d70a0163 100644
--- a/src/main/java/dev/openfeature/sdk/ImmutableStructure.java
+++ b/src/main/java/dev/openfeature/sdk/ImmutableStructure.java
@@ -40,7 +40,7 @@ public ImmutableStructure(Map attributes) {
.collect(HashMap::new,
(accumulated, entry) -> accumulated.put(entry.getKey(),
Optional.ofNullable(entry.getValue())
- .map(e -> e.clone())
+ .map(Value::clone)
.orElse(null)),
HashMap::putAll)));
}
@@ -70,7 +70,7 @@ public Map asMap() {
.collect(HashMap::new,
(accumulated, entry) -> accumulated.put(entry.getKey(),
Optional.ofNullable(entry.getValue())
- .map(e -> e.clone())
+ .map(Value::clone)
.orElse(null)),
HashMap::putAll);
}
diff --git a/src/main/java/dev/openfeature/sdk/MutableContext.java b/src/main/java/dev/openfeature/sdk/MutableContext.java
index 9e7069ca..42fc90f5 100644
--- a/src/main/java/dev/openfeature/sdk/MutableContext.java
+++ b/src/main/java/dev/openfeature/sdk/MutableContext.java
@@ -145,7 +145,7 @@ public MutableStructure add(String ignoredKey, List ignoredValue) {
return null;
}
- public MutableStructure add(String ignoredKey, MutableStructure ignoredValue) {
+ public MutableStructure add(String ignoredKey, Structure ignoredValue) {
return null;
}
diff --git a/src/main/java/dev/openfeature/sdk/MutableStructure.java b/src/main/java/dev/openfeature/sdk/MutableStructure.java
index 3c4f34dd..fadd6805 100644
--- a/src/main/java/dev/openfeature/sdk/MutableStructure.java
+++ b/src/main/java/dev/openfeature/sdk/MutableStructure.java
@@ -75,7 +75,7 @@ public MutableStructure add(String key, Structure value) {
return this;
}
- public MutableStructure add(String key, List value) {
+ public MutableStructure add(String key, List value) {
attributes.put(key, new Value(value));
return this;
}
diff --git a/src/main/java/dev/openfeature/sdk/NoOpProvider.java b/src/main/java/dev/openfeature/sdk/NoOpProvider.java
index d3d9ca21..ef8cf1f8 100644
--- a/src/main/java/dev/openfeature/sdk/NoOpProvider.java
+++ b/src/main/java/dev/openfeature/sdk/NoOpProvider.java
@@ -18,12 +18,7 @@ public ProviderState getState() {
@Override
public Metadata getMetadata() {
- return new Metadata() {
- @Override
- public String getName() {
- return name;
- }
- };
+ return () -> name;
}
@Override
diff --git a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java
index 7448ad78..a7ba42b3 100644
--- a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java
+++ b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java
@@ -9,6 +9,7 @@
import javax.annotation.Nullable;
+import dev.openfeature.sdk.exceptions.OpenFeatureError;
import dev.openfeature.sdk.internal.AutoCloseableLock;
import dev.openfeature.sdk.internal.AutoCloseableReentrantReadWriteLock;
import lombok.extern.slf4j.Slf4j;
@@ -131,14 +132,14 @@ public void setProvider(String clientName, FeatureProvider provider) {
/**
* Set the default provider and wait for initialization to finish.
*/
- public void setProviderAndWait(FeatureProvider provider) {
+ public void setProviderAndWait(FeatureProvider provider) throws OpenFeatureError {
try (AutoCloseableLock __ = lock.writeLockAutoCloseable()) {
providerRepository.setProvider(
provider,
this::attachEventProvider,
this::emitReady,
this::detachEventProvider,
- this::emitError,
+ this::emitErrorAndThrow,
true);
}
}
@@ -149,14 +150,14 @@ public void setProviderAndWait(FeatureProvider provider) {
* @param clientName The name of the client.
* @param provider The provider to set.
*/
- public void setProviderAndWait(String clientName, FeatureProvider provider) {
+ public void setProviderAndWait(String clientName, FeatureProvider provider) throws OpenFeatureError {
try (AutoCloseableLock __ = lock.writeLockAutoCloseable()) {
providerRepository.setProvider(clientName,
provider,
this::attachEventProvider,
this::emitReady,
this::detachEventProvider,
- this::emitError,
+ this::emitErrorAndThrow,
true);
}
}
@@ -179,9 +180,14 @@ private void detachEventProvider(FeatureProvider provider) {
}
}
- private void emitError(FeatureProvider provider, String message) {
+ private void emitError(FeatureProvider provider, OpenFeatureError exception) {
runHandlersForProvider(provider, ProviderEvent.PROVIDER_ERROR,
- ProviderEventDetails.builder().message(message).build());
+ ProviderEventDetails.builder().message(exception.getMessage()).build());
+ }
+
+ private void emitErrorAndThrow(FeatureProvider provider, OpenFeatureError exception) throws OpenFeatureError {
+ this.emitError(provider, exception);
+ throw exception;
}
/**
diff --git a/src/main/java/dev/openfeature/sdk/ProviderRepository.java b/src/main/java/dev/openfeature/sdk/ProviderRepository.java
index cea835e8..8dee0a6f 100644
--- a/src/main/java/dev/openfeature/sdk/ProviderRepository.java
+++ b/src/main/java/dev/openfeature/sdk/ProviderRepository.java
@@ -15,6 +15,8 @@
import javax.annotation.Nullable;
+import dev.openfeature.sdk.exceptions.GeneralError;
+import dev.openfeature.sdk.exceptions.OpenFeatureError;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -66,7 +68,7 @@ public void setProvider(FeatureProvider provider,
Consumer afterSet,
Consumer afterInit,
Consumer afterShutdown,
- BiConsumer afterError,
+ BiConsumer afterError,
boolean waitForInit) {
if (provider == null) {
throw new IllegalArgumentException("Provider cannot be null");
@@ -83,12 +85,12 @@ public void setProvider(FeatureProvider provider,
* Otherwise, initialization happens in the background.
*/
public void setProvider(String clientName,
- FeatureProvider provider,
- Consumer afterSet,
- Consumer afterInit,
- Consumer afterShutdown,
- BiConsumer afterError,
- boolean waitForInit) {
+ FeatureProvider provider,
+ Consumer afterSet,
+ Consumer afterInit,
+ Consumer afterShutdown,
+ BiConsumer afterError,
+ boolean waitForInit) {
if (provider == null) {
throw new IllegalArgumentException("Provider cannot be null");
}
@@ -103,7 +105,7 @@ private void prepareAndInitializeProvider(@Nullable String clientName,
Consumer afterSet,
Consumer afterInit,
Consumer afterShutdown,
- BiConsumer afterError,
+ BiConsumer afterError,
boolean waitForInit) {
if (!isProviderRegistered(newProvider)) {
@@ -129,7 +131,7 @@ private void prepareAndInitializeProvider(@Nullable String clientName,
private void initializeProvider(FeatureProvider newProvider,
Consumer afterInit,
Consumer afterShutdown,
- BiConsumer afterError,
+ BiConsumer afterError,
FeatureProvider oldProvider) {
try {
if (ProviderState.NOT_READY.equals(newProvider.getState())) {
@@ -137,9 +139,12 @@ private void initializeProvider(FeatureProvider newProvider,
afterInit.accept(newProvider);
}
shutDownOld(oldProvider, afterShutdown);
+ } catch (OpenFeatureError e) {
+ log.error("Exception when initializing feature provider {}", newProvider.getClass().getName(), e);
+ afterError.accept(newProvider, e);
} catch (Exception e) {
log.error("Exception when initializing feature provider {}", newProvider.getClass().getName(), e);
- afterError.accept(newProvider, e.getMessage());
+ afterError.accept(newProvider, new GeneralError(e));
}
}
@@ -163,7 +168,6 @@ private boolean isProviderRegistered(FeatureProvider provider) {
private void shutdownProvider(FeatureProvider provider) {
taskExecutor.submit(() -> {
try {
- // detachProviderEvents(provider);
provider.shutdown();
} catch (Exception e) {
log.error("Exception when shutting down feature provider {}", provider.getClass().getName(), e);
diff --git a/src/main/java/dev/openfeature/sdk/Value.java b/src/main/java/dev/openfeature/sdk/Value.java
index 59e4a9cf..f0fdc8d4 100644
--- a/src/main/java/dev/openfeature/sdk/Value.java
+++ b/src/main/java/dev/openfeature/sdk/Value.java
@@ -266,7 +266,6 @@ public Instant asInstant() {
*
* @return Value
*/
-
@SneakyThrows
@Override
protected Value clone() {
diff --git a/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java b/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java
index f71e9e36..8cd9fc8d 100644
--- a/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java
+++ b/src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java
@@ -52,6 +52,7 @@ public InMemoryProvider(Map> flags) {
* @param evaluationContext evaluation context
* @throws Exception on error
*/
+ @Override
public void initialize(EvaluationContext evaluationContext) throws Exception {
super.initialize(evaluationContext);
state = ProviderState.READY;
diff --git a/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java b/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java
index 52c36dc5..e2e00881 100644
--- a/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java
+++ b/src/test/java/dev/openfeature/sdk/FlagEvaluationSpecTest.java
@@ -8,6 +8,7 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
@@ -18,9 +19,6 @@
import java.util.List;
import java.util.Map;
-import dev.openfeature.sdk.providers.memory.InMemoryProvider;
-import dev.openfeature.sdk.testutils.TestEventsProvider;
-import lombok.SneakyThrows;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -31,8 +29,12 @@
import org.slf4j.Logger;
import dev.openfeature.sdk.exceptions.FlagNotFoundError;
+import dev.openfeature.sdk.exceptions.GeneralError;
import dev.openfeature.sdk.fixtures.HookFixtures;
+import dev.openfeature.sdk.providers.memory.InMemoryProvider;
import dev.openfeature.sdk.testutils.FeatureProviderTestUtils;
+import dev.openfeature.sdk.testutils.TestEventsProvider;
+import lombok.SneakyThrows;
class FlagEvaluationSpecTest implements HookFixtures {
@@ -87,6 +89,17 @@ void getApiInstance() {
assertThat(api.getProvider(providerName).getState()).isEqualTo(ProviderState.READY);
}
+ @SneakyThrows
+ @Specification(number="1.1.8", text="The API SHOULD provide functions to set a provider and wait for the initialize function to return or throw.")
+ @Test void providerAndWaitError() {
+ FeatureProvider provider1 = new TestEventsProvider(500, true, "fake error");
+ assertThrows(GeneralError.class, () -> api.setProviderAndWait(provider1));
+
+ FeatureProvider provider2 = new TestEventsProvider(500, true, "fake error");
+ String providerName = "providerAndWaitError";
+ assertThrows(GeneralError.class, () -> api.setProviderAndWait(providerName, provider2));
+ }
+
@Specification(number="2.4.5", text="The provider SHOULD indicate an error if flag resolution is attempted before the provider is ready.")
@Test void shouldReturnNotReadyIfNotInitialized() {
FeatureProvider provider = new InMemoryProvider(new HashMap<>()) {
diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java
index 3b0e8956..e19a10ae 100644
--- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java
+++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java
@@ -1,16 +1,17 @@
package dev.openfeature.sdk;
-import dev.openfeature.sdk.providers.memory.InMemoryProvider;
-import dev.openfeature.sdk.testutils.FeatureProviderTestUtils;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collections;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.util.Collections;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import dev.openfeature.sdk.providers.memory.InMemoryProvider;
+import dev.openfeature.sdk.testutils.FeatureProviderTestUtils;
+
class OpenFeatureAPITest {
private static final String CLIENT_NAME = "client name";
@@ -45,7 +46,7 @@ void namedProviderOverwrittenTest() {
}
@Test
- void providerToMultipleNames() {
+ void providerToMultipleNames() throws Exception {
FeatureProvider inMemAsEventingProvider = new InMemoryProvider(Collections.EMPTY_MAP);
FeatureProvider noOpAsNonEventingProvider = new NoOpProvider();
diff --git a/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java b/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java
index b78d0afb..20da47ed 100644
--- a/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java
+++ b/src/test/java/dev/openfeature/sdk/ProviderRepositoryTest.java
@@ -9,7 +9,6 @@
import static org.awaitility.Awaitility.await;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.atMostOnce;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -29,6 +28,7 @@
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
+import dev.openfeature.sdk.exceptions.OpenFeatureError;
import dev.openfeature.sdk.testutils.exception.TestException;
class ProviderRepositoryTest {
@@ -253,7 +253,7 @@ void shouldRunLambdasOnSuccessful() {
Consumer afterSet = mock(Consumer.class);
Consumer afterInit = mock(Consumer.class);
Consumer afterShutdown = mock(Consumer.class);
- BiConsumer afterError = mock(BiConsumer.class);
+ BiConsumer afterError = mock(BiConsumer.class);
FeatureProvider oldProvider = providerRepository.getProvider();
FeatureProvider featureProvider1 = createMockedProvider();
@@ -274,7 +274,7 @@ void shouldRunLambdasOnError() throws Exception {
Consumer afterSet = mock(Consumer.class);
Consumer afterInit = mock(Consumer.class);
Consumer afterShutdown = mock(Consumer.class);
- BiConsumer afterError = mock(BiConsumer.class);
+ BiConsumer afterError = mock(BiConsumer.class);
FeatureProvider errorFeatureProvider = createMockedErrorProvider();
@@ -310,7 +310,7 @@ private void setFeatureProvider(FeatureProvider provider) {
private void setFeatureProvider(FeatureProvider provider, Consumer afterSet,
Consumer afterInit, Consumer afterShutdown,
- BiConsumer afterError) {
+ BiConsumer afterError) {
providerRepository.setProvider(provider, afterSet, afterInit, afterShutdown,
afterError, false);
waitForSettingProviderHasBeenCompleted(ProviderRepository::getProvider, provider);
@@ -348,8 +348,8 @@ private Consumer mockAfterShutdown() {
};
}
- private BiConsumer mockAfterError() {
- return (fp, message) -> {
+ private BiConsumer mockAfterError() {
+ return (fp, ex) -> {
};
}
diff --git a/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java b/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java
index af239644..b0e5eb78 100644
--- a/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java
+++ b/src/test/java/dev/openfeature/sdk/testutils/TestEventsProvider.java
@@ -8,6 +8,7 @@
import dev.openfeature.sdk.ProviderEventDetails;
import dev.openfeature.sdk.ProviderState;
import dev.openfeature.sdk.Value;
+import dev.openfeature.sdk.exceptions.GeneralError;
public class TestEventsProvider extends EventProvider {
@@ -63,7 +64,7 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {
Thread.sleep(initTimeoutMs);
if (this.initError) {
this.state = ProviderState.ERROR;
- throw new Exception(initErrorMessage);
+ throw new GeneralError(initErrorMessage);
}
this.state = ProviderState.READY;
}
diff --git a/version.txt b/version.txt
index 661e7aea..10c08801 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-1.7.3
+1.7.4