1717package com .optimizely .ab .config .parser ;
1818
1919import 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 ;
2620import com .optimizely .ab .config .EventType ;
2721import com .optimizely .ab .config .Experiment ;
2822import com .optimizely .ab .config .Experiment .ExperimentStatus ;
23+ import com .optimizely .ab .config .FeatureFlag ;
2924import com .optimizely .ab .config .Group ;
3025import com .optimizely .ab .config .LiveVariable ;
31- import com .optimizely .ab .config .LiveVariableUsageInstance ;
3226import com .optimizely .ab .config .LiveVariable .VariableStatus ;
3327import com .optimizely .ab .config .LiveVariable .VariableType ;
28+ import com .optimizely .ab .config .LiveVariableUsageInstance ;
3429import com .optimizely .ab .config .ProjectConfig ;
3530import com .optimizely .ab .config .TrafficAllocation ;
3631import 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 ;
3838import org .json .JSONArray ;
3939import org .json .JSONObject ;
4040
41+ import javax .annotation .Nonnull ;
4142import java .util .ArrayList ;
4243import java .util .HashMap ;
4344import java .util .List ;
4445import java .util .Map ;
4546import 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