001package co.codewizards.cloudstore.core.dto; 002 003 004/** 005 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 006 */ 007public class RemoteException extends RuntimeException 008{ 009 private static final long serialVersionUID = 1L; 010 011 private Error error; 012 private String errorClassName; 013 014 public RemoteException(Error error) 015 { 016 super(error == null ? null : error.getMessage()); 017 018 this.error = error; 019 020 if (error != null) { 021 this.errorClassName = error.getClassName(); 022 initStackTrace(); // doesn't work lazily :-( - elements are missing then - have to init eagerly. Marco :-) 023 if (error.getCause() != null) 024 initCause(new RemoteException(error.getCause())); 025 } 026 } 027 028 private boolean stackTraceInitialised = false; 029 030 private synchronized void initStackTrace() { 031 if (stackTraceInitialised) 032 return; 033 034 stackTraceInitialised = true; 035 036 if (error != null) { 037 int idx = -1; 038 StackTraceElement[] origStackTrace = getStackTrace(); 039 StackTraceElement[] stackTrace = new StackTraceElement[origStackTrace.length + error.getStackTraceElements().size()]; 040 041 for (ErrorStackTraceElement errorStackTraceElement : error.getStackTraceElements()) { 042 stackTrace[++idx] = new StackTraceElement( 043 errorStackTraceElement.getClassName(), 044 errorStackTraceElement.getMethodName(), 045 errorStackTraceElement.getFileName(), 046 errorStackTraceElement.getLineNumber() 047 ); 048 } 049 050 if (origStackTrace != null) { 051 for (StackTraceElement stackTraceElement : origStackTrace) { 052 stackTrace[++idx] = stackTraceElement; 053 } 054 } 055 056 setStackTrace(stackTrace); 057 } 058 } 059 060// @Override 061// public StackTraceElement[] getStackTrace() { 062// initStackTrace(); 063// return super.getStackTrace(); 064// } 065// 066// @Override 067// public void printStackTrace(PrintStream s) { 068// initStackTrace(); 069// super.printStackTrace(s); 070// } 071// 072// @Override 073// public void printStackTrace(PrintWriter s) { 074// initStackTrace(); 075// super.printStackTrace(s); 076// } 077 078 public Error getError() { 079 return error; 080 } 081 082 public String getErrorClassName() { 083 return errorClassName; 084 } 085 086 @Override 087 public String toString() { 088 String s = getClass().getName() + (errorClassName == null ? "" : ('<' + errorClassName + '>')); 089 String message = getLocalizedMessage(); 090 return (message != null) ? (s + ": " + message) : s; 091 } 092}