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
027: implements Locatable {
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: this (rootCause.getMessage(), rootCause);
038: }
039:
040: public ApplicationRuntimeException(String message) {
041: this (message, null, null, null);
042: }
043:
044: public ApplicationRuntimeException(String message,
045: Throwable rootCause) {
046: this (message, null, null, rootCause);
047: }
048:
049: public ApplicationRuntimeException(String message,
050: Object component, Location location, Throwable rootCause) {
051: super (message);
052:
053: _rootCause = rootCause;
054: _component = component;
055:
056: _location = HiveMind.findLocation(new Object[] { location,
057: rootCause, component });
058: }
059:
060: public ApplicationRuntimeException(String message,
061: Location location, Throwable rootCause) {
062: this (message, null, location, rootCause);
063: }
064:
065: public Throwable getRootCause() {
066: return _rootCause;
067: }
068:
069: public Location getLocation() {
070: return _location;
071: }
072:
073: public Object getComponent() {
074: return _component;
075: }
076:
077: /**
078: * This method is for compatibility with JDK 1.4. Under 1.4, this will look like an override,
079: * allowing <code>printStackTrace()</code> to descending into the root cause exception and
080: * print its stack trace too.
081: */
082: public Throwable getCause() {
083: return _rootCause;
084: }
085:
086: /**
087: * Overrides the default implementation of <code>toString</code>, suffixing the normal result
088: * with the {@link #getLocation() location} of the exception (if non null). Example:
089: * <code>org.apache.hivemind.ApplicationRuntimeException: Exception Message [file:foo/bar/baz, line 13]</code>.
090: *
091: * @since 1.1
092: */
093: public String toString() {
094: if (_location == null)
095: return super .toString();
096:
097: StringBuffer buffer = new StringBuffer(super .toString());
098: buffer.append(" [");
099: buffer.append(_location);
100: buffer.append("]");
101:
102: return buffer.toString();
103: }
104: }
|