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"));