class AmbariErrorHandler extends ErrorHandler {

  @Override
  public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
    HttpChannel connection = HttpConnection.getCurrentConnection().getHttpChannel();
    connection.getRequest().setHandled(true);

    response.setContentType(MimeTypes.Type.TEXT_PLAIN.asString());

    Map<String, Object> errorMap = new LinkedHashMap<>();
    int code = connection.getResponse().getStatus();
    errorMap.put("status", code);
    String message = connection.getResponse().getReason();
    if (message == null) {
      message = HttpStatus.getMessage(code);
    }
    errorMap.put("message", message);

    if ((code == HttpServletResponse.SC_FORBIDDEN) || (code == HttpServletResponse.SC_UNAUTHORIZED)) {
      //if SSO is configured we should provide info about it in case of access error
      JwtAuthenticationProperties jwtProperties = jwtAuthenticationPropertiesProvider.get();
      if ((jwtProperties != null) && jwtProperties.isEnabledForAmbari()) {
        String providerUrl = jwtProperties.getAuthenticationProviderUrl();
        String originalUrl = jwtProperties.getOriginalUrlQueryParam();

        if (StringUtils.isEmpty(providerUrl)) {
          LOG.warn("The SSO provider URL is not available, forwarding to the SSO provider is not possible");
        } else if (StringUtils.isEmpty(originalUrl)) {
          LOG.warn("The original URL parameter name is not available, forwarding to the SSO provider is not possible");
        } else {
          errorMap.put("jwtProviderUrl", String.format("%s?%s=", providerUrl, originalUrl));
        }
      }
    }

    gson.toJson(errorMap, response.getWriter());
  }

  @Inject public  AmbariErrorHandler(@Named("prettyGson") Gson prettyGson, JwtAuthenticationPropertiesProvider jwtAuthenticationPropertiesProvider);

}