/**
   * Return value is based on the presents and value of the {@code
   * X-JASPI-AUTH-MODULE-ONE-VALIDATE-REQUEST} request header.
   *
   * @param messageInfo {@inheritDoc}
   * @param clientSubject {@inheritDoc}
   * @param serviceSubject {@inheritDoc}
   * @return {@inheritDoc}
   * @throws AuthException {@inheritDoc}
   */
  @SuppressWarnings("unchecked")
  @Override
  public AuthStatus validateRequest(
      MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {

    HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage();

    String header = request.getHeader(AUTH_MODULE_ONE_VALIDATE_REQUEST_HEADER_NAME.toLowerCase());

    clientSubject.getPrincipals().clear();
    clientSubject
        .getPrincipals()
        .add(
            new Principal() {
              @Override
              public String getName() {
                return AUTH_MODULE_ONE_PRINCIPAL;
              }
            });

    Map<String, Object> context =
        (Map<String, Object>) messageInfo.getMap().get(JaspiRuntime.ATTRIBUTE_AUTH_CONTEXT);
    context.put(AUTH_MODULE_ONE_CONTEXT_ENTRY, true);

    if (SUCCESS_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SUCCESS;
    }

    if (SEND_SUCCESS_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_SUCCESS;
    }

    if (SEND_FAILURE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_FAILURE;
    }

    if (SEND_CONTINUE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_CONTINUE;
    }

    if (FAILURE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.FAILURE;
    }

    if (NULL_AUTH_STATUS.equalsIgnoreCase(header)) {
      return null;
    }

    throw new AuthException(
        AUTH_MODULE_ONE_VALIDATE_REQUEST_HEADER_NAME
            + " header not set, so throwing AuthException.");
  }
  /**
   * Return value is based on the presents and value of the {@code
   * X-JASPI-AUTH-MODULE-ONE-SECURE-RESPONSE} request header.
   *
   * @param messageInfo {@inheritDoc}
   * @param serviceSubject {@inheritDoc}
   * @return {@inheritDoc}
   * @throws AuthException {@inheritDoc}
   */
  @Override
  public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject)
      throws AuthException {

    HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage();

    String header = request.getHeader(AUTH_MODULE_ONE_SECURE_RESPONSE_HEADER_NAME.toLowerCase());

    if (SUCCESS_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SUCCESS;
    }

    if (SEND_SUCCESS_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_SUCCESS;
    }

    if (SEND_FAILURE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_FAILURE;
    }

    if (SEND_CONTINUE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.SEND_CONTINUE;
    }

    if (FAILURE_AUTH_STATUS.equalsIgnoreCase(header)) {
      return AuthStatus.FAILURE;
    }

    if (NULL_AUTH_STATUS.equalsIgnoreCase(header)) {
      return null;
    }

    throw new AuthException(
        AUTH_MODULE_ONE_SECURE_RESPONSE_HEADER_NAME
            + " header not set, so throwing AuthException.");
  }