@@ -33,11 +33,8 @@ public final class FBClientImp implements FBClient {
3333 private final Status .DataUpdateStatusProvider dataUpdateStatusProvider ;
3434 private final Status .DataUpdater dataUpdater ;
3535 private final InsightProcessor insightProcessor ;
36-
37- private final ExecutorService sharedExecutorService ;
38-
36+ private final ThreadPoolExecutor sharedExecutorService ;
3937 private final Consumer <InsightTypes .Event > eventHandler ;
40-
4138 private final FlagTracker flagTracker ;
4239
4340 /**
@@ -169,54 +166,46 @@ public EvalDetail<String> variationDetail(String featureFlagKey, FBUser user, St
169166
170167 @ Override
171168 public boolean boolVariation (String featureFlagKey , FBUser user , Boolean defaultValue ) {
172- checkNotNull (defaultValue , "null defaultValue is invalid" );
173169 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Boolean .class );
174170 return BooleanUtils .toBoolean (res .getValue ());
175171 }
176172
177173 @ Override
178174 public EvalDetail <Boolean > boolVariationDetail (String featureFlagKey , FBUser user , Boolean defaultValue ) {
179- checkNotNull (defaultValue , "null defaultValue is invalid" );
180175 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Boolean .class );
181176 return res .toEvalDetail (BooleanUtils .toBoolean (res .getValue ()));
182177 }
183178
184179 public double doubleVariation (String featureFlagKey , FBUser user , Double defaultValue ) {
185- checkNotNull (defaultValue , "null defaultValue is invalid" );
186180 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Double .class );
187181 return Double .parseDouble (res .getValue ());
188182 }
189183
190184
191185 @ Override
192186 public EvalDetail <Double > doubleVariationDetail (String featureFlagKey , FBUser user , Double defaultValue ) {
193- checkNotNull (defaultValue , "null defaultValue is invalid" );
194187 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Double .class );
195188 return res .toEvalDetail (Double .parseDouble (res .getValue ()));
196189 }
197190
198191 public int intVariation (String featureFlagKey , FBUser user , Integer defaultValue ) {
199- checkNotNull (defaultValue , "null defaultValue is invalid" );
200192 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Integer .class );
201193 return Double .valueOf (res .getValue ()).intValue ();
202194 }
203195
204196 @ Override
205197 public EvalDetail <Integer > intVariationDetail (String featureFlagKey , FBUser user , Integer defaultValue ) {
206- checkNotNull (defaultValue , "null defaultValue is invalid" );
207198 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Integer .class );
208199 return res .toEvalDetail (Double .valueOf (res .getValue ()).intValue ());
209200 }
210201
211202 public long longVariation (String featureFlagKey , FBUser user , Long defaultValue ) {
212- checkNotNull (defaultValue , "null defaultValue is invalid" );
213203 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Long .class );
214204 return Double .valueOf (res .getValue ()).longValue ();
215205 }
216206
217207 @ Override
218208 public EvalDetail <Long > longVariationDetail (String featureFlagKey , FBUser user , Long defaultValue ) {
219- checkNotNull (defaultValue , "null defaultValue is invalid" );
220209 Evaluator .EvalResult res = evaluateInternal (featureFlagKey , user , defaultValue , Long .class );
221210 return res .toEvalDetail (Double .valueOf (res .getValue ()).longValue ());
222211 }
@@ -235,36 +224,37 @@ public <T> EvalDetail<T> jsonVariationDetail(String featureFlagKey, FBUser user,
235224 }
236225
237226 private Evaluator .EvalResult evaluateInternal (String featureFlagKey , FBUser user , Object defaultValue , Class <?> requiredType ) {
227+ String dv = defaultValue == null ? null : defaultValue .toString ();
238228 try {
239229 if (!isInitialized ()) {
240230 Loggers .EVALUATION .warn ("FB JAVA SDK: evaluation is called before Java SDK client is initialized for feature flag, well using the default value" );
241- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_CLIENT_NOT_READY , featureFlagKey , FLAG_NAME_UNKNOWN );
231+ return Evaluator .EvalResult .error (dv , REASON_CLIENT_NOT_READY , featureFlagKey , FLAG_NAME_UNKNOWN );
242232 }
243233 if (StringUtils .isBlank (featureFlagKey )) {
244234 Loggers .EVALUATION .warn ("FB JAVA SDK: null feature flag key; returning default value" );
245- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_FLAG_NOT_FOUND , featureFlagKey , FLAG_NAME_UNKNOWN );
235+ return Evaluator .EvalResult .error (dv , REASON_FLAG_NOT_FOUND , featureFlagKey , FLAG_NAME_UNKNOWN );
246236 }
247237 DataModel .FeatureFlag flag = getFlagInternal (featureFlagKey );
248238 if (flag == null ) {
249239 Loggers .EVALUATION .warn ("FB JAVA SDK: unknown feature flag {}; returning default value" , featureFlagKey );
250- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_FLAG_NOT_FOUND , featureFlagKey , FLAG_NAME_UNKNOWN );
240+ return Evaluator .EvalResult .error (dv , REASON_FLAG_NOT_FOUND , featureFlagKey , FLAG_NAME_UNKNOWN );
251241 }
252242 if (user == null || StringUtils .isBlank (user .getKey ())) {
253243 Loggers .EVALUATION .warn ("FB JAVA SDK: null user for feature flag {}, returning default value" , featureFlagKey );
254- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_USER_NOT_SPECIFIED , featureFlagKey , FLAG_NAME_UNKNOWN );
244+ return Evaluator .EvalResult .error (dv , REASON_USER_NOT_SPECIFIED , featureFlagKey , FLAG_NAME_UNKNOWN );
255245 }
256246
257247 InsightTypes .Event event = InsightTypes .FlagEvent .of (user );
258248 Evaluator .EvalResult res = evaluator .evaluate (flag , user , event );
259249 if (requiredType != null && !Utils .checkType (flag .getVariationType (), requiredType , res .getValue ())) {
260250 Loggers .EVALUATION .warn ("FB JAVA SDK: evaluation result {} didn't matched expected type {}" , res .getValue (), requiredType );
261- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_WRONG_TYPE , res .getKeyName (), res .getName ());
251+ return Evaluator .EvalResult .error (dv , REASON_WRONG_TYPE , res .getKeyName (), res .getName ());
262252 }
263253 eventHandler .accept (event );
264254 return res ;
265255 } catch (Exception ex ) {
266256 logger .error ("FB JAVA SDK: unexpected error in evaluation" , ex );
267- return Evaluator .EvalResult .error (defaultValue . toString () , REASON_ERROR , featureFlagKey , FLAG_NAME_UNKNOWN );
257+ return Evaluator .EvalResult .error (dv , REASON_ERROR , featureFlagKey , FLAG_NAME_UNKNOWN );
268258 }
269259
270260 }
@@ -294,7 +284,7 @@ public void close() throws IOException {
294284 this .storage .close ();
295285 this .dataSynchronizer .close ();
296286 this .insightProcessor .close ();
297- this .sharedExecutorService . shutdownNow ( );
287+ Utils . shutDownThreadPool ( "featbit-shared-worker" , this .sharedExecutorService , Duration . ofSeconds ( 2 ) );
298288 }
299289
300290 @ Override
0 commit comments