diff --git a/deps/.classpath b/deps/.classpath index 6936ec7f928..d16979b78ad 100644 --- a/deps/.classpath +++ b/deps/.classpath @@ -21,7 +21,7 @@ - + diff --git a/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java b/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java index 25d5b499655..4ae38182452 100644 --- a/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java +++ b/utils/src/com/cloud/utils/log/CglibThrowableRenderer.java @@ -67,22 +67,35 @@ public class CglibThrowableRenderer implements ThrowableRenderer { } } - /** - * {@inheritDoc} - */ @Override - public String[] doRender(final Throwable throwable) { + public String[] doRender(final Throwable th) { try { Object[] noArgs = null; - Object[] elements = (Object[])getStackTraceMethod.invoke(throwable, noArgs); - ArrayList lines = new ArrayList(elements.length + 1); + ArrayList lines = new ArrayList(); + Throwable throwable = th; lines.add(throwable.toString()); Map classMap = new HashMap(); - for (int i = 0; i < elements.length; i++) { - if (!(elements[i] instanceof StackTraceElement) || !((StackTraceElement)elements[i]).getFileName().equals("")) { + int start = 0; + do { + Object[] elements = (Object[])getStackTraceMethod.invoke(throwable, noArgs); + for (int i = 0; i < elements.length - start; i++) { + if (elements[i] instanceof StackTraceElement) { + StackTraceElement stack = (StackTraceElement)elements[i]; + if (stack.getFileName().equals("") || stack.getFileName().equals("MethodProxy.java")) { + continue; + } + } lines.add(formatElement(elements[i], classMap)); } - } + if (start != 0) { + lines.add("\t... " + start + " more"); + } + throwable = throwable.getCause(); + if (throwable != null) { + lines.add("Caused by: " + throwable.toString()); + start = elements.length - 1; + } + } while (throwable != null); return lines.toArray(new String[lines.size()]); } catch (Exception ex) { return null; diff --git a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java b/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java index 6999f9acf2d..b7cd5e59c7a 100644 --- a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java +++ b/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java @@ -12,9 +12,24 @@ import com.cloud.utils.exception.CloudRuntimeException; public class CglibThrowableRendererTest extends TestCase { private final static Logger s_logger = Logger.getLogger(CglibThrowableRendererTest.class); public static class Test { + public void exception1() { + throw new IllegalArgumentException("What a bad exception"); + } + + public void exception2() { + try { + exception1(); + } catch (Exception e) { + throw new CloudRuntimeException("exception2", e); + } + } @DB public void exception() { - throw new CloudRuntimeException("exception"); + try { + exception2(); + } catch (Exception e) { + throw new CloudRuntimeException("exception", e); + } } } @@ -26,5 +41,4 @@ public class CglibThrowableRendererTest extends TestCase { s_logger.warn("exception caught", e); } } - }