@Override
  public Response toResponse(Exception e) {

    // Translate exception to status
    ResponseBuilder responseBuilder = null;
    int status = -1;
    if (e instanceof RestOperationException) {
      status = ((RestOperationException) e).getStatus();
    } else if (e.getClass().getPackage().getName().equals("org.jboss.resteasy.spi")) {
      String simpleClassName = e.getClass().getSimpleName();
      if ("BadRequestException".equals(simpleClassName)) {
        status = 400; // 400: Bad request (due to syntax)
      } else if ("ReaderException".equals(simpleClassName)) {
        status = 400;
      } else if ("UnauthorizedException".equals(simpleClassName)) {
        status = 401; // 401: Unauthorized
      } else if ("NotFoundException".equals(simpleClassName)) {
        status = 404; // 404: Not found
      } else if ("MethodNotAllowedException".equals(simpleClassName)) {
        status = 405; // 405: (POST, GET, etc.) Method not allowed
      } else if ("NotAcceptableException".equals(simpleClassName)) {
        status = 406; // 406: Not acceptable (form of request)
      } else if ("WriterException".equals(simpleClassName)) {
        status = 500; // 500: internal server error
      } else if ("InternalServerErrorException".equals(simpleClassName)) {
        status = 500;
      }
    }
    logger.warn(
        "Exception thrown when processing request ["
            + getRelativePath(uriInfo)
            + "]; responding with status "
            + status,
        e);

    // Convert status to correct information in response
    if (status > 0) {
      responseBuilder = Response.status(status);
    } else {
      responseBuilder = Response.serverError();
    }

    JaxbRequestStatus requestStatus;
    switch (status) {
      case 400:
        requestStatus = JaxbRequestStatus.BAD_REQUEST;
        break;
      case 403:
        requestStatus = JaxbRequestStatus.FORBIDDEN;
        break;
      case 404:
        requestStatus = JaxbRequestStatus.NOT_FOUND;
        break;
      case 409:
        requestStatus = JaxbRequestStatus.PERMISSIONS_CONFLICT;
        break;
      case 500:
      case -1:
      default:
        requestStatus = JaxbRequestStatus.FAILURE;
    }

    // Build and send response
    JaxbException response =
        new JaxbException(uriInfo.getRequestUri().toString(), e, requestStatus);
    try {
      responseBuilder.entity(response.prettyPrint());
    } catch (JAXBException jaxbe) {
      responseBuilder.entity(JaxbException.convertStackTraceToString(jaxbe));
    }

    // Determine if the exception came from kie-services-remote or guvnor
    // - if guvnor use JSON
    boolean knowledgeStoreUrl = true;
    String path = uriInfo.getRequestUri().toString().replaceAll(".*/rest/", "");
    for (String resourcePath : kieServicesRemotePaths) {
      if (path.startsWith(resourcePath)) {
        knowledgeStoreUrl = false;
        break;
      }
    }
    Variant variant;
    if (knowledgeStoreUrl) {
      variant = jsonVariant;
    } else {
      variant = getVariant(headers);
    }

    return responseBuilder.variant(variant).build();
  }