public FlagEvaluation getEvaluation()

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());
    }
  }