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
015package 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
026public 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}