1717package com .optimizely .ab .config .parser ;
1818
1919import com .fasterxml .jackson .core .JsonParser ;
20+ import com .fasterxml .jackson .core .JsonProcessingException ;
21+ import com .fasterxml .jackson .core .ObjectCodec ;
2022import com .fasterxml .jackson .databind .DeserializationContext ;
2123import com .fasterxml .jackson .databind .JsonDeserializer ;
2224import com .fasterxml .jackson .databind .JsonNode ;
2325import com .fasterxml .jackson .databind .ObjectMapper ;
24-
25- import com .optimizely .ab .config .audience .Audience ;
26- import com .optimizely .ab .config .audience .AndCondition ;
27- import com .optimizely .ab .config .audience .Condition ;
28- import com .optimizely .ab .config .audience .UserAttribute ;
29- import com .optimizely .ab .config .audience .NotCondition ;
30- import com .optimizely .ab .config .audience .OrCondition ;
26+ import com .optimizely .ab .config .audience .*;
3127
3228import java .io .IOException ;
3329import java .util .ArrayList ;
34- import java .util .HashMap ;
3530import java .util .List ;
3631
3732public class AudienceJacksonDeserializer extends JsonDeserializer <Audience > {
33+ private ObjectMapper objectMapper ;
34+
35+ public AudienceJacksonDeserializer () {
36+ this (new ObjectMapper ());
37+ }
38+
39+ AudienceJacksonDeserializer (ObjectMapper objectMapper ) {
40+ this .objectMapper = objectMapper ;
41+ }
3842
3943 @ Override
4044 public Audience deserialize (JsonParser parser , DeserializationContext context ) throws IOException {
41- ObjectMapper mapper = new ObjectMapper ();
42- JsonNode node = parser . getCodec () .readTree (parser );
45+ ObjectCodec codec = parser . getCodec ();
46+ JsonNode node = codec .readTree (parser );
4347
4448 String id = node .get ("id" ).textValue ();
4549 String name = node .get ("name" ).textValue ();
46- List <Object > rawObjectList = (List <Object >)mapper .readValue (node .get ("conditions" ).textValue (), List .class );
47- Condition conditions = parseConditions (rawObjectList );
50+
51+ String conditionsJson = node .get ("conditions" ).textValue ();
52+ JsonNode conditionsTree = objectMapper .readTree (conditionsJson );
53+ Condition conditions = parseConditions (conditionsTree );
4854
4955 return new Audience (id , name , conditions );
5056 }
5157
52- private Condition parseConditions (List < Object > rawObjectList ) {
58+ private Condition parseConditions (JsonNode conditionNode ) throws JsonProcessingException {
5359 List <Condition > conditions = new ArrayList <Condition >();
54- String operand = (String )rawObjectList .get (0 );
60+ JsonNode opNode = conditionNode .get (0 );
61+ String operand = opNode .asText ();
5562
56- for (int i = 1 ; i < rawObjectList .size (); i ++) {
57- Object obj = rawObjectList .get (i );
58- if (obj instanceof List ) {
59- List <Object > objectList = (List <Object >)rawObjectList .get (i );
60- conditions .add (parseConditions (objectList ));
61- } else {
62- HashMap <String , ?> conditionMap = (HashMap <String , ?>)rawObjectList .get (i );
63- conditions .add (new UserAttribute ((String )conditionMap .get ("name" ), (String )conditionMap .get ("type" ),
64- (String )conditionMap .get ("match" ), conditionMap .get ("value" )));
63+ for (int i = 1 ; i < conditionNode .size (); i ++) {
64+ JsonNode subNode = conditionNode .get (i );
65+ if (subNode .isArray ()) {
66+ conditions .add (parseConditions (subNode ));
67+ } else if (subNode .isObject ()) {
68+ conditions .add (objectMapper .treeToValue (subNode , UserAttribute .class ));
6569 }
6670 }
6771
@@ -73,7 +77,7 @@ private Condition parseConditions(List<Object> rawObjectList) {
7377 case "or" :
7478 condition = new OrCondition (conditions );
7579 break ;
76- default :
80+ default : // this makes two assumptions: operator is "not" and conditions is non-empty...
7781 condition = new NotCondition (conditions .get (0 ));
7882 break ;
7983 }
0 commit comments