001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.fukurou.system;
017
018import java.io.PrintStream ;
019import java.io.PrintWriter ;
020
021/**
022 * 共通的に使用されるRuntimeExceptionクラスです。
023 *
024 * RuntimeException を継承しているため、try{} catch() {} は不要です。
025 * 本システムでは、すべてこのエクセプションクラスを継承させたクラスを作成し、用途によって、
026 * 使い分けるようにします。つまり、他のどのような、Throwable が発生したとしても、一旦、
027 * try{} catch() {} で受けて、このクラスのサブクラスを、再度 throw させます。
028 * そして、必要であれば、try{} catch() {} を用いて捕まえて、それぞれの対応処理を行います。
029 *
030 * このクラスには、元々の発生したエクセプション( Throwable )を引数にとり、
031 * その printStackTrace()情報を、自分自身のトレース情報に含めます。
032 * また、引数にオブジェクトを渡すことができますので、object.toString() で、オブジェクトの
033 * 状態を表示できるようにしておけば、手軽にデバッグに使うことが可能になります。
034 *
035 * このRuntimeExceptionを使うと、ThrowUtil#ogStackTrace(String,Throwable) に準拠した
036 * StackTrace を作成します。これは、最初の3行+org.opengionを含む行だけのエラーを出力
037 * しますので、エラーログの容量を大幅に抑えることが可能です。
038 *
039 * @og.group エラー処理
040 * @og.rev 6.4.2.0 (2016/01/29) 新規作成
041 *
042 * @version  6.0
043 * @author   Kazuhiko Hasegawa
044 * @since    JDK8.0,
045 */
046public class OgRuntimeException extends RuntimeException {
047        private static final long serialVersionUID = 642020160129L ;
048
049        private final Throwable orgTh ;
050        private       String    addMsg ;
051
052        /**
053         *  詳細メッセージを指定しないで OgRuntimeException を構築します。
054         *
055         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
056         *
057         * @see         java.lang.RuntimeException#RuntimeException()
058         */
059        public OgRuntimeException() {
060                super();
061                orgTh = null;
062        }
063
064        /**
065         *  指定された詳細メッセージを持つ OgRuntimeException を構築します。
066         *
067         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
068         * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。
069         *
070         * @param       msg     詳細メッセージ
071         * @see         java.lang.RuntimeException#RuntimeException(String)
072         */
073        public OgRuntimeException( final String msg ) {
074                super( msg );
075                orgTh = null;
076                if( msg != null ) { addMsg = msg; }             // 6.9.2.1 (2018/03/12)
077        }
078
079        /**
080         *  指定されたThrowableオブジェクトを持つ OgRuntimeException を構築します。
081         *
082         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
083         *
084         * @param       th      例外Throwableオブジェクト
085         * @see         java.lang.RuntimeException#RuntimeException(Throwable)
086         */
087        public OgRuntimeException( final Throwable th ) {
088                super();
089                orgTh = th ;
090        }
091
092        /**
093         *  指定された詳細メッセージと、Throwableオブジェクトを持つ OgRuntimeException を構築します。
094         *
095         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
096         * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。
097         *
098         * @param       msg     詳細メッセージ
099         * @param       th      例外Throwableオブジェクト
100         * @see         java.lang.RuntimeException#RuntimeException(String,Throwable)
101         */
102        public OgRuntimeException( final String msg,final Throwable th ) {
103                super( msg );
104                orgTh = th ;
105                if( msg != null ) { addMsg = msg; }             // 6.9.2.1 (2018/03/12)
106        }
107
108        /**
109         *  指定された追加メッセージを、printStackTrace() 出力時に、合成します。
110         *
111         * 主に、openGionバージョンや、その他追記したいメッセージを登録することで、
112         * printStackTrace() 出力時に、合成できます。
113         * 複数のメッセージは登録できません。最後に登録したメッセージのみ使用されます。
114         * なお、null のメッセージは登録できません。
115         *
116         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
117         *
118         * @param       msg     追加メッセージ
119         */
120        public void addMessage( final String msg ) {
121                if( msg != null ) { addMsg = msg; }
122        }
123
124        /**
125         * このスロー可能オブジェクトおよびそのバックトレースを標準エラー・ストリームに出力します。
126         *
127         * ここのメソッドは、このThrowableオブジェクトのスタック・トレースを、System.errフィールドの
128         * 値であるエラー出力ストリームで出力します。出力の先頭行には、このオブジェクトに対する
129         * toString()メソッドの結果が含まれます。
130         * 残りの行は、以前にfillInStackTrace()メソッドによって記録されたデータを表します。
131         * この情報の書式は実装によって異なりますが、典型的な書式の例を次に示します。 
132         *
133         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
134         * @see         java.lang.RuntimeException#printStackTrace()
135         */
136        @Override
137        public void printStackTrace() {
138                System.err.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
139        }
140
141        /**
142         * このスロー可能オブジェクトとそのバックトレースを指定された印刷ストリームに出力します。
143         *
144         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
145         *
146         * @param       ps 出力する印刷ストリーム
147         * @see         java.lang.RuntimeException#printStackTrace(PrintStream)
148         */
149        @Override
150        public void printStackTrace( final PrintStream ps ) {
151                ps.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
152        }
153
154        /**
155         * このスロー可能オブジェクトとそのバックトレースを指定されたプリント・ライターに出力します。
156         *
157         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
158         *
159         * @param       pw 出力するプリント・ライター
160         * @see         java.lang.RuntimeException#printStackTrace(PrintWriter)
161         * @see         ThrowUtil#ogStackTrace(String,Throwable)
162         */
163        @Override
164        public void printStackTrace( final PrintWriter pw ) {
165                pw.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
166        }
167
168        /**
169         * スタックトレース要素の配列を返します。
170         *
171         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
172         * @og.rev 6.9.3.0 (2018/03/26) 内部 Throwable が null の場合、長さゼロの StackTraceElementを返します。
173         *
174         * @return      スタックトレース要素の配列
175         * @see         java.lang.RuntimeException#getStackTrace()
176         * @see         ThrowUtil#selectElement(Throwable,int)
177         */
178        @Override
179        public StackTraceElement[] getStackTrace() {
180//              return ThrowUtil.selectElement( orgTh == null ? this : orgTh , ThrowUtil.MIN_STACK_SIZE );
181                return orgTh == null ? new StackTraceElement[0]
182                                                         : ThrowUtil.selectElement( orgTh , ThrowUtil.MIN_STACK_SIZE );
183        }
184}