package io.undertow.servlet.core;
import io.undertow.util.StatusCodes;
import java.util.Map;
import javax.servlet.ServletException;
public class ErrorPages {
private final Map<Integer, String> errorCodeLocations;
private final Map<Class<? extends Throwable>, String> exceptionMappings;
private final String defaultErrorPage;
public ErrorPages(final Map<Integer, String> errorCodeLocations, final Map<Class<? extends Throwable>, String> exceptionMappings, final String defaultErrorPage) {
this.errorCodeLocations = errorCodeLocations;
this.exceptionMappings = exceptionMappings;
this.defaultErrorPage = defaultErrorPage;
}
public String getErrorLocation(final int code) {
String location = errorCodeLocations.get(code);
if (location == null) {
return defaultErrorPage;
}
return location;
}
public String getErrorLocation(final Throwable exception) {
if (exception == null) {
return null;
}
String location = null;
for (Class c = exception.getClass(); c != null && location == null; c = c.getSuperclass()) {
location = exceptionMappings.get(c);
}
if (location == null && exception instanceof ServletException) {
Throwable rootCause = ((ServletException) exception).getRootCause();
while (rootCause != null && rootCause instanceof ServletException && location == null) {
for (Class c = rootCause.getClass(); c != null && location == null; c = c.getSuperclass()) {
location = exceptionMappings.get(c);
}
rootCause = ((ServletException) rootCause).getRootCause();
}
if (rootCause != null && location == null) {
for (Class c = rootCause.getClass(); c != null && location == null; c = c.getSuperclass()) {
location = exceptionMappings.get(c);
}
}
}
if (location == null) {
location = getErrorLocation(StatusCodes.INTERNAL_SERVER_ERROR);
}
return location;
}
}