17
17
package com .optimizely .ab .config .parser ;
18
18
19
19
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 ;
26
20
import com .optimizely .ab .config .EventType ;
27
21
import com .optimizely .ab .config .Experiment ;
28
22
import com .optimizely .ab .config .Experiment .ExperimentStatus ;
23
+ import com .optimizely .ab .config .FeatureFlag ;
29
24
import com .optimizely .ab .config .Group ;
30
25
import com .optimizely .ab .config .LiveVariable ;
31
- import com .optimizely .ab .config .LiveVariableUsageInstance ;
32
26
import com .optimizely .ab .config .LiveVariable .VariableStatus ;
33
27
import com .optimizely .ab .config .LiveVariable .VariableType ;
28
+ import com .optimizely .ab .config .LiveVariableUsageInstance ;
34
29
import com .optimizely .ab .config .ProjectConfig ;
35
30
import com .optimizely .ab .config .TrafficAllocation ;
36
31
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 ;
38
38
import org .json .JSONArray ;
39
39
import org .json .JSONObject ;
40
40
41
+ import javax .annotation .Nonnull ;
41
42
import java .util .ArrayList ;
42
43
import java .util .HashMap ;
43
44
import java .util .List ;
44
45
import java .util .Map ;
45
46
import java .util .Set ;
46
47
47
- import javax .annotation .Nonnull ;
48
-
49
48
/**
50
49
* {@code org.json}-based config parser implementation.
51
50
*/
@@ -60,6 +59,7 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
60
59
String projectId = rootObject .getString ("projectId" );
61
60
String revision = rootObject .getString ("revision" );
62
61
String version = rootObject .getString ("version" );
62
+ int datafileVersion = Integer .parseInt (version );
63
63
64
64
List <Experiment > experiments = parseExperiments (rootObject .getJSONArray ("experiments" ));
65
65
@@ -72,14 +72,31 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse
72
72
73
73
boolean anonymizeIP = false ;
74
74
List <LiveVariable > liveVariables = null ;
75
- if (version . equals ( ProjectConfig . Version . V3 . toString ()) ) {
75
+ if (datafileVersion >= 3 ) {
76
76
liveVariables = parseLiveVariables (rootObject .getJSONArray ("variables" ));
77
77
78
78
anonymizeIP = rootObject .getBoolean ("anonymizeIP" );
79
79
}
80
80
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
+ );
83
100
} catch (Exception e ) {
84
101
throw new ConfigParseException ("Unable to parse datafile: " + json , e );
85
102
}
@@ -123,6 +140,41 @@ private List<Experiment> parseExperiments(JSONArray experimentJson, String group
123
140
return experiments ;
124
141
}
125
142
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
+
126
178
private List <Variation > parseVariations (JSONArray variationJson ) {
127
179
List <Variation > variations = new ArrayList <Variation >(variationJson .length ());
128
180
@@ -187,12 +239,7 @@ private List<EventType> parseEvents(JSONArray eventJson) {
187
239
188
240
for (Object obj : eventJson ) {
189
241
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" ));
196
243
197
244
String id = eventObject .getString ("id" );
198
245
String key = eventObject .getString ("key" );
0 commit comments