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 }