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