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}