package org.limewire.service;
import java.io.PrintStream;
/**
* Forwards errors to an {@link ErrorCallback}. <code>ErrorService</code>
* includes static methods to set and get the <code>ErrorCallback</code> class.
*/
public final class ErrorService {
/**
* The <tt>ErrorCallback</tt> instance that callbacks are sent to. As a
* default the <tt>PrintStreamErrorCallback</tt> is set, which prints to
* {@link System#out}.
*/
private volatile static ErrorCallback _errorCallback = new PrintStreamErrorCallback(System.out);
/**
* Private constructor to ensure this class cannot be instantiated.
*/
private ErrorService() {
}
/**
* Sets the <tt>ErrorCallback</tt> class to use.
*/
public static void setErrorCallback(ErrorCallback callback) {
_errorCallback = callback;
}
/**
* Gets the <code>ErrorCallback</code> currently in use.
*/
public static ErrorCallback getErrorCallback() {
return _errorCallback;
}
/**
* Displays the error to the user.
*/
public static void error(Throwable problem) {
_errorCallback.error(problem);
}
/**
* Displays the error to the user with a specific detail information.
*/
public static void error(Throwable problem, String detail) {
_errorCallback.error(problem, detail);
}
/**
* Helper class that outputs the stack trace and the exception message to a
* {@link PrintStream} and rethrows the exception as a
* {@link RuntimeException}.
*/
private static class PrintStreamErrorCallback implements ErrorCallback {
private final PrintStream out;
/**
* Takes a {@link PrintStream} which is used for error output.
*/
public PrintStreamErrorCallback(PrintStream out) {
this.out = out;
}
/**
* Implements the <code>ErrorCallback</code> interface. Prints the stack
* trace for the given <code>Throwable</code> and rethrows the exception
* as a {@link RuntimeException}.
*
* @param t the <code>Throwable</code> to display
*/
public void error(Throwable t) {
t.printStackTrace(out);
throw new RuntimeException(t.getMessage());
}
// inherit doc comment
public void error(Throwable t, String msg) {
t.printStackTrace(out);
out.println(msg);
throw new RuntimeException(t.getMessage());
}
}
}