11package co .featbit .commons .model ;
22
3- import co .featbit .commons .json .JsonHelper ;
4- import co .featbit .commons .json .JsonParseException ;
5- import com .google .common .base .MoreObjects ;
6- import com .google .common .collect .ImmutableList ;
7- import com .google .common .collect .ImmutableMap ;
8- import com .google .common .reflect .TypeToken ;
9- import org .apache .commons .lang3 .BooleanUtils ;
10- import org .apache .commons .lang3 .StringUtils ;
11-
12- import java .io .Serializable ;
13- import java .util .List ;
14- import java .util .Map ;
15- import java .util .Objects ;
16-
173/**
18- * The object provides a standard return responding the request of getting all flag values from a client sdk
4+ * The interface provides a standard return responding the request of getting all flag values from a client sdk
195 */
20- public class AllFlagStates extends BasicFlagState implements Serializable {
21-
22- protected static final String DEFAULT_JSON_VALUE = "DJV" ;
23-
24- protected static final String FLAG_VALUE_PARSING_ERROR = "flag value parsing error" ;
25-
26- protected static final String FLAG_NAME_UNKNOWN = "flag name unknown" ;
27-
28- private List <EvalDetail <String >> data ;
29-
30- protected transient Map <String , EvalDetail <String >> cache ;
31-
32-
33- protected AllFlagStates (boolean success , String message , List <EvalDetail <String >> data ) {
34- super (success , success ? "OK" : message );
35- init (data );
36- }
37-
38- private void init (List <EvalDetail <String >> data ) {
39- ImmutableMap .Builder <String , EvalDetail <String >> builder = ImmutableMap .builder ();
40- this .data = data == null ? ImmutableList .of () : ImmutableList .copyOf (data );
41- for (EvalDetail <String > detail : data ) {
42- builder .put (detail .getKeyName (), detail );
43- }
44- this .cache = builder .build ();
45- }
6+ public interface AllFlagStates {
467
478 /**
48- * build a AllFlagStates
9+ * if the last evaluation is successful
4910 *
50- * @param success true if the last request is successful
51- * @param message the reason
52- * @param data all flag values
53- * @return a AllFlagStates
11+ * @return true if the evaluation is successful
5412 */
55- public static AllFlagStates of (boolean success , String message , List <EvalDetail <String >> data ) {
56- return new AllFlagStates (success , success ? "OK" : message , data );
57- }
13+ boolean isSuccess ();
5814
5915 /**
60- * build a AllFlagStates from json
16+ * return the reason of last evaluation
6117 *
62- * @param json a string json
63- * @return a AllFlagStates
18+ * @return OK if the last evaluation is successful, otherwise return the reason
6419 */
65- public static AllFlagStates fromJson (String json ) {
66- return JsonHelper .deserialize (json , new TypeToken <AllFlagStates >() {
67- }.getType ());
68- }
69-
70- private <T > EvalDetail <T > getInternal (String flagKeyName , T defaultValue , Class <T > clzz ) {
71- if (cache == null || cache .isEmpty ()) {
72- init (data );
73- }
74- EvalDetail <String > ed = cache .get (flagKeyName );
75- if (ed == null ) return EvalDetail .of (defaultValue , FLAG_VALUE_PARSING_ERROR , flagKeyName , FLAG_NAME_UNKNOWN );
76- Object res = null ;
77- String variation = ed .getVariation ();
78- if (clzz == String .class ) {
79- res = variation ;
80- } else if (clzz == Boolean .class ) {
81- res = BooleanUtils .toBooleanObject (variation );
82- } else if (clzz == Integer .class || clzz == Double .class || clzz == Long .class ) {
83- if (StringUtils .isNumeric (variation )) {
84- if (clzz == Integer .class ) {
85- res = Integer .parseInt (variation );
86- } else if (clzz == Double .class ) {
87- res = Double .parseDouble (variation );
88- } else {
89- res = Long .parseLong (variation );
90- }
91- }
92- }
93- return res == null ? EvalDetail .of (defaultValue , FLAG_VALUE_PARSING_ERROR , flagKeyName , ed .getName ()) : EvalDetail .of (clzz .cast (res ), ed .getReason (), flagKeyName , ed .getName ());
94- }
20+ String getReason ();
9521
9622 /**
9723 * return the string value of a given flag key name or default value if flag not existed
@@ -100,9 +26,7 @@ private <T> EvalDetail<T> getInternal(String flagKeyName, T defaultValue, Class<
10026 * @param defaultValue the default value of the flag
10127 * @return string value or default value if flag not existed
10228 */
103- public String getString (String flagKeyName , String defaultValue ) {
104- return getInternal (flagKeyName , defaultValue , String .class ).getVariation ();
105- }
29+ String getString (String flagKeyName , String defaultValue );
10630
10731 /**
10832 * returns an object that describes the way the string flag value was determined.
@@ -112,9 +36,7 @@ public String getString(String flagKeyName, String defaultValue) {
11236 * @param defaultValue the default value of the flag
11337 * @return an {@link EvalDetail} object
11438 */
115- public EvalDetail <String > getStringDetail (String flagKeyName , String defaultValue ) {
116- return getInternal (flagKeyName , defaultValue , String .class );
117- }
39+ EvalDetail <String > getStringDetail (String flagKeyName , String defaultValue );
11840
11941 /**
12042 * return the Boolean value of a given flag key name, default value if flag not existed
@@ -124,9 +46,7 @@ public EvalDetail<String> getStringDetail(String flagKeyName, String defaultValu
12446 * @param defaultValue the default value of the flag
12547 * @return the Boolean value, default value if flag not existed or this value is not a Boolean
12648 */
127- public Boolean getBoolean (String flagKeyName , Boolean defaultValue ) {
128- return getInternal (flagKeyName , defaultValue , Boolean .class ).getVariation ();
129- }
49+ Boolean getBoolean (String flagKeyName , Boolean defaultValue );
13050
13151 /**
13252 * returns an object that describes the way the Boolean flag value was determined.
@@ -136,9 +56,7 @@ public Boolean getBoolean(String flagKeyName, Boolean defaultValue) {
13656 * @param defaultValue the default value of the flag
13757 * @return an {@link EvalDetail} object
13858 */
139- public EvalDetail <Boolean > getBooleanDetail (String flagKeyName , Boolean defaultValue ) {
140- return getInternal (flagKeyName , defaultValue , Boolean .class );
141- }
59+ EvalDetail <Boolean > getBooleanDetail (String flagKeyName , Boolean defaultValue );
14260
14361 /**
14462 * return the Integer value of a given flag key name, default value if flag not existed
@@ -148,9 +66,7 @@ public EvalDetail<Boolean> getBooleanDetail(String flagKeyName, Boolean defaultV
14866 * @param defaultValue the default value of the flag
14967 * @return the Integer value, default value if flag not existed or this value is not an Integer
15068 */
151- public Integer getInteger (String flagKeyName , Integer defaultValue ) {
152- return getInternal (flagKeyName , defaultValue , Integer .class ).getVariation ();
153- }
69+ Integer getInteger (String flagKeyName , Integer defaultValue );
15470
15571 /**
15672 * returns an object that describes the way the Integer flag value was determined.
@@ -160,9 +76,7 @@ public Integer getInteger(String flagKeyName, Integer defaultValue) {
16076 * @param defaultValue the default value of the flag
16177 * @return an {@link EvalDetail} object
16278 */
163- public EvalDetail <Integer > getIntegerDetail (String flagKeyName , Integer defaultValue ) {
164- return getInternal (flagKeyName , defaultValue , Integer .class );
165- }
79+ EvalDetail <Integer > getIntegerDetail (String flagKeyName , Integer defaultValue );
16680
16781 /**
16882 * return the Long value of a given flag key name, default value if flag not existed
@@ -172,9 +86,7 @@ public EvalDetail<Integer> getIntegerDetail(String flagKeyName, Integer defaultV
17286 * @param defaultValue the default value of the flag
17387 * @return the Long value, default value if flag not existed or this value is not a Long
17488 */
175- public Long getLong (String flagKeyName , Long defaultValue ) {
176- return getInternal (flagKeyName , defaultValue , Long .class ).getVariation ();
177- }
89+ Long getLong (String flagKeyName , Long defaultValue );
17890
17991 /**
18092 * returns an object that describes the way the Long flag value was determined.
@@ -184,21 +96,17 @@ public Long getLong(String flagKeyName, Long defaultValue) {
18496 * @param defaultValue the default value of the flag
18597 * @return an {@link EvalDetail} object
18698 */
187- public EvalDetail <Long > getLongDetail (String flagKeyName , Long defaultValue ) {
188- return getInternal (flagKeyName , defaultValue , Long .class );
189- }
99+ EvalDetail <Long > getLongDetail (String flagKeyName , Long defaultValue );
190100
191101 /**
192102 * return the Double value of a given flag key name, default value if flag not existed
193- * or this value is not an Double
103+ * or this value is not a Double
194104 *
195105 * @param flagKeyName the unique key for the feature flag
196106 * @param defaultValue the default value of the flag
197- * @return the Double value, default value if flag not existe or this value is not an Double
107+ * @return the Double value, default value if flag not existed or this value is not a Double
198108 */
199- public Double getDouble (String flagKeyName , Double defaultValue ) {
200- return getInternal (flagKeyName , defaultValue , Double .class ).getVariation ();
201- }
109+ Double getDouble (String flagKeyName , Double defaultValue );
202110
203111 /**
204112 * returns an object that describes the way the Double flag value was determined.
@@ -208,9 +116,7 @@ public Double getDouble(String flagKeyName, Double defaultValue) {
208116 * @param defaultValue the default value of the flag
209117 * @return an {@link EvalDetail} object
210118 */
211- public EvalDetail <Double > getDoubleDetail (String flagKeyName , Double defaultValue ) {
212- return getInternal (flagKeyName , defaultValue , Double .class );
213- }
119+ EvalDetail <Double > getDoubleDetail (String flagKeyName , Double defaultValue );
214120
215121 /**
216122 * return the T type value of a given flag key name, default value if flag not existed
@@ -221,18 +127,8 @@ public EvalDetail<Double> getDoubleDetail(String flagKeyName, Double defaultValu
221127 * @param defaultValue the default value of the flag
222128 * @return the Json value, default value if flag not existe or this value is not a T type
223129 */
224- public <T > T getJsonObject (String flagKeyName , T defaultValue , Class <T > clazz ) {
225- EvalDetail <String > ed = getInternal (flagKeyName , DEFAULT_JSON_VALUE , String .class );
226- String json = ed .getVariation ();
227- if (DEFAULT_JSON_VALUE .equals (json )) {
228- return defaultValue ;
229- }
230- try {
231- return JsonHelper .deserialize (json , clazz );
232- } catch (JsonParseException e ) {
233- return defaultValue ;
234- }
235- }
130+ <T > T getJsonObject (String flagKeyName , T defaultValue , Class <T > clazz );
131+
236132
237133 /**
238134 * returns an object that describes the way the T type flag value was determined.
@@ -243,35 +139,5 @@ public <T> T getJsonObject(String flagKeyName, T defaultValue, Class<T> clazz) {
243139 * @param defaultValue the default value of the flag
244140 * @return an {@link EvalDetail} object
245141 */
246- public <T > EvalDetail <T > getJsonDetail (String flagKeyName , T defaultValue , Class <T > clazz ) {
247- EvalDetail <String > ed = getInternal (flagKeyName , DEFAULT_JSON_VALUE , String .class );
248- String json = ed .getVariation ();
249- if (DEFAULT_JSON_VALUE .equals (json )) {
250- return EvalDetail .of (defaultValue , ed .getReason (), flagKeyName , ed .getName ());
251- }
252- try {
253- T jsonValue = JsonHelper .deserialize (json , clazz );
254- return EvalDetail .of (jsonValue , ed .getReason (), flagKeyName , ed .getName ());
255- } catch (JsonParseException e ) {
256- return EvalDetail .of (defaultValue , ed .getReason (), flagKeyName , ed .getName ());
257- }
258- }
259-
260- @ Override
261- public String toString () {
262- return MoreObjects .toStringHelper (this ).add ("success" , success ).add ("message" , message ).add ("data" , data ).toString ();
263- }
264-
265- @ Override
266- public boolean equals (Object o ) {
267- if (this == o ) return true ;
268- if (o == null || getClass () != o .getClass ()) return false ;
269- AllFlagStates that = (AllFlagStates ) o ;
270- return Objects .equals (data , that .data ) && Objects .equals (cache , that .cache );
271- }
272-
273- @ Override
274- public int hashCode () {
275- return Objects .hash (success , message , data );
276- }
142+ <T > EvalDetail <T > getJsonDetail (String flagKeyName , T defaultValue , Class <T > clazz );
277143}
0 commit comments