Skip to content
Merged
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
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ JAVA Server Side SDK is based on Java SE 8 and is available on Maven Central. Yo
<dependency>
<groupId>co.featbit</groupId>
<artifactId>featbit-java-sdk</artifactId>
<version>1.4.4</version>
<version>1.4.5</version>
</dependency>
</dependencies>
```

- Install the SDK using Gradle
```
implementation 'co.featbit:featbit-java-sdk:1.4.4'
implementation 'co.featbit:featbit-java-sdk:1.4.5'
```

### Prerequisite
Expand Down Expand Up @@ -286,6 +286,10 @@ Collection<String> flagKeys = states.getFlagKeys();
// flag evaluations
EvalDetail<String> 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
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>co.featbit</groupId>
<artifactId>featbit-java-sdk</artifactId>
<version>1.4.4</version>
<version>1.4.5</version>

<name>featbit/featbit-java-sdk</name>

Expand Down
25 changes: 18 additions & 7 deletions src/main/java/co/featbit/server/DataModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -168,9 +167,7 @@ Map<DataStorageTypes.Category, Map<String, DataStorageTypes.Item>> 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<String> included;
private final List<String> excluded;
Expand Down Expand Up @@ -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;
Expand All @@ -262,8 +257,7 @@ static class FeatureFlag implements DataStorageTypes.Item, JsonHelper.AfterJsonP
private final List<TargetRule> rules;
private final Fallthrough fallthrough;
private final String disabledVariationId;
@Expose(serialize = false, deserialize = false)
private Map<String, Variation> variationMap;
private transient Map<String, Variation> variationMap;

FeatureFlag(String id, Date updatedAt, boolean isArchived, boolean exptIncludeAllTargets, boolean isEnabled, String name, String key, String variationType, List<Variation> variations, List<TargetUser> targetUsers, List<TargetRule> rules, Fallthrough fallthrough, String disabledVariationId) {
this.id = id;
Expand Down Expand Up @@ -536,5 +530,22 @@ public String getDispatchKey() {
}
}

static class DataExposer {
private final List<FeatureFlag> featureFlags;
private final List<Segment> segments;

public DataExposer(List<FeatureFlag> featureFlags, List<Segment> segments) {
this.featureFlags = featureFlags;
this.segments = segments;
}

public List<FeatureFlag> getFeatureFlags() {
return featureFlags;
}

public List<Segment> getSegments() {
return segments;
}
}

}
14 changes: 14 additions & 0 deletions src/main/java/co/featbit/server/FBClientImp.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -404,4 +406,16 @@ public void trackMetrics(FBUser user, Map<String, Double> metrics) {
insightProcessor.send(event);
}

public String getAllDataAsJson() {
try {
List<DataModel.FeatureFlag> allFlags = this.storage.getAll(DataStorageTypes.FEATURES).values().stream().map(v -> (DataModel.FeatureFlag) v).collect(Collectors.toList());
List<DataModel.Segment> 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;
}

}
7 changes: 7 additions & 0 deletions src/main/java/co/featbit/server/exterior/FBClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -262,4 +262,11 @@ public interface FBClient extends Closeable {
* @param metrics event name and numeric value in K/V
*/
void trackMetrics(FBUser user, Map<String, Double> metrics);

/**
* Get all data as a json string
*
* @return all data as json string
*/
String getAllDataAsJson();
}