diff --git a/CHANGELOG.md b/CHANGELOG.md index c7829cfe3..07f6de541 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.4.1 + +February 1, 2017 + +- Default `null` status in datafile to `Not started` + ## 1.4.0 January 31, 2017 diff --git a/core-api/src/main/java/com/optimizely/ab/config/Experiment.java b/core-api/src/main/java/com/optimizely/ab/config/Experiment.java index 6ac00d1e2..b8bfc99e9 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/Experiment.java +++ b/core-api/src/main/java/com/optimizely/ab/config/Experiment.java @@ -83,7 +83,7 @@ public Experiment(@JsonProperty("id") String id, public Experiment(@Nonnull String id, @Nonnull String key, - @Nonnull String status, + @Nullable String status, @Nullable String layerId, @Nonnull List audienceIds, @Nonnull List variations, @@ -92,7 +92,7 @@ public Experiment(@Nonnull String id, @Nonnull String groupId) { this.id = id; this.key = key; - this.status = status; + this.status = status == null ? ExperimentStatus.NOT_STARTED.toString() : status; this.layerId = layerId; this.audienceIds = Collections.unmodifiableList(audienceIds); this.variations = Collections.unmodifiableList(variations); diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java b/core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java index c9639abe0..0031a4098 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java @@ -23,6 +23,7 @@ import com.google.gson.reflect.TypeToken; import com.optimizely.ab.config.Experiment; +import com.optimizely.ab.config.Experiment.ExperimentStatus; import com.optimizely.ab.config.LiveVariableUsageInstance; import com.optimizely.ab.config.TrafficAllocation; import com.optimizely.ab.config.Variation; @@ -86,7 +87,10 @@ static List parseTrafficAllocation(JsonArray trafficAllocatio static Experiment parseExperiment(JsonObject experimentJson, String groupId, JsonDeserializationContext context) { String id = experimentJson.get("id").getAsString(); String key = experimentJson.get("key").getAsString(); - String status = experimentJson.get("status").getAsString(); + JsonElement experimentStatusJson = experimentJson.get("status"); + String status = experimentStatusJson.isJsonNull() ? + ExperimentStatus.NOT_STARTED.toString() : experimentStatusJson.getAsString(); + JsonElement layerIdJson = experimentJson.get("layerId"); String layerId = layerIdJson == null ? null : layerIdJson.getAsString(); diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java index a7068a18c..a614ae6ef 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java @@ -25,6 +25,7 @@ import com.optimizely.ab.config.audience.UserAttribute; import com.optimizely.ab.config.EventType; import com.optimizely.ab.config.Experiment; +import com.optimizely.ab.config.Experiment.ExperimentStatus; import com.optimizely.ab.config.Group; import com.optimizely.ab.config.LiveVariable; import com.optimizely.ab.config.LiveVariableUsageInstance; @@ -101,7 +102,8 @@ private List parseExperiments(JSONArray experimentJson, String group JSONObject experimentObject = (JSONObject)obj; String id = experimentObject.getString("id"); String key = experimentObject.getString("key"); - String status = experimentObject.getString("status"); + String status = experimentObject.isNull("status") ? + ExperimentStatus.NOT_STARTED.toString() : experimentObject.getString("status"); String layerId = experimentObject.has("layerId") ? experimentObject.getString("layerId") : null; JSONArray audienceIdsJson = experimentObject.getJSONArray("audienceIds"); diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java index 95c804ee9..d0bbd435a 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java @@ -25,6 +25,7 @@ import com.optimizely.ab.config.audience.UserAttribute; import com.optimizely.ab.config.EventType; import com.optimizely.ab.config.Experiment; +import com.optimizely.ab.config.Experiment.ExperimentStatus; import com.optimizely.ab.config.Group; import com.optimizely.ab.config.LiveVariable; import com.optimizely.ab.config.LiveVariableUsageInstance; @@ -103,7 +104,9 @@ private List parseExperiments(JSONArray experimentJson, String group JSONObject experimentObject = (JSONObject)obj; String id = (String)experimentObject.get("id"); String key = (String)experimentObject.get("key"); - String status = (String)experimentObject.get("status"); + Object statusJson = experimentObject.get("status"); + String status = statusJson == null ? ExperimentStatus.NOT_STARTED.toString() : + (String)experimentObject.get("status"); Object layerIdObject = experimentObject.get("layerId"); String layerId = layerIdObject == null ? null : (String)layerIdObject; diff --git a/core-api/src/test/java/com/optimizely/ab/config/ProjectConfigTestUtils.java b/core-api/src/test/java/com/optimizely/ab/config/ProjectConfigTestUtils.java index 15459344e..483100f47 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/ProjectConfigTestUtils.java +++ b/core-api/src/test/java/com/optimizely/ab/config/ProjectConfigTestUtils.java @@ -197,6 +197,14 @@ private static ProjectConfig generateValidProjectConfigV2() { Collections.singletonMap("testUser3", "vtag3"), asList(new TrafficAllocation("278", 4500), new TrafficAllocation("279", 9000)), + ""), + new Experiment("119", "etag3", "Not started", null, + singletonList("100"), + asList(new Variation("280", "vtag5"), + new Variation("281", "vtag6")), + Collections.singletonMap("testUser4", "vtag5"), + asList(new TrafficAllocation("280", 4500), + new TrafficAllocation("281", 9000)), "") ); diff --git a/core-api/src/test/resources/config/valid-project-config-v2.json b/core-api/src/test/resources/config/valid-project-config-v2.json index e597e6493..3645a1088 100644 --- a/core-api/src/test/resources/config/valid-project-config-v2.json +++ b/core-api/src/test/resources/config/valid-project-config-v2.json @@ -56,6 +56,32 @@ "entityId": "279", "endOfRange": 9000 }] + }, + { + "id": "119", + "key": "etag3", + "status": null, + "layerId": "2", + "audienceIds": [ + "100" + ], + "variations": [{ + "id": "280", + "key": "vtag5" + }, { + "id": "281", + "key": "vtag6" + }], + "forcedVariations": { + "testUser4": "vtag5" + }, + "trafficAllocation": [{ + "entityId": "280", + "endOfRange": 4500 + }, { + "entityId": "281", + "endOfRange": 9000 + }] } ], "groups": [{ diff --git a/gradle.properties b/gradle.properties index 1a0ef0594..dc54603b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Maven version -version = 1.4.0-SNAPSHOT +version = 1.4.1-SNAPSHOT # Artifact paths mavenS3Bucket = optimizely-maven