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}