in sdk-java/src/main/java/com/spotify/confidence/Confidence.java [129:197]
public <T> FlagEvaluation<T> getEvaluation(String key, T defaultValue) {
try {
final FlagPath flagPath = getPath(key);
final String requestFlagName = "flags/" + flagPath.getFlag();
final ResolveFlagsResponse response = resolveFlags(requestFlagName).get();
if (response.getResolvedFlagsList().isEmpty()) {
final String errorMessage =
String.format("No active flag '%s' was found", flagPath.getFlag());
log.warn(errorMessage);
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.FLAG_NOT_FOUND, errorMessage);
}
final ResolvedFlag resolvedFlag = response.getResolvedFlags(0);
logResolveTesterHint(resolvedFlag);
if (!requestFlagName.equals(resolvedFlag.getFlag())) {
final String errorMessage =
String.format(
"Unexpected flag '%s' from remote",
resolvedFlag.getFlag().replaceFirst("^flags/", ""));
log.warn(errorMessage);
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.INTERNAL_ERROR, errorMessage);
}
if (resolvedFlag.getVariant().isEmpty()) {
final String errorMessage =
String.format(
"The server returned no assignment for the flag '%s'. Typically, this happens "
+ "if no configured rules matches the given evaluation context.",
flagPath.getFlag());
log.debug(errorMessage);
return new FlagEvaluation<>(defaultValue, "", resolvedFlag.getReason().toString());
} else {
final ConfidenceValue confidenceValue;
confidenceValue =
getValueForPath(
flagPath.getPath(),
ConfidenceTypeMapper.from(resolvedFlag.getValue(), resolvedFlag.getFlagSchema()));
// regular resolve was successful
return new FlagEvaluation<>(
getTyped(confidenceValue, defaultValue),
resolvedFlag.getVariant(),
resolvedFlag.getReason().toString());
}
} catch (IllegalValuePath | ValueNotFound e) {
log.warn(e.getMessage());
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.INVALID_VALUE_PATH, e.getMessage());
} catch (IncompatibleValueType | IllegalValueType e) {
log.warn(e.getMessage());
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.INVALID_VALUE_TYPE, e.getMessage());
} catch (StatusRuntimeException e) {
log.warn(e.getMessage());
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.NETWORK_ERROR, e.getMessage());
} catch (Exception e) {
// catch all for any runtime exception
if (e.getCause() instanceof StatusRuntimeException) {
log.warn(e.getMessage());
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.NETWORK_ERROR, e.getMessage());
}
log.warn(e.getMessage());
return new FlagEvaluation<>(
defaultValue, "", "ERROR", ErrorType.INTERNAL_ERROR, e.getMessage());
}
}