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
71 changes: 0 additions & 71 deletions core-api/src/main/java/com/optimizely/ab/config/Layer.java

This file was deleted.

33 changes: 25 additions & 8 deletions core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public String toString() {
private final List<FeatureFlag> featureFlags;
private final List<Group> groups;
private final List<LiveVariable> liveVariables;
private final List<Rollout> rollouts;

// key to entity mappings
private final Map<String, Attribute> attributeKeyMapping;
Expand Down Expand Up @@ -108,7 +109,8 @@ public ProjectConfig(String accountId, String projectId, String version, String
experiments,
null,
groups,
liveVariables
liveVariables,
null
);
}

Expand All @@ -124,7 +126,8 @@ public ProjectConfig(String accountId,
List<Experiment> experiments,
List<FeatureFlag> featureFlags,
List<Group> groups,
List<LiveVariable> liveVariables) {
List<LiveVariable> liveVariables,
List<Rollout> rollouts) {

this.accountId = accountId;
this.projectId = projectId;
Expand All @@ -141,6 +144,12 @@ public ProjectConfig(String accountId,
else {
this.featureFlags = Collections.unmodifiableList(featureFlags);
}
if (rollouts == null) {
this.rollouts = Collections.emptyList();
}
else {
this.rollouts = Collections.unmodifiableList(rollouts);
}

this.groups = Collections.unmodifiableList(groups);

Expand Down Expand Up @@ -243,6 +252,10 @@ public List<FeatureFlag> getFeatureFlags() {
return featureFlags;
}

public List<Rollout> getRollouts() {
return rollouts;
}

public List<Attribute> getAttributes() {
return attributes;
}
Expand Down Expand Up @@ -312,22 +325,26 @@ public String toString() {
", projectId='" + projectId + '\'' +
", revision='" + revision + '\'' +
", version='" + version + '\'' +
", anonymizeIP='" + anonymizeIP + '\'' +
", groups=" + groups +
", experiments=" + experiments +
", anonymizeIP=" + anonymizeIP +
", attributes=" + attributes +
", events=" + events +
", audiences=" + audiences +
", events=" + events +
", experiments=" + experiments +
", featureFlags=" + featureFlags +
", groups=" + groups +
", liveVariables=" + liveVariables +
", experimentKeyMapping=" + experimentKeyMapping +
", rollouts=" + rollouts +
", attributeKeyMapping=" + attributeKeyMapping +
", liveVariableKeyMapping=" + liveVariableKeyMapping +
", eventNameMapping=" + eventNameMapping +
", experimentKeyMapping=" + experimentKeyMapping +
", featureKeyMapping=" + featureKeyMapping +
", liveVariableKeyMapping=" + liveVariableKeyMapping +
", audienceIdMapping=" + audienceIdMapping +
", experimentIdMapping=" + experimentIdMapping +
", groupIdMapping=" + groupIdMapping +
", liveVariableIdToExperimentsMapping=" + liveVariableIdToExperimentsMapping +
", variationToLiveVariableUsageInstanceMapping=" + variationToLiveVariableUsageInstanceMapping +
", variationIdToExperimentMapping=" + variationIdToExperimentMapping +
'}';
}
}
29 changes: 23 additions & 6 deletions core-api/src/main/java/com/optimizely/ab/config/Rollout.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
*/
package com.optimizely.ab.config;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.annotation.concurrent.Immutable;
import java.util.List;

Expand All @@ -25,19 +29,32 @@
* @see <a href="http://developers.optimizely.com/server/reference/index.html#json">Project JSON</a>
*/
@Immutable
public class Rollout extends Layer implements IdMapped {
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rollout implements IdMapped {

private final String id;
private final List<Experiment> experiments;

@JsonCreator
public Rollout(@JsonProperty("id") String id,
@JsonProperty("experiments") List<Experiment> experiments) {
this.id = id;
this.experiments = experiments;
}

@Override
public String getId() {
return id;
}

public Rollout(String id,
String policy,
List<Experiment> experiments) {
super(id, policy, experiments);
public List<Experiment> getExperiments() {
return experiments;
}

@Override
public String toString() {
return "Rollout{" +
"id='" + id + '\'' +
", policy='" + policy + '\'' +
", experiments=" + experiments +
'}';
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.optimizely.ab.config.LiveVariable.VariableType;
import com.optimizely.ab.config.LiveVariableUsageInstance;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.Rollout;
import com.optimizely.ab.config.TrafficAllocation;
import com.optimizely.ab.config.Variation;
import com.optimizely.ab.config.audience.AndCondition;
Expand Down Expand Up @@ -79,8 +80,10 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
}

List<FeatureFlag> featureFlags = null;
List<Rollout> rollouts = null;
if (datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())) {
featureFlags = parseFeatureFlags(rootObject.getJSONArray("featureFlags"));
rollouts = parseRollouts(rootObject.getJSONArray("rollouts"));
}

return new ProjectConfig(
Expand All @@ -95,7 +98,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
experiments,
featureFlags,
groups,
liveVariables
liveVariables,
rollouts
);
} catch (Exception e) {
throw new ConfigParseException("Unable to parse datafile: " + json, e);
Expand Down Expand Up @@ -344,4 +348,18 @@ private List<LiveVariableUsageInstance> parseLiveVariableInstances(JSONArray liv

return liveVariableUsageInstances;
}

private List<Rollout> parseRollouts(JSONArray rolloutsJson) {
List<Rollout> rollouts = new ArrayList<Rollout>(rolloutsJson.length());

for (Object obj : rolloutsJson) {
JSONObject rolloutObject = (JSONObject) obj;
String id = rolloutObject.getString("id");
List<Experiment> experiments = parseExperiments(rolloutObject.getJSONArray("experiments"));

rollouts.add(new Rollout(id, experiments));
}

return rollouts;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.optimizely.ab.config.LiveVariable.VariableType;
import com.optimizely.ab.config.LiveVariableUsageInstance;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.Rollout;
import com.optimizely.ab.config.TrafficAllocation;
import com.optimizely.ab.config.Variation;
import com.optimizely.ab.config.audience.AndCondition;
Expand Down Expand Up @@ -81,8 +82,10 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
}

List<FeatureFlag> featureFlags = null;
List<Rollout> rollouts = null;
if (datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())) {
featureFlags = parseFeatureFlags((JSONArray) rootObject.get("featureFlags"));
rollouts = parseRollouts((JSONArray) rootObject.get("rollouts"));
}

return new ProjectConfig(
Expand All @@ -97,7 +100,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
experiments,
featureFlags,
groups,
liveVariables
liveVariables,
rollouts
);
} catch (Exception e) {
throw new ConfigParseException("Unable to parse datafile: " + json, e);
Expand Down Expand Up @@ -348,5 +352,19 @@ private List<LiveVariableUsageInstance> parseLiveVariableInstances(JSONArray liv

return liveVariableUsageInstances;
}

private List<Rollout> parseRollouts(JSONArray rolloutsJson) {
List<Rollout> rollouts = new ArrayList<Rollout>(rolloutsJson.size());

for (Object obj : rolloutsJson) {
JSONObject rolloutObject = (JSONObject) obj;
String id = (String) rolloutObject.get("id");
List<Experiment> experiments = parseExperiments((JSONArray) rolloutObject.get("experiments"));

rollouts.add(new Rollout(id, experiments));
}

return rollouts;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.optimizely.ab.config.Group;
import com.optimizely.ab.config.LiveVariable;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.Rollout;
import com.optimizely.ab.config.audience.Audience;

import java.lang.reflect.Type;
Expand Down Expand Up @@ -80,9 +81,12 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa
}

List<FeatureFlag> featureFlags = null;
List<Rollout> rollouts = null;
if (datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())) {
Type featureFlagsType = new TypeToken<List<FeatureFlag>>() {}.getType();
featureFlags = context.deserialize(jsonObject.getAsJsonArray("featureFlags"), featureFlagsType);
Type rolloutsType = new TypeToken<List<Rollout>>() {}.getType();
rollouts = context.deserialize(jsonObject.get("rollouts").getAsJsonArray(), rolloutsType);
}

return new ProjectConfig(
Expand All @@ -97,7 +101,8 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa
experiments,
featureFlags,
groups,
liveVariables
liveVariables,
rollouts
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.optimizely.ab.config.Group;
import com.optimizely.ab.config.LiveVariable;
import com.optimizely.ab.config.ProjectConfig;
import com.optimizely.ab.config.Rollout;
import com.optimizely.ab.config.audience.Audience;

import java.io.IOException;
Expand Down Expand Up @@ -74,9 +75,12 @@ public ProjectConfig deserialize(JsonParser parser, DeserializationContext conte
}

List<FeatureFlag> featureFlags = null;
List<Rollout> rollouts = null;
if (datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())) {
featureFlags = mapper.readValue(node.get("featureFlags").toString(),
new TypeReference<List<FeatureFlag>>() {});
rollouts = mapper.readValue(node.get("rollouts").toString(),
new TypeReference<List<Rollout>>(){});
}

return new ProjectConfig(
Expand All @@ -91,7 +95,8 @@ public ProjectConfig deserialize(JsonParser parser, DeserializationContext conte
experiments,
featureFlags,
groups,
liveVariables
liveVariables,
rollouts
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,7 @@ public static void verifyProjectConfig(@CheckForNull ProjectConfig actual, @Nonn
verifyFeatureFlags(actual.getFeatureFlags(), expected.getFeatureFlags());
verifyLiveVariables(actual.getLiveVariables(), expected.getLiveVariables());
verifyGroups(actual.getGroups(), expected.getGroups());
verifyRollouts(actual.getRollouts(), expected.getRollouts());
}

/**
Expand Down Expand Up @@ -617,6 +618,23 @@ private static void verifyLiveVariables(List<LiveVariable> actual, List<LiveVari
}
}

private static void verifyRollouts(List<Rollout> actual, List<Rollout> expected) {
if (expected == null) {
assertNull(actual);
}
else {
assertEquals(expected.size(), actual.size());

for (int i = 0; i < actual.size(); i++) {
Rollout actualRollout = actual.get(i);
Rollout expectedRollout = expected.get(i);

assertEquals(expectedRollout.getId(), actualRollout.getId());
verifyExperiments(actualRollout.getExperiments(), expectedRollout.getExperiments());
}
}
}

/**
* Verify that the provided variation-level live variable usage instances are equivalent.
*/
Expand Down
Loading