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 }