001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.hivemind;
016    
017    /**
018     * General wrapper for any exception (normal or runtime) that may occur during runtime processing
019     * for the application. This is exception is used when the intent is to communicate a low-level
020     * failure to the user or developer; it is not expected to be caught. The
021     * {@link #getRootCause() rootCause} property is a <em>nested</em> exception.
022     * 
023     * @author Howard Lewis Ship
024     */
025    
026    public class ApplicationRuntimeException extends RuntimeException implements Locatable
027    {
028        private static final long serialVersionUID = 1L;
029    
030        private Throwable _rootCause;
031    
032        private transient Location _location;
033    
034        private transient Object _component;
035    
036        public ApplicationRuntimeException(Throwable rootCause)
037        {
038            this(rootCause.getMessage(), rootCause);
039        }
040    
041        public ApplicationRuntimeException(String message)
042        {
043            this(message, null, null, null);
044        }
045    
046        public ApplicationRuntimeException(String message, Throwable rootCause)
047        {
048            this(message, null, null, rootCause);
049        }
050    
051        public ApplicationRuntimeException(String message, Object component, Location location,
052                Throwable rootCause)
053        {
054            super(message);
055    
056            _rootCause = rootCause;
057            _component = component;
058    
059            _location = HiveMind.findLocation(new Object[]
060            { location, rootCause, component });
061        }
062    
063        public ApplicationRuntimeException(String message, Location location, Throwable rootCause)
064        {
065            this(message, null, location, rootCause);
066        }
067    
068        public Throwable getRootCause()
069        {
070            return _rootCause;
071        }
072    
073        public Location getLocation()
074        {
075            return _location;
076        }
077    
078        public Object getComponent()
079        {
080            return _component;
081        }
082    
083        /**
084         * This method is for compatibility with JDK 1.4. Under 1.4, this will look like an override,
085         * allowing <code>printStackTrace()</code> to descending into the root cause exception and
086         * print its stack trace too.
087         */
088        public Throwable getCause()
089        {
090            return _rootCause;
091        }
092    
093        /**
094         * Overrides the default implementation of <code>toString</code>, suffixing the normal result
095         * with the {@link #getLocation() location} of the exception (if non null). Example:
096         * <code>org.apache.hivemind.ApplicationRuntimeException: Exception Message [file:foo/bar/baz, line 13]</code>.
097         * 
098         * @since 1.1
099         */
100        public String toString()
101        {
102            if (_location == null)
103                return super.toString();
104    
105            StringBuffer buffer = new StringBuffer(super.toString());
106            buffer.append(" [");
107            buffer.append(_location);
108            buffer.append("]");
109    
110            return buffer.toString();
111        }
112    }