/*********************************************************************************** * Copyright (c) 2013. Nickolay Gerilovich. Russia. * Some Rights Reserved. ************************************************************************************/ package com.github.nickvl.xspring.core.log.aop; /** * Resolves exceptions. */ class ExceptionResolver { public Class<? extends Exception> resolve(ExceptionDescriptor descriptor, Exception ex) { Class<? extends Exception> resolved = null; int deepest = Integer.MAX_VALUE; for (Class<? extends Exception> exceptionMapping : descriptor.getDefinedExceptions()) { int depth = getDepth(exceptionMapping, ex); if (depth >= 0 && depth < deepest) { deepest = depth; resolved = exceptionMapping; } } return resolved; } private int getDepth(Class<? extends Exception> exceptionMapping, Exception ex) { return getDepth(exceptionMapping, ex.getClass(), 0); } @SuppressWarnings("unchecked") private int getDepth(Class<? extends Exception> exceptionMapping, Class<? extends Exception> exceptionClass, int depth) { if (exceptionClass.equals(exceptionMapping)) { return depth; } if (exceptionClass.equals(Throwable.class)) { return -1; } return getDepth(exceptionMapping, (Class<? extends Exception>) exceptionClass.getSuperclass(), depth + 1); } }