001package net.gdface.exception;
002
003import java.io.PrintStream;
004import java.io.PrintWriter;
005import java.io.StringWriter;
006//<omit-j2cpp>
007import net.gdface.utils.FaceUtilits;
008//</omit-j2cpp>
009/**
010 * webservice调用产生的运行时异常<br>
011 * 调用webservice方法时产生的所有{@link java.lang.RuntimeException}在抛出到webservice客户时被封装在{@link ServiceRuntimeException}中<br>
012 * 调用 {@link #getServerStackTraceMessage()}可以获取服务器端的堆栈错误信息<br>
013 * 调用{@link #printServerStackTrace()}输出服务器端的堆栈错误信息<br>
014 * @author guyadong
015 *
016 */
017public class ServiceRuntimeException extends Exception {
018        /**
019         * 保存服务器端错误堆栈信息
020         */
021        private String serverStackTraceMessage = null;
022
023        private static final long serialVersionUID = 6222189909743043773L;
024
025        public ServiceRuntimeException() {
026        }
027
028        /**
029         * @param message
030         */
031        public ServiceRuntimeException(String message) {
032                super(message);
033        }
034        //<omit-j2cpp>
035        /**
036         * @param message
037         * @param cause
038         */
039        public ServiceRuntimeException(String message, Throwable cause) {
040                super(message, FaceUtilits.stripThrowableShell(cause, RuntimeException.class));
041                fillStackTraceMessage(getCause());
042        }
043
044        /**
045         * @param cause
046         */
047        public ServiceRuntimeException(Throwable cause) {
048                super(FaceUtilits.stripThrowableShell(cause, RuntimeException.class));
049                fillStackTraceMessage(getCause());
050        }
051
052        /**
053         * 调用{@link #printStackTrace(PrintWriter)}将错误堆栈信息存入 {@link #serverStackTraceMessage}
054         * 
055         * @param cause
056         * @see #printStackTrace(PrintWriter)
057         */
058        private void fillStackTraceMessage(Throwable cause) {
059                if (null != cause) {
060                        StringWriter write = new StringWriter(256);
061                        PrintWriter pw = new PrintWriter(write);
062                        cause.printStackTrace(pw);
063                        serverStackTraceMessage = write.toString();
064                }
065        }
066
067        /**
068         * 输出服务器端堆栈错误信息
069         * @see #printStackTrace()       
070         */
071        public void printServerStackTrace() {
072                printServerStackTrace(System.err);
073        }
074
075        /**
076         * @param s
077         * @see #printServerStackTrace()
078         * @see #printStackTrace(PrintStream)
079         */
080        public void printServerStackTrace(PrintStream s) {
081                synchronized (s) {
082                        s.println(serverStackTraceMessage);
083                }
084        }
085
086        /**
087         * @param s
088         * @see #printServerStackTrace()
089         * @see #printStackTrace(PrintWriter)
090         */
091        public void printServerStackTrace(PrintWriter s) {
092                synchronized (s) {
093                        s.println(serverStackTraceMessage);
094                }
095        }
096        //</omit-j2cpp>
097        /**
098         * 返回服务器端异常的堆栈信息
099         * @return serverStackTraceMessage
100         */
101        public String getServerStackTraceMessage() {
102                return serverStackTraceMessage;
103        }
104        /**
105         * @param serverStackTraceMessage
106         *            要设置的 serverStackTraceMessage
107         */
108        public void setServerStackTraceMessage(String serverStackTraceMessage) {
109                this.serverStackTraceMessage = serverStackTraceMessage;
110        }
111}