001 package org.apache.commons.ognl;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.lang.reflect.Method;
023
024 /**
025 * Superclass for OGNL exceptions, incorporating an optional encapsulated exception.
026 *
027 * @author Luke Blanshard (blanshlu@netscape.net)
028 * @author Drew Davidson (drew@ognl.org)
029 */
030 public class OgnlException
031 extends Exception
032 {
033 // cache initCause method - if available..to be used during throwable constructor
034 // to properly setup superclass.
035
036 private static final long serialVersionUID = -842845048743721078L;
037
038 static Method initCause;
039 static
040 {
041 try
042 {
043 initCause = OgnlException.class.getMethod( "initCause", new Class[] { Throwable.class } );
044 }
045 catch ( NoSuchMethodException e )
046 {
047 /** ignore */
048 }
049 }
050
051 /**
052 * The root evaluation of the expression when the exception was thrown
053 */
054 private Evaluation evaluation;
055
056 /**
057 * Why this exception was thrown.
058 *
059 * @serial
060 */
061 private Throwable reason;
062
063 /** Constructs an OgnlException with no message or encapsulated exception. */
064 public OgnlException()
065 {
066 this( null, null );
067 }
068
069 /**
070 * Constructs an OgnlException with the given message but no encapsulated exception.
071 *
072 * @param msg the exception's detail message
073 */
074 public OgnlException( String msg )
075 {
076 this( msg, null );
077 }
078
079 /**
080 * Constructs an OgnlException with the given message and encapsulated exception.
081 *
082 * @param msg the exception's detail message
083 * @param reason the encapsulated exception
084 */
085 public OgnlException( String msg, Throwable reason )
086 {
087 super( msg );
088 this.reason = reason;
089
090 if ( initCause != null )
091 {
092 try
093 {
094 initCause.invoke( this, reason );
095 }
096 catch ( Exception ignored )
097 {
098 /** ignore */
099 }
100 }
101 }
102
103 /**
104 * Returns the encapsulated exception, or null if there is none.
105 *
106 * @return the encapsulated exception
107 */
108 public Throwable getReason()
109 {
110 return reason;
111 }
112
113 /**
114 * Returns the Evaluation that was the root evaluation when the exception was thrown.
115 *
116 * @return The {@link Evaluation}.
117 */
118 public Evaluation getEvaluation()
119 {
120 return evaluation;
121 }
122
123 /**
124 * Sets the Evaluation that was current when this exception was thrown.
125 *
126 * @param value The {@link Evaluation}.
127 */
128 public void setEvaluation( Evaluation value )
129 {
130 evaluation = value;
131 }
132
133 /**
134 * Returns a string representation of this exception.
135 *
136 * @return a string representation of this exception
137 */
138 @Override
139 public String toString()
140 {
141 if ( reason == null )
142 {
143 return super.toString();
144 }
145
146 return super.toString() + " [" + reason + "]";
147 }
148
149 /**
150 * Prints the stack trace for this (and possibly the encapsulated) exception on System.err.
151 */
152 @Override
153 public void printStackTrace()
154 {
155 printStackTrace( System.err );
156 }
157
158 /**
159 * Prints the stack trace for this (and possibly the encapsulated) exception on the given print stream.
160 */
161 @Override
162 public void printStackTrace( java.io.PrintStream s )
163 {
164 synchronized ( s )
165 {
166 super.printStackTrace( s );
167 if ( reason != null )
168 {
169 s.println( "/-- Encapsulated exception ------------\\" );
170 reason.printStackTrace( s );
171 s.println( "\\--------------------------------------/" );
172 }
173 }
174 }
175
176 /**
177 * Prints the stack trace for this (and possibly the encapsulated) exception on the given print writer.
178 */
179 @Override
180 public void printStackTrace( java.io.PrintWriter s )
181 {
182 synchronized ( s )
183 {
184 super.printStackTrace( s );
185 if ( reason != null )
186 {
187 s.println( "/-- Encapsulated exception ------------\\" );
188 reason.printStackTrace( s );
189 s.println( "\\--------------------------------------/" );
190 }
191 }
192 }
193 }