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.util;
017
018/**
019 * 個々のエラーメッセージを持っておくためのオブジェクトです。
020 * このオブジェクトは、不変オブジェクトです。
021 * 内部には、行番号とIDと結果と、メッセージリソースで使用される引数を持っています。
022 * 結果は 0:正常 1:警告 2:異常 8:EXCEPTION 9:ORACLEエラーで、
023 * ErrorMessageクラスの public static 変数で定義されている値を使用します。
024 *
025 * @og.group エラー処理
026 *
027 * @version  4.0
028 * @author   Kazuhiko Hasegawa
029 * @since    JDK5.0,
030 */
031public final class ErrMsg {
032        /** バッファの初期容量を通常より多い目に設定します。  {@value} */
033        public static final int BUFFER_MIDDLE = 200;                                                    // 5.1.9.0 (2010/08/01) 追加
034
035        private final int               no;                     // 行番号
036        private final int               kekka;          // 結果 0:正常 1:警告 2:異常 8:EXCEPTION 9:ORACLEエラー
037        private final String    id;                     // メッセージID
038        private final String[]  args ;          // メッセージの引数配列
039        private final String    pg;                     // PG名 3.8.9.5 (2007/09/12)
040        private final String    step;           // ステップ名 3.8.9.5 (2007/09/12)
041
042        /**
043         *  必要な引数をすべて設定して、ErrMsg オブジェクトを構築します。
044         *
045         * @param       no              行番号
046         * @param       kekka   結果 0:正常 1:警告 2:異常 8:EXCEPTION 9:ORACLEエラー
047         * @param       pg              PG名
048         * @param       step    STEP名
049         * @param       id              メッセージID
050         * @param       inArgs  メッセージIDの可変数引数
051         */
052        public ErrMsg( final int no,final int kekka,
053                                                final String pg,final String step,
054                                                final String id,final String... inArgs) {
055                this.no         = no;
056                this.kekka      = kekka;
057                this.id         = id;
058//              final int cnt = inArgs.length;
059                final int cnt = inArgs == null ? 0 : inArgs.length;             // 8.5.7.0 (2024/03/29)
060                args = new String[cnt];
061                for( int i=0; i<cnt; i++ ) {
062                        args[i] = argIn( inArgs[i] );
063                }
064                this.pg         = pg;           // 3.8.9.5 (2007/09/12)
065                this.step       = step;         // 3.8.9.5 (2007/09/12)
066        }
067
068        /**
069         *  行番号のみ異なる、新しい ErrMsg オブジェクトを作成します。
070         *
071         * @param    newNo 行番号
072         *
073         * @return   行番号のみ異なる、新しい ErrMsgオブジェクト
074         * @og.rtnNotNull
075         */
076        public ErrMsg copy( final int newNo ) {
077                return new ErrMsg( newNo,kekka,pg,step,id,args );
078        }
079
080        /**
081         *  行番号を返します。
082         *
083         * @return   行番号
084         */
085        public int getNo() { return no; }
086
087        /**
088         *  結果を返します。
089         *
090         * @return   結果 0:正常 1:警告 2:異常 8:EXCEPTION 9:ORACLEエラー
091         */
092        public int getKekka() { return kekka; }
093
094        /**
095         *  メッセージIDを返します。
096         *
097         * @return   メッセージID
098         */
099        public String getId() { return id; }
100
101        /**
102         *  メッセージ引数を返します。
103         *
104         * @param    no 引数アドレス
105         *
106         * @return   メッセージ引数
107         */
108        public String getArg( final int no ) { return args[no]; }
109
110        /**
111         *  メッセージ引数配列を返します。
112         *
113         * @return   メッセージ引数配列
114         * @og.rtnNotNull
115         */
116        public String[] getArgs() { return args.clone(); }
117
118        /**
119         * 引数について、{#XXXX} 文字列の場合、#XXXX に変換します。
120         * この、{#XXXX} 文字列は、メッセージリソースの引数に、XXXX の
121         * ラベルリソースを適用させる場合に使用します。
122         * この処理は、メッセージリソースでの処理で互換性を確保する為です。
123         * なお、この変更のために、普通に、#YYYY と指定した文字列も、
124         * ラベルキーとして処理されるようになりますので、ご注意ください。
125         *
126         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
127         *
128         * @param    arg        入力引数
129         *
130         * @return   変換後引数
131         */
132        private String argIn( final String arg ) {
133                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
134                return arg != null && arg.startsWith( "{#" ) ? arg.substring( 1,arg.length()-1 ) : arg ;
135        }
136
137        /**
138         *  PG名を返します。
139         *
140         * @og.rev 3.8.9.5 (2007/09/12) 新規作成
141         *
142         * @return   PG名
143         */
144        public String getPg() { return pg; }
145
146        /**
147         *  ステップ名を返します。
148         *
149         * @og.rev 3.8.9.5 (2007/09/12) 新規作成
150         *
151         * @return   ステップ名
152         */
153        public String getStep() { return step; }
154
155        /**
156         *  デバッグ用のオブジェクトの内部表現の文字列を返します。
157         *
158         * @og.rev 4.0.0.0 (2004/12/31) 内部表現を文字のみとする。
159         *
160         * @return   内部表現の文字列
161         * @og.rtnNotNull
162         */
163        @Override
164        public String toString() {
165                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
166                        .append( "id=[" ).append( id ).append( "] no=[" ).append( no )          // 6.0.2.5 (2014/10/31) char を append する。
167                        .append( "] kekka=[" ).append( kekka ).append( "] values={" );
168                // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach
169//              for( int i=0; i<args.length; i++ ) {
170//                      if( args[i] != null ) {
171//                              buf.append( ' ' ).append( args[i] );            // 6.0.2.5 (2014/10/31) char を append する。
172//                      }
173//              }
174                for( final String arg : args ) {
175                        if( arg != null ) {
176                                buf.append( ' ' ).append( arg );                        // 6.0.2.5 (2014/10/31) char を append する。
177                        }
178                }
179                buf.append( " }" );
180                return buf.toString();
181        }
182}