package co.codewizards.cloudstore.core.dto; /** * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de */ public class RemoteException extends RuntimeException { private static final long serialVersionUID = 1L; private Error error; private String errorClassName; public RemoteException(Error error) { super(error == null ? null : error.getMessage()); this.error = error; if (error != null) { this.errorClassName = error.getClassName(); initStackTrace(); // doesn't work lazily :-( - elements are missing then - have to init eagerly. Marco :-) if (error.getCause() != null) initCause(new RemoteException(error.getCause())); } } private boolean stackTraceInitialised = false; private synchronized void initStackTrace() { if (stackTraceInitialised) return; stackTraceInitialised = true; if (error != null) { int idx = -1; StackTraceElement[] origStackTrace = getStackTrace(); StackTraceElement[] stackTrace = new StackTraceElement[origStackTrace.length + error.getStackTraceElements().size()]; for (ErrorStackTraceElement errorStackTraceElement : error.getStackTraceElements()) { stackTrace[++idx] = new StackTraceElement( errorStackTraceElement.getClassName(), errorStackTraceElement.getMethodName(), errorStackTraceElement.getFileName(), errorStackTraceElement.getLineNumber() ); } if (origStackTrace != null) { for (StackTraceElement stackTraceElement : origStackTrace) { stackTrace[++idx] = stackTraceElement; } } setStackTrace(stackTrace); } } // @Override // public StackTraceElement[] getStackTrace() { // initStackTrace(); // return super.getStackTrace(); // } // // @Override // public void printStackTrace(PrintStream s) { // initStackTrace(); // super.printStackTrace(s); // } // // @Override // public void printStackTrace(PrintWriter s) { // initStackTrace(); // super.printStackTrace(s); // } public Error getError() { return error; } public String getErrorClassName() { return errorClassName; } @Override public String toString() { String s = getClass().getName() + (errorClassName == null ? "" : ('<' + errorClassName + '>')); String message = getLocalizedMessage(); return (message != null) ? (s + ": " + message) : s; } }