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();
}