001 package com.mockrunner.base; 002 003 import java.io.PrintWriter; 004 import java.io.StringWriter; 005 006 /** 007 * If Mockrunner catches an exception inside application code, 008 * it rethrows it as an instance of this class. 009 */ 010 public class NestedApplicationException extends RuntimeException 011 { 012 private Throwable nested; 013 014 public NestedApplicationException(String message, Throwable nested) 015 { 016 super(message); 017 this.nested = nested; 018 } 019 020 public NestedApplicationException(Throwable nested) 021 { 022 this.nested = nested; 023 } 024 025 /** 026 * Returns the nested exception 027 * (which may also be a <code>NestedApplicationException</code>) 028 * @return the nested exception 029 */ 030 public Throwable getNested() 031 { 032 return nested; 033 } 034 035 /** 036 * Returns the root cause, i.e. the first exception that is 037 * not an instance of <code>NestedApplicationException</code>. 038 * @return the root exception 039 */ 040 public Throwable getRootCause() 041 { 042 if(nested == null) return null; 043 if(!(nested instanceof NestedApplicationException)) return nested; 044 return ((NestedApplicationException)nested).getRootCause(); 045 } 046 047 public String getMessage() 048 { 049 StringWriter writer = new StringWriter(); 050 PrintWriter printWriter = new PrintWriter(writer); 051 String message = super.getMessage(); 052 if(null != message) 053 { 054 printWriter.println(super.getMessage()); 055 } 056 else 057 { 058 printWriter.println(); 059 } 060 Throwable cause = getRootCause(); 061 if(null != cause) 062 { 063 printWriter.print("Cause: "); 064 cause.printStackTrace(printWriter); 065 } 066 writer.flush(); 067 return writer.toString(); 068 } 069 }