diff --git a/README.md b/README.md index 6ebf59d..a27296a 100644 --- a/README.md +++ b/README.md @@ -31,14 +31,14 @@ JAVA Server Side SDK is based on Java SE 8 and is available on Maven Central. Yo co.featbit featbit-java-sdk - 1.4.4 + 1.4.5 ``` - Install the SDK using Gradle ``` -implementation 'co.featbit:featbit-java-sdk:1.4.4' +implementation 'co.featbit:featbit-java-sdk:1.4.5' ``` ### Prerequisite @@ -286,6 +286,10 @@ Collection flagKeys = states.getFlagKeys(); // flag evaluations EvalDetail detail = states.getStringDetail("flag key", user, "Not Found"); String value = states.getString("flag key", user, "Not Found"); + +// get all flags/segments as json string +String json = client.getAllDataAsJson(); + ``` > If evaluation called before Java SDK client initialized, you set the wrong flag key/user for the evaluation or the related feature flag diff --git a/pom.xml b/pom.xml index 8489229..df27383 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ co.featbit featbit-java-sdk - 1.4.4 + 1.4.5 featbit/featbit-java-sdk diff --git a/src/main/java/co/featbit/server/DataModel.java b/src/main/java/co/featbit/server/DataModel.java index d5ec4f4..a3498fd 100644 --- a/src/main/java/co/featbit/server/DataModel.java +++ b/src/main/java/co/featbit/server/DataModel.java @@ -4,7 +4,6 @@ import co.featbit.server.exterior.DataStorageTypes; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; -import com.google.gson.annotations.Expose; import com.google.gson.annotations.JsonAdapter; import com.google.gson.reflect.TypeToken; import org.apache.commons.lang3.StringUtils; @@ -168,9 +167,7 @@ Map> toStorageType static class Segment implements DataStorageTypes.Item, JsonHelper.AfterJsonParseDeserializable { private final String id; private final Boolean isArchived; - @Expose(serialize = false) final Date updatedAt; - @Expose(deserialize = false) private Long timestamp; private final List included; private final List excluded; @@ -247,9 +244,7 @@ public int compareTo(@NotNull DataStorageTypes.Item o) { @JsonAdapter(JsonHelper.AfterJsonParseDeserializableTypeAdapterFactory.class) static class FeatureFlag implements DataStorageTypes.Item, JsonHelper.AfterJsonParseDeserializable { final String id; - @Expose(serialize = false) final Date updatedAt; - @Expose(deserialize = false) private Long timestamp; private final boolean isArchived; private final boolean exptIncludeAllTargets; @@ -262,8 +257,7 @@ static class FeatureFlag implements DataStorageTypes.Item, JsonHelper.AfterJsonP private final List rules; private final Fallthrough fallthrough; private final String disabledVariationId; - @Expose(serialize = false, deserialize = false) - private Map variationMap; + private transient Map variationMap; FeatureFlag(String id, Date updatedAt, boolean isArchived, boolean exptIncludeAllTargets, boolean isEnabled, String name, String key, String variationType, List variations, List targetUsers, List rules, Fallthrough fallthrough, String disabledVariationId) { this.id = id; @@ -536,5 +530,22 @@ public String getDispatchKey() { } } + static class DataExposer { + private final List featureFlags; + private final List segments; + + public DataExposer(List featureFlags, List segments) { + this.featureFlags = featureFlags; + this.segments = segments; + } + + public List getFeatureFlags() { + return featureFlags; + } + + public List getSegments() { + return segments; + } + } } diff --git a/src/main/java/co/featbit/server/FBClientImp.java b/src/main/java/co/featbit/server/FBClientImp.java index 57785e5..8ae59cd 100644 --- a/src/main/java/co/featbit/server/FBClientImp.java +++ b/src/main/java/co/featbit/server/FBClientImp.java @@ -12,9 +12,11 @@ import java.io.IOException; import java.time.Duration; +import java.util.List; import java.util.Map; import java.util.concurrent.*; import java.util.function.Consumer; +import java.util.stream.Collectors; import static co.featbit.server.Evaluator.*; import static com.google.common.base.Preconditions.checkArgument; @@ -404,4 +406,16 @@ public void trackMetrics(FBUser user, Map metrics) { insightProcessor.send(event); } + public String getAllDataAsJson() { + try { + List allFlags = this.storage.getAll(DataStorageTypes.FEATURES).values().stream().map(v -> (DataModel.FeatureFlag) v).collect(Collectors.toList()); + List allSegments = this.storage.getAll(DataStorageTypes.SEGMENTS).values().stream().map(v -> (DataModel.Segment) v).collect(Collectors.toList()); + DataModel.DataExposer allData = new DataModel.DataExposer(allFlags, allSegments); + return JsonHelper.serialize(allData); + } catch (Exception ex) { + logger.error("FB JAVA SDK: unexpected error in getAllDataAsJson", ex); + } + return null; + } + } diff --git a/src/main/java/co/featbit/server/exterior/FBClient.java b/src/main/java/co/featbit/server/exterior/FBClient.java index 99b0955..b452d0b 100644 --- a/src/main/java/co/featbit/server/exterior/FBClient.java +++ b/src/main/java/co/featbit/server/exterior/FBClient.java @@ -262,4 +262,11 @@ public interface FBClient extends Closeable { * @param metrics event name and numeric value in K/V */ void trackMetrics(FBUser user, Map metrics); + + /** + * Get all data as a json string + * + * @return all data as json string + */ + String getAllDataAsJson(); }