Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion openfeature-provider-local/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>


<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.spotify.confidence;

import javax.annotation.Nonnull;

/**
* Functional interface for providing AccountState instances.
*
Expand All @@ -19,5 +21,6 @@ public interface AccountStateProvider {
* @return the AccountState protobuf containing flag configurations and metadata
* @throws RuntimeException if the AccountState cannot be provided
*/
@Nonnull
byte[] provide();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.spotify.confidence;

import javax.annotation.Nonnull;

/**
* API credentials for authenticating with the Confidence service.
*
Expand All @@ -10,4 +12,4 @@
* @param clientSecret the client secret for your Confidence application
* @since 0.2.4
*/
public record ApiSecret(String clientId, String clientSecret) {}
public record ApiSecret(@Nonnull String clientId, @Nonnull String clientSecret) {}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

import java.util.Map;
import java.util.Optional;
import javax.annotation.Nonnull;

public record MaterializationInfo(
boolean isUnitInMaterialization, Map<String, String> ruleToVariant) {
boolean isUnitInMaterialization, @Nonnull Map<String, String> ruleToVariant) {
public Optional<String> getVariantForRule(String rule) {
return Optional.ofNullable(ruleToVariant.get(rule));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import javax.annotation.Nonnull;

public non-sealed interface MaterializationRepository extends StickyResolveStrategy {
@Nonnull
CompletableFuture<Map<String, MaterializationInfo>> loadMaterializedAssignmentsForUnit(
String unit, String materialization);
@Nonnull String unit, @Nonnull String materialization);

@Nonnull
CompletableFuture<Void> storeAssignment(
String unit, Map<String, MaterializationInfo> assignments);
@Nonnull String unit, Map<String, MaterializationInfo> assignments);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.grpc.StatusRuntimeException;
import java.util.concurrent.ExecutionException;
import java.util.function.Function;
import javax.annotation.Nonnull;
import org.slf4j.Logger;

/**
Expand Down Expand Up @@ -89,7 +90,8 @@ public class OpenFeatureLocalResolveProvider implements FeatureProvider {
* configuration
* @since 0.2.4
*/
public OpenFeatureLocalResolveProvider(ApiSecret apiSecret, String clientSecret) {
public OpenFeatureLocalResolveProvider(
@Nonnull ApiSecret apiSecret, @Nonnull String clientSecret) {
this(apiSecret, clientSecret, new RemoteResolverFallback(), new NoRetryStrategy());
}

Expand All @@ -110,7 +112,9 @@ public OpenFeatureLocalResolveProvider(ApiSecret apiSecret, String clientSecret)
* @since 0.2.4
*/
public OpenFeatureLocalResolveProvider(
ApiSecret apiSecret, String clientSecret, StickyResolveStrategy stickyResolveStrategy) {
@Nonnull ApiSecret apiSecret,
@Nonnull String clientSecret,
@Nonnull StickyResolveStrategy stickyResolveStrategy) {
this(apiSecret, clientSecret, stickyResolveStrategy, new NoRetryStrategy());
}

Expand All @@ -133,10 +137,10 @@ public OpenFeatureLocalResolveProvider(
* @since 0.2.4
*/
public OpenFeatureLocalResolveProvider(
ApiSecret apiSecret,
String clientSecret,
StickyResolveStrategy stickyResolveStrategy,
RetryStrategy retryStrategy) {
@Nonnull ApiSecret apiSecret,
@Nonnull String clientSecret,
@Nonnull StickyResolveStrategy stickyResolveStrategy,
@Nonnull RetryStrategy retryStrategy) {
final var env = System.getenv("LOCAL_RESOLVE_MODE");
if (env != null && env.equals("WASM")) {
this.flagResolverService =
Expand Down Expand Up @@ -166,10 +170,10 @@ public OpenFeatureLocalResolveProvider(
*/
@VisibleForTesting
public OpenFeatureLocalResolveProvider(
AccountStateProvider accountStateProvider,
String accountId,
String clientSecret,
StickyResolveStrategy stickyResolveStrategy) {
@Nonnull AccountStateProvider accountStateProvider,
@Nonnull String accountId,
@Nonnull String clientSecret,
@Nonnull StickyResolveStrategy stickyResolveStrategy) {
this(
accountStateProvider,
accountId,
Expand All @@ -191,11 +195,11 @@ public OpenFeatureLocalResolveProvider(
*/
@VisibleForTesting
public OpenFeatureLocalResolveProvider(
AccountStateProvider accountStateProvider,
String accountId,
String clientSecret,
StickyResolveStrategy stickyResolveStrategy,
RetryStrategy retryStrategy) {
@Nonnull AccountStateProvider accountStateProvider,
@Nonnull String accountId,
@Nonnull String clientSecret,
@Nonnull StickyResolveStrategy stickyResolveStrategy,
@Nonnull RetryStrategy retryStrategy) {
this.stickyResolveStrategy = stickyResolveStrategy;
this.clientSecret = clientSecret;
this.flagResolverService =
Expand Down
7 changes: 6 additions & 1 deletion openfeature-provider/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,12 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>


<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.function.Function;
import javax.annotation.Nonnull;
import org.slf4j.Logger;

/** OpenFeature Provider for feature flagging with the Confidence platform */
Expand All @@ -33,7 +34,7 @@ public class ConfidenceFeatureProvider implements FeatureProvider {
*
* @param confidenceBuilder a Confidence.Builder
*/
public ConfidenceFeatureProvider(Confidence.Builder confidenceBuilder) {
public ConfidenceFeatureProvider(@Nonnull Confidence.Builder confidenceBuilder) {
this.confidence = confidenceBuilder.buildForProvider();
}

Expand All @@ -45,7 +46,7 @@ public ConfidenceFeatureProvider(Confidence.Builder confidenceBuilder) {
* #ConfidenceFeatureProvider(Confidence.Builder)} instead.
*/
@Deprecated()
public ConfidenceFeatureProvider(Confidence confidence) {
public ConfidenceFeatureProvider(@Nonnull Confidence confidence) {
this.confidence = confidence;
}

Expand All @@ -61,7 +62,8 @@ public ConfidenceFeatureProvider(Confidence confidence) {
* #ConfidenceFeatureProvider(Confidence.Builder)} instead.
*/
@Deprecated()
public ConfidenceFeatureProvider(String clientSecret, ManagedChannel managedChannel) {
public ConfidenceFeatureProvider(
@Nonnull String clientSecret, @Nonnull ManagedChannel managedChannel) {
this(Confidence.builder(clientSecret).flagResolverManagedChannel(managedChannel));
}

Expand All @@ -73,7 +75,7 @@ public ConfidenceFeatureProvider(String clientSecret, ManagedChannel managedChan
* #ConfidenceFeatureProvider(Confidence.Builder)} instead.
*/
@Deprecated()
public ConfidenceFeatureProvider(String clientSecret) {
public ConfidenceFeatureProvider(@Nonnull String clientSecret) {
this(clientSecret, ManagedChannelBuilder.forAddress("edge-grpc.spotify.com", 443).build());
}

Expand All @@ -88,7 +90,7 @@ public ConfidenceFeatureProvider(String clientSecret) {
* #ConfidenceFeatureProvider(Confidence.Builder)} instead.
*/
@Deprecated()
public ConfidenceFeatureProvider(String clientSecret, String host, int port) {
public ConfidenceFeatureProvider(@Nonnull String clientSecret, @Nonnull String host, int port) {
this(clientSecret, ManagedChannelBuilder.forAddress(host, port).usePlaintext().build());
}

Expand Down
16 changes: 10 additions & 6 deletions sdk-java/src/main/java/com/spotify/confidence/Contextual.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.common.annotations.Beta;
import java.util.Map;
import javax.annotation.Nonnull;

/**
* Interface for managing contextual data in Confidence SDK. Provides methods to set, update, and
Expand All @@ -14,21 +15,22 @@ public interface Contextual {
*
* @return The current context as a {@link ConfidenceValue.Struct}
*/
@Nonnull
ConfidenceValue.Struct getContext();

/**
* Sets the context data using a ConfidenceValue.Struct.
*
* @param context The new context data to set
*/
void setContext(ConfidenceValue.Struct context);
void setContext(@Nonnull ConfidenceValue.Struct context);

/**
* Sets the context data using a Map of key-value pairs.
*
* @param context Map of context key-value pairs
*/
default void setContext(Map<String, ConfidenceValue> context) {
default void setContext(@Nonnull Map<String, ConfidenceValue> context) {
setContext(ConfidenceValue.Struct.of(context));
}

Expand All @@ -38,14 +40,14 @@ default void setContext(Map<String, ConfidenceValue> context) {
* @param key The key to update
* @param value The new value for the key
*/
void updateContextEntry(String key, ConfidenceValue value);
void updateContextEntry(@Nonnull String key, @Nonnull ConfidenceValue value);

/**
* Removes a single entry from the context data.
*
* @param key The key to remove
*/
void removeContextEntry(String key);
void removeContextEntry(@Nonnull String key);

/** Clears all context data. */
void clearContext();
Expand All @@ -56,15 +58,17 @@ default void setContext(Map<String, ConfidenceValue> context) {
* @param context The new context to set
* @return A new instance with the specified context
*/
Contextual withContext(ConfidenceValue.Struct context);
@Nonnull
Contextual withContext(@Nonnull ConfidenceValue.Struct context);

/**
* Creates a new instance with the specified context map.
*
* @param context Map of context key-value pairs
* @return A new instance with the specified context
*/
default Contextual withContext(Map<String, ConfidenceValue> context) {
@Nonnull
default Contextual withContext(@Nonnull Map<String, ConfidenceValue> context) {
return withContext(ConfidenceValue.Struct.of(context));
}
}
11 changes: 7 additions & 4 deletions sdk-java/src/main/java/com/spotify/confidence/EventSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.common.annotations.Beta;
import java.util.Map;
import javax.annotation.Nonnull;

/**
* Interface for sending events to Confidence with context. Extends {@link Contextual} to provide
Expand All @@ -15,14 +16,14 @@ public interface EventSender extends Contextual {
* @param eventName The name of the event to track
* @param data The data associated with the event
*/
public void track(String eventName, ConfidenceValue.Struct data);
public void track(@Nonnull String eventName, @Nonnull ConfidenceValue.Struct data);

/**
* Tracks an event without associated data.
*
* @param eventName The name of the event to track
*/
public void track(String eventName);
public void track(@Nonnull String eventName);

/** Flushes any pending events to ensure they are sent. */
void flush();
Expand All @@ -33,17 +34,19 @@ public interface EventSender extends Contextual {
* @param context The new context to set
* @return A new instance with the specified context
*/
@Nonnull
@Override
EventSender withContext(ConfidenceValue.Struct context);
EventSender withContext(@Nonnull ConfidenceValue.Struct context);

/**
* Creates a new instance with the specified context map.
*
* @param context Map of context key-value pairs
* @return A new instance with the specified context
*/
@Nonnull
@Override
default EventSender withContext(Map<String, ConfidenceValue> context) {
default EventSender withContext(@Nonnull Map<String, ConfidenceValue> context) {
return withContext(ConfidenceValue.Struct.of(context));
}
}
13 changes: 9 additions & 4 deletions sdk-java/src/main/java/com/spotify/confidence/FlagEvaluator.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.spotify.confidence;

import java.util.Map;
import javax.annotation.Nonnull;

/**
* Interface for evaluating feature flags with context. Extends {@link Contextual} to provide
Expand All @@ -15,7 +16,8 @@ public interface FlagEvaluator extends Contextual {
* @param <T> The type of the flag value
* @return The evaluated flag value or the default value if evaluation fails
*/
<T> T getValue(String key, T defaultValue);
@Nonnull
<T> T getValue(@Nonnull String key, @Nonnull T defaultValue);

/**
* Gets a detailed evaluation of a feature flag for the current context.
Expand All @@ -25,25 +27,28 @@ public interface FlagEvaluator extends Contextual {
* @param <T> The type of the flag value
* @return A {@link FlagEvaluation} containing the evaluated value and evaluation details
*/
<T> FlagEvaluation<T> getEvaluation(String key, T defaultValue);
@Nonnull
<T> FlagEvaluation<T> getEvaluation(@Nonnull String key, @Nonnull T defaultValue);

/**
* Creates a new instance with the specified context.
*
* @param context The new context to set
* @return A new instance with the specified context
*/
@Nonnull
@Override
FlagEvaluator withContext(ConfidenceValue.Struct context);
FlagEvaluator withContext(@Nonnull ConfidenceValue.Struct context);

/**
* Creates a new instance with the specified context map.
*
* @param context Map of context key-value pairs
* @return A new instance with the specified context
*/
@Nonnull
@Override
default FlagEvaluator withContext(Map<String, ConfidenceValue> context) {
default FlagEvaluator withContext(@Nonnull Map<String, ConfidenceValue> context) {
return withContext(ConfidenceValue.Struct.of(context));
}
}