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 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
042 *
043 * @version  6.0
044 * @author   Kazuhiko Hasegawa
045 * @since    JDK8.0,
046 */
047public class OgRuntimeException extends RuntimeException {
048        private static final long serialVersionUID = 642020160129L ;
049
050//      private final Throwable orgTh ;
051//      private         String          addMsg ;
052        /**
053         * JDK21対応。警告: [this-escape] サブクラスが初期化される前の'this'エスケープの可能性があります
054         *
055         * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。警告: [this-escape] サブクラスが初期化される前の'this'エスケープの可能性があります
056         */
057        protected final StringBuilder msgBuf = new StringBuilder( HybsConst.BUFFER_MIDDLE );            // 7.1.0.0 (2020/01/20)
058
059        /**
060         *  詳細メッセージを指定しないで OgRuntimeException を構築します。
061         *
062         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
063         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
064         *
065         * @see         java.lang.RuntimeException#RuntimeException()
066         */
067        public OgRuntimeException() {
068                super();
069//              orgTh = null;
070        }
071
072        /**
073         *  指定された詳細メッセージを持つ OgRuntimeException を構築します。
074         *
075         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
076         * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。
077         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
078         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
079         *
080         * @param       msg     詳細メッセージ
081         * @see         java.lang.RuntimeException#RuntimeException(String)
082         */
083        public OgRuntimeException( final String msg ) {
084                super( msg );
085//              orgTh = null;
086//              if( msg != null ) { addMsg = msg; }                             // 6.9.2.1 (2018/03/12)
087                addMessage( msg );                                                              // 7.1.0.0 (2020/01/20)
088        }
089
090        /**
091         *  指定されたThrowableオブジェクトを持つ OgRuntimeException を構築します。
092         *
093         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
094         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
095         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
096         *
097         * @param       th      例外Throwableオブジェクト
098         * @see         java.lang.RuntimeException#RuntimeException(Throwable)
099         */
100        public OgRuntimeException( final Throwable th ) {
101                super( th );
102                addMessage( th );                                                               // 7.1.0.0 (2020/01/20)
103
104//              super();
105//              orgTh = th ;
106        }
107
108        /**
109         *  指定された詳細メッセージと、Throwableオブジェクトを持つ OgRuntimeException を構築します。
110         *
111         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
112         * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。
113         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
114         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
115         *
116         * @param       msg     詳細メッセージ
117         * @param       th      例外Throwableオブジェクト
118         * @see         java.lang.RuntimeException#RuntimeException(String,Throwable)
119         */
120        public OgRuntimeException( final String msg,final Throwable th ) {
121                super( msg,th );
122//              super( msg );
123//              orgTh = th ;
124//              if( msg != null ) { addMsg = msg; }                             // 6.9.2.1 (2018/03/12)
125                addMessage( msg );                                                              // 7.1.0.0 (2020/01/20)
126                addMessage( th );                                                               // 7.1.0.0 (2020/01/20)
127        }
128
129        /**
130         * 発生元もメッセージも含めたメッセージ文字列を返します。
131         *
132         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
133         *
134         * @param    th  元のThrowableオブジェクト
135         */
136        public final void addMessage( final Throwable th ) {
137                Throwable th2 = th;
138                while( th2 != null ) {
139                        final String msg2 = th2.getLocalizedMessage();
140                        if( msg2 != null && msgBuf.indexOf( msg2 ) < 0 ) {              // メッセージの重複を除外
141                                msgBuf.append( msg2 ).append( HybsConst.CR );
142                        }
143                        th2 = th2.getCause();
144                }
145        }
146
147        /**
148         *  指定された追加メッセージを、printStackTrace() 出力時に、合成します。
149         *
150         * 主に、openGionバージョンや、その他追記したいメッセージを登録することで、
151         * printStackTrace() 出力時に、合成できます。
152         * 複数のメッセージは登録できません。最後に登録したメッセージのみ使用されます。
153         * なお、null のメッセージは登録できません。
154         *
155         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
156         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
157         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
158         *
159         * @param       msg     追加メッセージ
160         */
161        public final void addMessage( final String msg ) {
162//              if( msg != null ) { addMsg = msg; }
163                if( msg != null && msgBuf.indexOf( msg ) < 0 ) {                // メッセージの重複を除外
164                        msgBuf.append( msg ).append( HybsConst.CR );
165                }
166        }
167
168        /**
169         * このスロー可能オブジェクトの詳細メッセージ文字列を返します。
170         *
171         * 内部メッセージに、原因のメッセージも含めたメッセージです。
172         *
173         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
174         *
175         * @return      詳細メッセージ文字列
176         * @og.rtnNotNull
177         */
178        @Override                       // Throwable
179        public String getMessage() {
180                return msgBuf.toString().trim();
181        }
182
183        /**
184         * このスロー可能オブジェクトおよびそのバックトレースを標準エラー・ストリームに出力します。
185         *
186         * ここのメソッドは、このThrowableオブジェクトのスタック・トレースを、System.errフィールドの
187         * 値であるエラー出力ストリームで出力します。出力の先頭行には、このオブジェクトに対する
188         * toString()メソッドの結果が含まれます。
189         * 残りの行は、以前にfillInStackTrace()メソッドによって記録されたデータを表します。
190         * この情報の書式は実装によって異なりますが、典型的な書式の例を次に示します。
191         *
192         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
193         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をStackTraceに入れる。
194         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
195         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
196         *
197         * @see         java.lang.RuntimeException#printStackTrace()
198         */
199        @Override                       // Throwable
200        public void printStackTrace() {
201//              System.err.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
202//              System.err.println( ThrowUtil.ogStackTrace( addMsg,this ) );
203                System.err.println( ThrowUtil.ogStackTrace( getMessage(),this ) );              // 7.1.0.0 (2020/01/20)
204        }
205
206        /**
207         * このスロー可能オブジェクトとそのバックトレースを指定された印刷ストリームに出力します。
208         *
209         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
210         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
211         * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。
212         *
213         * @param       ps 出力する印刷ストリーム
214         * @see         java.lang.RuntimeException#printStackTrace(PrintStream)
215         */
216        @Override                       // Throwable
217        public void printStackTrace( final PrintStream ps ) {
218//              ps.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
219//              ps.println( ThrowUtil.ogStackTrace( addMsg,this ) );
220                ps.println( ThrowUtil.ogStackTrace( getMessage(),this ) );                              // 7.1.0.0 (2020/01/20)
221        }
222
223        /**
224         * このスロー可能オブジェクトとそのバックトレースを指定されたプリント・ライターに出力します。
225         *
226         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
227         * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。
228         *
229         * @param       pw 出力するプリント・ライター
230         * @see         java.lang.RuntimeException#printStackTrace(PrintWriter)
231         * @see         ThrowUtil#ogStackTrace(String,Throwable)
232         */
233        @Override                       // Throwable
234        public void printStackTrace( final PrintWriter pw ) {
235//              pw.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) );
236//              pw.println( ThrowUtil.ogStackTrace( addMsg,this ) );
237                pw.println( ThrowUtil.ogStackTrace( getMessage(),this ) );                              // 7.1.0.0 (2020/01/20)
238        }
239
240        /**
241         * スタックトレース要素の配列を返します。
242         *
243         * @og.rev 6.4.2.0 (2016/01/29) 新規作成。
244         * @og.rev 6.9.3.0 (2018/03/26) 内部 Throwable が null の場合、長さゼロの StackTraceElementを返します。
245         * @og.rev 7.0.5.0 (2019/09/09) 廃止
246         * @og.rev 7.0.6.4 (2019/11/29) 復活
247         *
248         * @return      スタックトレース要素の配列
249         * @see         java.lang.RuntimeException#getStackTrace()
250         * @see         ThrowUtil#selectElement(Throwable,int)
251         */
252        @Override                       // Throwable
253        public StackTraceElement[] getStackTrace() {
254                return ThrowUtil.selectElement( super.getCause() , ThrowUtil.MIN_STACK_SIZE );
255        }
256
257        /**
258         * このスロー可能オブジェクトの原因を返しますが、原因が存在しないか不明な場合はnullを返します。
259         *
260         * @og.rev 7.0.6.4 (2019/11/29) 常に null を返すようにします。
261         *
262         * @return      このスロー可能オブジェクトの原因(常に null)
263         */
264        @Override                       // Throwable
265        public Throwable getCause() {
266//              return super.getCause() ;
267                return null ;
268        }
269}