001: /*=============================================================================
002: * Copyright Texas Instruments 2004. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * $ProjectHeader: OSCRIPT 0.155 Fri, 20 Dec 2002 18:34:22 -0800 rclark $
019: */
020:
021: package oscript.util;
022:
023: /**
024: * The <code>ErrorHandler</code> is used by the interpreter to handle
025: * fatal, non-recoverable errors. When a fatal error occurs, the interpreter
026: * calls {@link #fatalError}, which is expected not to return.
027: * <p>
028: * Currently, the only fatal error is a corrupt symbol table. See issue
029: * <a href="https://icandy.homeunix.org/cgi-bin/trac.cgi/ticket/246">#246</a>
030: * for the juicy details.
031: * <p>
032: * A default <code>ErrorHandler</code> is provided, which simply prints an
033: * error message to <code>stderr</code> and {@link System#exit}s. Sometimes,
034: * such as in a GUI application where the user never sees <code>stderr</code>,
035: * you might want to implement your own error handler. There are two ways to
036: * do this:
037: * <ul>
038: * <li> Set the <code>oscript.error.handler</code> property to the fully
039: * qualified class name of a non-abstract class that extends
040: * <code>ErrorHandler</code> and has a no-arg constructor
041: * <li> Programatically by calling {@link #setErrorHandler}
042: * </ul>
043: *
044: * @author Rob Clark (rob@ti.com)
045: * @version 1
046: */
047: public abstract class ErrorHandler {
048: private static ErrorHandler handler;
049:
050: /**
051: * Get the fatal error handler. If it has not yet been set/loaded, this
052: * will cause it to be loaded by first trying to load the class specified
053: * by the <code>oscript.error.handler</code> property, and if that
054: * fails reverting to the default fatal error handler.
055: */
056: public static ErrorHandler getErrorHandler() {
057: if (handler == null) {
058: String str = System.getProperty("oscript.error.handler");
059: if (str != null) {
060: try {
061: handler = (ErrorHandler) (Class.forName(str)
062: .newInstance());
063: } catch (Throwable t) { /* don't care! */
064: }
065: }
066:
067: if (handler == null)
068: handler = new DefaultErrorHandler();
069: }
070:
071: return handler;
072: }
073:
074: /**
075: * Set the fatal error handler.
076: */
077: public static void setErrorHandler(ErrorHandler handler) {
078: ErrorHandler.handler = handler;
079: }
080:
081: /**
082: * Called in times of peril. This method should definately not return
083: * normally, and probably shouldn't return at all, ie. it should call
084: * {@link System#exit}, or sit in an infinite loop. (It may be possible
085: * to throw an exception, as long as care is taken to not throw anything
086: * that may be caught by the interpreter. And if you do keep the VM
087: * running, don't expect the ObjectScript interpreter to function.)
088: *
089: * @param str a string describing the error, how the user may
090: * correct the error, etc
091: */
092: public static void fatalError(String str) {
093: getErrorHandler().showMessage(str);
094: System.exit(-1);
095: }
096:
097: /**
098: *
099: * @param str a string describing the error, how the user may
100: * correct the error, etc
101: */
102: public static void warning(String str) {
103: getErrorHandler().showMessage(str);
104: }
105:
106: /**
107: * Display an error message to the user.
108: *
109: * @param str a string describing the error, how the user may
110: * correct the error, etc
111: */
112: public abstract void showMessage(String str);
113: }
114:
115: /**
116: * default error handler prints to <code>stderr</code> and then exits
117: */
118: class DefaultErrorHandler extends ErrorHandler {
119: public void showMessage(String str) {
120: System.err.println(str);
121: }
122: }
123:
124: /*
125: * Local Variables:
126: * tab-width: 2
127: * indent-tabs-mode: nil
128: * mode: java
129: * c-indentation-style: java
130: * c-basic-offset: 2
131: * eval: (c-set-offset 'substatement-open '0)
132: * eval: (c-set-offset 'case-label '+)
133: * eval: (c-set-offset 'inclass '+)
134: * eval: (c-set-offset 'inline-open '0)
135: * End:
136: */
|