From fd8a182a634feb18dedd07a3868b701af0b6cb16 Mon Sep 17 00:00:00 2001 From: jonmv Date: Tue, 27 Feb 2024 10:08:04 +0100 Subject: [PATCH] Sort after filter, so total order exists --- .../src/main/java/com/yahoo/restapi/RestApiImpl.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java index a69d46a95a2b..a381fd3c9a69 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java @@ -172,7 +172,9 @@ private HttpResponse mapException(RequestContextImpl context, RuntimeException e log.log(Level.FINE, e, e::getMessage); ExceptionMapperHolder mapper = exceptionMappers.stream() .filter(holder -> holder.type.isAssignableFrom(e.getClass())) - .findFirst().orElseThrow(() -> e); + // Topologically sort children before superclasses, so most the specific match is found by iterating through mappers in order. + .min((a, b) -> (a.type.isAssignableFrom(b.type) ? 1 : 0) + (b.type.isAssignableFrom(a.type) ? -1 : 0)) + .orElseThrow(() -> e); return mapper.toResponse(context, e); } @@ -210,14 +212,6 @@ private static List> combineWithDefaultExceptionMappers if (!disableDefaultMappers){ exceptionMappers.addAll(RestApiMappers.DEFAULT_EXCEPTION_MAPPERS); } - // Topologically sort children before superclasses, so most the specific match is found by iterating through mappers in order. - exceptionMappers.sort((l, r) -> { - if (l.type.equals(r.type)) return 0; - if (l.type.isAssignableFrom(r.type)) return 1; - if (r.type.isAssignableFrom(l.type)) return -1; - // Ensure global ordering when no inheritance relationship exists - return l.type.getName().compareTo(r.type.getName()); - }); return exceptionMappers; }