CustomErrorController.java

1
package edu.ucsb.cs156.courses.controllers;
2
3
import jakarta.servlet.RequestDispatcher;
4
import jakarta.servlet.http.HttpServletRequest;
5
import jakarta.servlet.http.HttpServletResponse;
6
import lombok.extern.slf4j.Slf4j;
7
import org.springframework.boot.autoconfigure.web.ServerProperties;
8
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
9
import org.springframework.boot.web.servlet.error.ErrorAttributes;
10
import org.springframework.http.HttpStatus;
11
import org.springframework.stereotype.Controller;
12
import org.springframework.ui.ModelMap;
13
import org.springframework.web.bind.annotation.RequestMapping;
14
import org.springframework.web.servlet.ModelAndView;
15
16
/**
17
 * Custom error controller that replaces the default white label error page with a more
18
 * user-friendly error page.
19
 */
20
@Controller
21
@Slf4j
22
public class CustomErrorController extends BasicErrorController {
23
24
  public CustomErrorController(ErrorAttributes errorAttributes, ServerProperties properties) {
25
    super(errorAttributes, properties.getError());
26
  }
27
28
  /**
29
   * Handles error requests and returns a custom error page.
30
   *
31
   * @param request the HTTP request
32
   * @param response the HTTP response
33
   * @return the name of the error view template
34
   */
35
  @RequestMapping(produces = "text/html")
36
  @Override
37
  public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
38
39
    // Get error status
40
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
41
    int statusCode = 500; // Default to internal server error
42
43 1 1. errorHtml : negated conditional → KILLED
    if (status != null) {
44
      statusCode = Integer.parseInt(status.toString());
45
    }
46
47
    // Get error message
48
    String errorMessage = "An unexpected error occurred";
49 1 1. errorHtml : negated conditional → KILLED
    if (statusCode == 404) {
50
      errorMessage =
51
          "The page you are looking for might have been removed or is temporarily unavailable";
52 1 1. errorHtml : negated conditional → KILLED
    } else if (statusCode == 403) {
53
      errorMessage = "You don't have permission to access this resource";
54 1 1. errorHtml : negated conditional → KILLED
    } else if (statusCode == 500) {
55
      errorMessage = "We're sorry, something went wrong on our end";
56
    }
57
58
    // Get exception details for debugging
59
    Throwable throwable = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
60
    String exceptionMessage =
61 1 1. errorHtml : negated conditional → KILLED
        throwable != null ? throwable.getMessage() : "No exception details available";
62
63
    // Get stack trace
64
    String stackTrace = "";
65 1 1. errorHtml : negated conditional → KILLED
    if (throwable != null) {
66
      for (StackTraceElement element : throwable.getStackTrace()) {
67
        stackTrace += element.toString() + "\n";
68
      }
69
    }
70
71
    ModelMap model = new ModelMap();
72
73
    // Add attributes to the model
74
    model.addAttribute("status", statusCode);
75
    model.addAttribute("error", HttpStatus.valueOf(statusCode).getReasonPhrase());
76
    model.addAttribute("message", errorMessage);
77
    model.addAttribute("exceptionMessage", exceptionMessage);
78
    model.addAttribute("stackTrace", stackTrace);
79
    model.addAttribute("timestamp", java.time.LocalDateTime.now());
80
    model.addAttribute("path", request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI));
81
82 1 1. errorHtml : replaced return value with null for edu/ucsb/cs156/courses/controllers/CustomErrorController::errorHtml → KILLED
    return new ModelAndView("error", model);
83
  }
84
}

Mutations

43

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_NoStatusCode()]
negated conditional → KILLED

49

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_404()]
negated conditional → KILLED

52

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_DefaultStatus()]
negated conditional → KILLED

54

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_DefaultStatus()]
negated conditional → KILLED

61

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_NoStatusCode()]
negated conditional → KILLED

65

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_NoStatusCode()]
negated conditional → KILLED

82

1.1
Location : errorHtml
Killed by : edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.courses.controllers.CustomErrorControllerTests]/[method:testHandleError_NoStatusCode()]
replaced return value with null for edu/ucsb/cs156/courses/controllers/CustomErrorController::errorHtml → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0