001: /*
002: * regain - A file search engine providing plenty of formats
003: * Copyright (C) 2004 Til Schneider
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: *
019: * Contact: Til Schneider, info@murfman.de
020: *
021: * CVS information:
022: * $RCSfile$
023: * $Source$
024: * $Date: 2005-02-24 16:31:49 +0100 (Do, 24 Feb 2005) $
025: * $Author: til132 $
026: * $Revision: 30 $
027: */
028: package net.sf.regain;
029:
030: import java.io.PrintStream;
031: import java.io.PrintWriter;
032:
033: /**
034: * An exception for the lucene search.
035: * <p>
036: * It can handle nested exceptions. Nested exceptions will be printed with the
037: * stacktrace.
038: * <p>
039: * This class has the same code as
040: * {@link net.sf.regain.util.sharedtag.taglib.ExtendedJspException}.
041: * The only difference is, that is inherits from <code>Exception</code>.
042: *
043: * @author Til Schneider, www.murfman.de
044: */
045: public class RegainException extends Exception {
046:
047: /** The nested exception. May be null. */
048: private Throwable mCause;
049:
050: /**
051: * Creates a new instance of SearchException.
052: *
053: * @param message The error message
054: */
055: public RegainException(String message) {
056: this (message, null);
057: }
058:
059: /**
060: * Creates a new instance of SearchException.
061: *
062: * @param message The error message
063: * @param cause The nested exception.
064: */
065: public RegainException(String message, Throwable cause) {
066: super (message);
067:
068: mCause = cause;
069: }
070:
071: /**
072: * Gets the cause of this exception. (May be null)
073: *
074: * @return The cause of this exception.
075: */
076: public Throwable getCause() {
077: return mCause;
078: }
079:
080: /**
081: * Prints the stack trace of this exception an of the nested exception, if
082: * present.
083: *
084: * @param stream The stream to print to.
085: */
086: public void printStackTrace(PrintStream stream) {
087: super .printStackTrace(stream);
088:
089: if ((mCause != null) && (!super ClassPrintsCause())) {
090: stream.println("Caused by: " + mCause.getMessage() + ":");
091: mCause.printStackTrace(stream);
092: }
093: }
094:
095: /**
096: * Prints the stack trace of this exception an of the nested exception, if
097: * present.
098: *
099: * @param writer The writer to print to.
100: */
101: public void printStackTrace(PrintWriter writer) {
102: super .printStackTrace(writer);
103:
104: if ((mCause != null) && (!super ClassPrintsCause())) {
105: writer.println("Caused by: " + mCause.getMessage() + ":");
106: mCause.printStackTrace(writer);
107: }
108: }
109:
110: /**
111: * Gets whether the superclass is able to print the cause of the exception.
112: * This is true for Java 1.4 and above.
113: *
114: * @return Whether the superclass is able to print the cause of the exception.
115: */
116: private boolean super ClassPrintsCause() {
117: // Check whether there is a getCause method in the super class
118: try {
119: getClass().getSuperclass().getMethod("getCause", null);
120:
121: // The superclass has a getCause method -> It must be Java 1.4 or more
122: return true;
123: } catch (Exception exc) {
124: // The superclass has no getCause method -> It must be Java 1.3 or less
125: return false;
126: }
127: }
128:
129: }
|