Skip to content

Commit b0f277c

Browse files
committed
Add org.Json FeatureFlag parsing
Fix org.Json ProjectConfig parsing Signed-off-by: wangjoshuah <wangjoshuah@gmail.com>
1 parent 6b1c7f7 commit b0f277c

File tree

1 file changed

+66
-19
lines changed

1 file changed

+66
-19
lines changed

core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,34 @@
1717
package com.optimizely.ab.config.parser;
1818

1919
import com.optimizely.ab.config.Attribute;
20-
import com.optimizely.ab.config.audience.AndCondition;
21-
import com.optimizely.ab.config.audience.Audience;
22-
import com.optimizely.ab.config.audience.Condition;
23-
import com.optimizely.ab.config.audience.NotCondition;
24-
import com.optimizely.ab.config.audience.OrCondition;
25-
import com.optimizely.ab.config.audience.UserAttribute;
2620
import com.optimizely.ab.config.EventType;
2721
import com.optimizely.ab.config.Experiment;
2822
import com.optimizely.ab.config.Experiment.ExperimentStatus;
23+
import com.optimizely.ab.config.FeatureFlag;
2924
import com.optimizely.ab.config.Group;
3025
import com.optimizely.ab.config.LiveVariable;
31-
import com.optimizely.ab.config.LiveVariableUsageInstance;
3226
import com.optimizely.ab.config.LiveVariable.VariableStatus;
3327
import com.optimizely.ab.config.LiveVariable.VariableType;
28+
import com.optimizely.ab.config.LiveVariableUsageInstance;
3429
import com.optimizely.ab.config.ProjectConfig;
3530
import com.optimizely.ab.config.TrafficAllocation;
3631
import com.optimizely.ab.config.Variation;
37-
32+
import com.optimizely.ab.config.audience.AndCondition;
33+
import com.optimizely.ab.config.audience.Audience;
34+
import com.optimizely.ab.config.audience.Condition;
35+
import com.optimizely.ab.config.audience.NotCondition;
36+
import com.optimizely.ab.config.audience.OrCondition;
37+
import com.optimizely.ab.config.audience.UserAttribute;
3838
import org.json.JSONArray;
3939
import org.json.JSONObject;
4040

41+
import javax.annotation.Nonnull;
4142
import java.util.ArrayList;
4243
import java.util.HashMap;
4344
import java.util.List;
4445
import java.util.Map;
4546
import java.util.Set;
4647

47-
import javax.annotation.Nonnull;
48-
4948
/**
5049
* {@code org.json}-based config parser implementation.
5150
*/
@@ -60,6 +59,7 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
6059
String projectId = rootObject.getString("projectId");
6160
String revision = rootObject.getString("revision");
6261
String version = rootObject.getString("version");
62+
int datafileVersion = Integer.parseInt(version);
6363

6464
List<Experiment> experiments = parseExperiments(rootObject.getJSONArray("experiments"));
6565

@@ -72,14 +72,31 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
7272

7373
boolean anonymizeIP = false;
7474
List<LiveVariable> liveVariables = null;
75-
if (version.equals(ProjectConfig.Version.V3.toString())) {
75+
if (datafileVersion >= 3) {
7676
liveVariables = parseLiveVariables(rootObject.getJSONArray("variables"));
7777

7878
anonymizeIP = rootObject.getBoolean("anonymizeIP");
7979
}
8080

81-
return new ProjectConfig(accountId, projectId, version, revision, groups, experiments, attributes, events,
82-
audiences, anonymizeIP, liveVariables);
81+
List<FeatureFlag> featureFlags = null;
82+
if (datafileVersion >= 4) {
83+
featureFlags = parseFeatureFlags(rootObject.getJSONArray("featureFlags"));
84+
}
85+
86+
return new ProjectConfig(
87+
accountId,
88+
anonymizeIP,
89+
projectId,
90+
revision,
91+
version,
92+
attributes,
93+
audiences,
94+
events,
95+
experiments,
96+
featureFlags,
97+
groups,
98+
liveVariables
99+
);
83100
} catch (Exception e) {
84101
throw new ConfigParseException("Unable to parse datafile: " + json, e);
85102
}
@@ -123,6 +140,41 @@ private List<Experiment> parseExperiments(JSONArray experimentJson, String group
123140
return experiments;
124141
}
125142

143+
private List<String> parseExperimentIds(JSONArray experimentIdsJson) {
144+
ArrayList<String> experimentIds = new ArrayList<String>(experimentIdsJson.length());
145+
146+
for (Object experimentIdObj : experimentIdsJson) {
147+
experimentIds.add((String) experimentIdObj);
148+
}
149+
150+
return experimentIds;
151+
}
152+
153+
private List<FeatureFlag> parseFeatureFlags(JSONArray featureFlagJson) {
154+
List<FeatureFlag> featureFlags = new ArrayList<FeatureFlag>(featureFlagJson.length());
155+
156+
for (Object obj : featureFlagJson) {
157+
JSONObject featureFlagObject = (JSONObject) obj;
158+
String id = featureFlagObject.getString("id");
159+
String key = featureFlagObject.getString("key");
160+
String layerId = featureFlagObject.getString("layerId");
161+
162+
List<String> experimentIds = parseExperimentIds(featureFlagObject.getJSONArray("experimentIds"));
163+
164+
List<LiveVariable> variables = parseLiveVariables(featureFlagObject.getJSONArray("variables"));
165+
166+
featureFlags.add(new FeatureFlag(
167+
id,
168+
key,
169+
layerId,
170+
experimentIds,
171+
variables
172+
));
173+
}
174+
175+
return featureFlags;
176+
}
177+
126178
private List<Variation> parseVariations(JSONArray variationJson) {
127179
List<Variation> variations = new ArrayList<Variation>(variationJson.length());
128180

@@ -187,12 +239,7 @@ private List<EventType> parseEvents(JSONArray eventJson) {
187239

188240
for (Object obj : eventJson) {
189241
JSONObject eventObject = (JSONObject)obj;
190-
JSONArray experimentIdsJson = eventObject.getJSONArray("experimentIds");
191-
List<String> experimentIds = new ArrayList<String>(experimentIdsJson.length());
192-
193-
for (Object experimentIdObj : experimentIdsJson) {
194-
experimentIds.add((String)experimentIdObj);
195-
}
242+
List<String> experimentIds = parseExperimentIds(eventObject.getJSONArray("experimentIds"));
196243

197244
String id = eventObject.getString("id");
198245
String key = eventObject.getString("key");

0 commit comments

Comments
 (0)