Skip to content

Commit b1648bc

Browse files
v1.1.0 (#9)
* feature/v1.1.0: v1.1.0 --------- Co-authored-by: deleteLater <mikcczhang@gmail.com>
1 parent 9be83e6 commit b1648bc

20 files changed

+471
-493
lines changed

README.md

Lines changed: 217 additions & 87 deletions
Large diffs are not rendered by default.

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>co.featbit</groupId>
88
<artifactId>featbit-java-sdk</artifactId>
9-
<version>1.0.5</version>
9+
<version>1.1.0</version>
1010

1111
<name>featbit/featbit-java-sdk</name>
1212

@@ -51,7 +51,7 @@
5151
<gson-version>2.8.9</gson-version>
5252
<slf4j-version>1.7.35</slf4j-version>
5353
<ttl-version>2.12.6</ttl-version>
54-
<junit-version>5.8.1</junit-version>
54+
<junit-version>5.8.2</junit-version>
5555
<mock-version>4.3</mock-version>
5656
</properties>
5757

Lines changed: 23 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,23 @@
11
package 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
}

src/main/java/co/featbit/server/Evaluator.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import co.featbit.commons.model.EvalDetail;
44
import co.featbit.commons.model.FBUser;
5-
import co.featbit.commons.model.FlagState;
65
import co.featbit.server.exterior.DataStorageTypes;
76
import org.slf4j.Logger;
87

@@ -75,6 +74,7 @@ interface Getter<T extends DataStorageTypes.Item> {
7574
}
7675

7776
static class EvalResult {
77+
private final String flagType;
7878
private final String index;
7979
private final String value;
8080
private final String reason;
@@ -83,7 +83,8 @@ static class EvalResult {
8383
private final String name;
8484

8585

86-
EvalResult(String value, String index, String reason, boolean sendToExperiment, String keyName, String name) {
86+
EvalResult(String flagType, String value, String index, String reason, boolean sendToExperiment, String keyName, String name) {
87+
this.flagType = flagType;
8788
this.value = value;
8889
this.index = index;
8990
this.reason = reason;
@@ -93,26 +94,32 @@ static class EvalResult {
9394
}
9495

9596
public static EvalResult error(String reason, String keyName, String name) {
96-
return new EvalResult(null, NO_EVAL_RES, reason, false, keyName, name);
97+
return new EvalResult(null, null, NO_EVAL_RES, reason, false, keyName, name);
9798
}
9899

99100
public static EvalResult error(String defaultValue, String reason, String keyName, String name) {
100-
return new EvalResult(defaultValue, NO_EVAL_RES, reason, false, keyName, name);
101+
return new EvalResult(null, defaultValue, NO_EVAL_RES, reason, false, keyName, name);
101102
}
102103

103-
public static EvalResult of(DataModel.Variation option,
104+
public static EvalResult of(String flagType,
105+
DataModel.Variation option,
104106
String reason,
105107
boolean sendToExperiment,
106108
String keyName,
107109
String name) {
108-
return new EvalResult(option.getValue(),
110+
return new EvalResult(flagType,
111+
option.getValue(),
109112
option.getId(),
110113
reason,
111114
sendToExperiment,
112115
keyName,
113116
name);
114117
}
115118

119+
public String getFlagType() {
120+
return flagType;
121+
}
122+
116123
public String getValue() {
117124
return value;
118125
}
@@ -144,11 +151,6 @@ private boolean isDefaultValue() {
144151
public <T> EvalDetail<T> toEvalDetail(T value) {
145152
return EvalDetail.of(value, this.reason, this.keyName, this.name);
146153
}
147-
148-
public <T> FlagState<T> toFlagState(T value) {
149-
return FlagState.of(EvalDetail.of(value, this.reason, this.keyName, this.name), !isDefaultValue());
150-
}
151-
152154
}
153155

154156
}

0 commit comments

Comments
 (0)