001    package com.mockrunner.base;
002    
003    /**
004     * If Mockrunner catches an exception inside application code,
005     * it rethrows it as an instance of this class.
006     */
007    public class NestedApplicationException extends RuntimeException
008    {
009        private Throwable nested;
010        
011        public NestedApplicationException(String message, Throwable nested)
012        {
013            super(message);
014            this.nested = nested;
015        }
016        
017        public NestedApplicationException(Throwable nested)
018        {
019            this.nested = nested;
020        }
021        
022        /**
023         * Returns the nested exception 
024         * (which may also be a <code>NestedApplicationException</code>)
025         * @return the nested exception
026         */
027        public Throwable getNested()
028        {
029            return nested;
030        }
031        
032        /**
033         * Returns the root cause, i.e. the first exception that is
034         * not an instance of <code>NestedApplicationException</code>.
035         * @return the root exception
036         */
037        public Throwable getRootCause()
038        {
039            if(nested == null) return null;
040            if(!(nested instanceof NestedApplicationException)) return nested;
041            return ((NestedApplicationException)nested).getRootCause();
042        }
043    }