001 // Copyright 2006 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.tapestry5.ioc.internal.util;
016
017 import org.apache.tapestry5.ioc.Locatable;
018 import org.apache.tapestry5.ioc.Location;
019
020 /**
021 * Exception class used as a replacement for {@link java.lang.RuntimeException} when the exception is related to a
022 * particular location.
023 */
024 public class TapestryException extends RuntimeException implements Locatable
025 {
026 private static final long serialVersionUID = 6396903640977182682L;
027
028 private transient final Location location;
029
030 /**
031 * @param message a message (may be null)
032 * @param location implements {@link Location} or {@link Locatable}
033 * @param cause if not null, the root cause of the exception
034 */
035 public TapestryException(String message, Object location, Throwable cause)
036 {
037 this(message, InternalUtils.locationOf(location), cause);
038 }
039
040 /**
041 * @param message a message (may be null)
042 * @param cause if not null, the root cause of the exception, also used to set the location
043 */
044 public TapestryException(String message, Throwable cause)
045 {
046 this(message, cause, cause);
047 }
048
049 /**
050 * @param message a message (may be null)
051 * @param location location to associated with the exception, or null if not known
052 * @param cause if not null, the root cause of the exception
053 */
054 public TapestryException(String message, Location location, Throwable cause)
055 {
056 super(message, cause);
057
058 this.location = location;
059 }
060
061 public Location getLocation()
062 {
063 return location;
064 }
065
066 @Override
067 public String toString()
068 {
069 if (location == null) return super.toString();
070
071 return String.format("%s [at %s]", super.toString(), location);
072 }
073
074 }