diff --git a/pom.xml b/pom.xml
index f6869c87..567c1e90 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,13 @@
provided
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.7.1
+
+
org.slf4j
slf4j-api
@@ -132,6 +139,7 @@
+
org.apache.maven.plugins
maven-failsafe-plugin
@@ -263,6 +271,54 @@
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ 3.13.0
+
+
+ run-pmd
+ verify
+
+ check
+
+
+
+
+
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.7.0.0
+
+ spotbugs-exclusions.xml
+
+
+ com.h3xstream.findsecbugs
+ findsecbugs-plugin
+ 1.12.0
+
+
+
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.7.1
+
+
+
+
+ run-spotbugs
+ verify
+
+ check
+
+
+
+
+
diff --git a/spotbugs-exclusions.xml b/spotbugs-exclusions.xml
new file mode 100644
index 00000000..59e92ca8
--- /dev/null
+++ b/spotbugs-exclusions.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/lombok.config b/src/lombok.config
index 8ef1593f..ec3b0568 100644
--- a/src/lombok.config
+++ b/src/lombok.config
@@ -1,2 +1,2 @@
lombok.addLombokGeneratedAnnotation = true
-
+lombok.extern.findbugs.addSuppressFBWarnings = true
diff --git a/src/main/java/dev/openfeature/javasdk/EvaluationContext.java b/src/main/java/dev/openfeature/javasdk/EvaluationContext.java
index 3b926e9d..6dd9a597 100644
--- a/src/main/java/dev/openfeature/javasdk/EvaluationContext.java
+++ b/src/main/java/dev/openfeature/javasdk/EvaluationContext.java
@@ -12,7 +12,7 @@ import java.util.Map;
@SuppressWarnings("PMD.BeanMembersShouldSerialize")
public class EvaluationContext {
@Setter @Getter private String targetingKey;
- private final Map> attributes;
+ private final Map> attributes;
public EvaluationContext() {
this.targetingKey = "";
diff --git a/src/main/java/dev/openfeature/javasdk/Metadata.java b/src/main/java/dev/openfeature/javasdk/Metadata.java
index d1c291fd..df1251f5 100644
--- a/src/main/java/dev/openfeature/javasdk/Metadata.java
+++ b/src/main/java/dev/openfeature/javasdk/Metadata.java
@@ -4,5 +4,5 @@ package dev.openfeature.javasdk;
* Holds identifying information about a given entity
*/
public interface Metadata {
- public String getName();
+ String getName();
}
diff --git a/src/main/java/dev/openfeature/javasdk/NoOpProvider.java b/src/main/java/dev/openfeature/javasdk/NoOpProvider.java
index 233114d0..ac90fec9 100644
--- a/src/main/java/dev/openfeature/javasdk/NoOpProvider.java
+++ b/src/main/java/dev/openfeature/javasdk/NoOpProvider.java
@@ -9,12 +9,6 @@ public class NoOpProvider implements FeatureProvider {
public static final String PASSED_IN_DEFAULT = "Passed in default";
@Getter
private final String name = "No-op Provider";
- private EvaluationContext ctx;
-
- public EvaluationContext getMergedContext() {
- return ctx;
- }
-
@Override
public Metadata getMetadata() {
return new Metadata() {
@@ -27,7 +21,6 @@ public class NoOpProvider implements FeatureProvider {
@Override
public ProviderEvaluation getBooleanEvaluation(String key, Boolean defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
- this.ctx = ctx;
return ProviderEvaluation.builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
@@ -37,7 +30,6 @@ public class NoOpProvider implements FeatureProvider {
@Override
public ProviderEvaluation getStringEvaluation(String key, String defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
- this.ctx = ctx;
return ProviderEvaluation.builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
@@ -47,7 +39,6 @@ public class NoOpProvider implements FeatureProvider {
@Override
public ProviderEvaluation getIntegerEvaluation(String key, Integer defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
- this.ctx = ctx;
return ProviderEvaluation.builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
@@ -56,7 +47,6 @@ public class NoOpProvider implements FeatureProvider {
}
@Override
public ProviderEvaluation getDoubleEvaluation(String key, Double defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
- this.ctx = ctx;
return ProviderEvaluation.builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
@@ -65,7 +55,6 @@ public class NoOpProvider implements FeatureProvider {
}
@Override
public ProviderEvaluation getObjectEvaluation(String key, T defaultValue, EvaluationContext invocationContext, FlagEvaluationOptions options) {
- this.ctx = ctx;
return ProviderEvaluation.builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
diff --git a/src/main/java/dev/openfeature/javasdk/exceptions/FlagNotFoundError.java b/src/main/java/dev/openfeature/javasdk/exceptions/FlagNotFoundError.java
index 0ad00e78..6aa2d7ed 100644
--- a/src/main/java/dev/openfeature/javasdk/exceptions/FlagNotFoundError.java
+++ b/src/main/java/dev/openfeature/javasdk/exceptions/FlagNotFoundError.java
@@ -6,6 +6,6 @@ import lombok.experimental.StandardException;
@StandardException
public class FlagNotFoundError extends OpenFeatureError {
- private static long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
@Getter private final ErrorCode errorCode = ErrorCode.GENERAL;
}
diff --git a/src/main/java/dev/openfeature/javasdk/exceptions/GeneralError.java b/src/main/java/dev/openfeature/javasdk/exceptions/GeneralError.java
index e5180a60..2aaaa7ab 100644
--- a/src/main/java/dev/openfeature/javasdk/exceptions/GeneralError.java
+++ b/src/main/java/dev/openfeature/javasdk/exceptions/GeneralError.java
@@ -6,6 +6,6 @@ import lombok.experimental.StandardException;
@StandardException
public class GeneralError extends OpenFeatureError{
- private static long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
@Getter private final ErrorCode errorCode = ErrorCode.GENERAL;
}
diff --git a/src/main/java/dev/openfeature/javasdk/exceptions/OpenFeatureError.java b/src/main/java/dev/openfeature/javasdk/exceptions/OpenFeatureError.java
index eb377a5b..bb07ca78 100644
--- a/src/main/java/dev/openfeature/javasdk/exceptions/OpenFeatureError.java
+++ b/src/main/java/dev/openfeature/javasdk/exceptions/OpenFeatureError.java
@@ -5,6 +5,6 @@ import lombok.experimental.StandardException;
@StandardException
public abstract class OpenFeatureError extends RuntimeException {
- private static long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
public abstract ErrorCode getErrorCode();
}
diff --git a/src/main/java/dev/openfeature/javasdk/exceptions/ParseError.java b/src/main/java/dev/openfeature/javasdk/exceptions/ParseError.java
index a6db1a6f..63b3f364 100644
--- a/src/main/java/dev/openfeature/javasdk/exceptions/ParseError.java
+++ b/src/main/java/dev/openfeature/javasdk/exceptions/ParseError.java
@@ -6,7 +6,7 @@ import lombok.experimental.StandardException;
@StandardException
public class ParseError extends OpenFeatureError {
- private static long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
@Getter private final ErrorCode errorCode = ErrorCode.PARSE_ERROR;
diff --git a/src/main/java/dev/openfeature/javasdk/exceptions/TypeMismatchError.java b/src/main/java/dev/openfeature/javasdk/exceptions/TypeMismatchError.java
index 7375fb7c..4055a691 100644
--- a/src/main/java/dev/openfeature/javasdk/exceptions/TypeMismatchError.java
+++ b/src/main/java/dev/openfeature/javasdk/exceptions/TypeMismatchError.java
@@ -6,7 +6,7 @@ import lombok.experimental.StandardException;
@StandardException
public class TypeMismatchError extends OpenFeatureError {
- private static long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
@Getter private final ErrorCode errorCode = ErrorCode.TYPE_MISMATCH;
diff --git a/src/test/java/dev/openfeature/javasdk/DoSomethingProvider.java b/src/test/java/dev/openfeature/javasdk/DoSomethingProvider.java
index dd6f8026..7bc85b85 100644
--- a/src/test/java/dev/openfeature/javasdk/DoSomethingProvider.java
+++ b/src/test/java/dev/openfeature/javasdk/DoSomethingProvider.java
@@ -2,6 +2,12 @@ package dev.openfeature.javasdk;
public class DoSomethingProvider implements FeatureProvider {
+ private EvaluationContext savedContext;
+
+ public EvaluationContext getMergedContext() {
+ return savedContext;
+ }
+
@Override
public Metadata getMetadata() {
return () -> "test";
@@ -9,6 +15,7 @@ public class DoSomethingProvider implements FeatureProvider {
@Override
public ProviderEvaluation getBooleanEvaluation(String key, Boolean defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
+ savedContext = ctx;
return ProviderEvaluation.builder()
.value(!defaultValue).build();
}
@@ -22,6 +29,7 @@ public class DoSomethingProvider implements FeatureProvider {
@Override
public ProviderEvaluation getIntegerEvaluation(String key, Integer defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
+ savedContext = ctx;
return ProviderEvaluation.builder()
.value(defaultValue * 100)
.build();
@@ -29,6 +37,7 @@ public class DoSomethingProvider implements FeatureProvider {
@Override
public ProviderEvaluation getDoubleEvaluation(String key, Double defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
+ savedContext = ctx;
return ProviderEvaluation.builder()
.value(defaultValue * 100)
.build();
@@ -36,6 +45,7 @@ public class DoSomethingProvider implements FeatureProvider {
@Override
public ProviderEvaluation getObjectEvaluation(String key, T defaultValue, EvaluationContext invocationContext, FlagEvaluationOptions options) {
+ savedContext = invocationContext;
return ProviderEvaluation.builder()
.value(null)
.build();
diff --git a/src/test/java/dev/openfeature/javasdk/FlagEvaluationSpecTest.java b/src/test/java/dev/openfeature/javasdk/FlagEvaluationSpecTest.java
index 67a8eaa5..15a89a1a 100644
--- a/src/test/java/dev/openfeature/javasdk/FlagEvaluationSpecTest.java
+++ b/src/test/java/dev/openfeature/javasdk/FlagEvaluationSpecTest.java
@@ -218,7 +218,7 @@ class FlagEvaluationSpecTest implements HookFixtures {
@Specification(number="3.2.2", text="Evaluation context MUST be merged in the order: API (global) - client - invocation, with duplicate values being overwritten.")
@Test void multi_layer_context_merges_correctly() {
OpenFeatureAPI api = OpenFeatureAPI.getInstance();
- NoOpProvider provider = new NoOpProvider();
+ DoSomethingProvider provider = new DoSomethingProvider();
api.setProvider(provider);
EvaluationContext apiCtx = new EvaluationContext();
@@ -238,7 +238,8 @@ class FlagEvaluationSpecTest implements HookFixtures {
clientCtx.addStringAttribute("common", "5");
clientCtx.addStringAttribute("invocation", "6");
- assertFalse(c.getBooleanValue("key", false, invocationCtx));
+ // dosomethingprovider inverts this value.
+ assertTrue(c.getBooleanValue("key", false, invocationCtx));
EvaluationContext merged = provider.getMergedContext();
assertEquals("6", merged.getStringAttribute("invocation"));