    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                args = new String[cnt];
    060                for( int i=0; i<cnt; i++ ) {
    061                        args[i] = argIn( inArgs[i] );
    062                }
    063                this.pg         = pg;           // 3.8.9.5 (2007/09/12)
    064                this.step       = step;         // 3.8.9.5 (2007/09/12)
    065        }
    066
    067        /**
    068         *  行番号のみ異なる、新しい ErrMsg オブジェクトを作成します。
    069         *
    070         * @param    newNo 行番号
    071         *
    072         * @return   行番号のみ異なる、新しい ErrMsgオブジェクト
    073         * @og.rtnNotNull
    074         */
    075        public ErrMsg copy( final int newNo ) {
    076                return new ErrMsg( newNo,kekka,pg,step,id,args );
    077        }
    078
    079        /**
    080         *  行番号を返します。
    081         *
    082         * @return   行番号
    083         */
    084        public int getNo() { return no; }
    085
    086        /**
    087         *  結果を返します。
    088         *
    089         * @return   結果 0:正常 1:警告 2:異常 8:EXCEPTION 9:ORACLEエラー
    090         */
    091        public int getKekka() { return kekka; }
    092
    093        /**
    094         *  メッセージIDを返します。
    095         *
    096         * @return   メッセージID
    097         */
    098        public String getId() { return id; }
    099
    100        /**
    101         *  メッセージ引数を返します。
    102         *
    103         * @param    no 引数アドレス
    104         *
    105         * @return   メッセージ引数
    106         */
    107        public String getArg( final int no ) { return args[no]; }
    108
    109        /**
    110         *  メッセージ引数配列を返します。
    111         *
    112         * @return   メッセージ引数配列
    113         * @og.rtnNotNull
    114         */
    115        public String[] getArgs() { return args.clone(); }
    116
    117        /**
    118         * 引数について、{#XXXX} 文字列の場合、#XXXX に変換します。
    119         * この、{#XXXX} 文字列は、メッセージリソースの引数に、XXXX の
    120         * ラベルリソースを適用させる場合に使用します。
    121         * この処理は、メッセージリソースでの処理で互換性を確保する為です。
    122         * なお、この変更のために、普通に、#YYYY と指定した文字列も、
    123         * ラベルキーとして処理されるようになりますので、ご注意ください。
    124         *
    125         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    126         *
    127         * @param    arg        入力引数
    128         *
    129         * @return   変換後引数
    130         */
    131        private String argIn( final String arg ) {
    132                // 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
    133                return arg != null && arg.startsWith( "{#" ) ? arg.substring( 1,arg.length()-1 ) : arg ;
    134        }
    135
    136        /**
    137         *  PG名を返します。
    138         *
    139         * @og.rev 3.8.9.5 (2007/09/12) 新規作成
    140         *
    141         * @return   PG名
    142         */
    143        public String getPg() { return pg; }
    144
    145        /**
    146         *  ステップ名を返します。
    147         *
    148         * @og.rev 3.8.9.5 (2007/09/12) 新規作成
    149         *
    150         * @return   ステップ名
    151         */
    152        public String getStep() { return step; }
    153
    154        /**
    155         *  デバッグ用のオブジェクトの内部表現の文字列を返します。
    156         *
    157         * @og.rev 4.0.0.0 (2004/12/31) 内部表現を文字のみとする。
    158         *
    159         * @return   内部表現の文字列
    160         * @og.rtnNotNull
    161         */
    162        @Override
    163        public String toString() {
    164                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    165                        .append( "id=[" ).append( id ).append( "] no=[" ).append( no ).append( ']' )            // 6.0.2.5 (2014/10/31) char を append する。
    166                        .append( " kekka=[" ).append( kekka ).append( "] values={" );
    167                for( int i=0; i<args.length; i++ ) {
    168                        if( args[i] != null ) {
    169                                buf.append( ' ' ).append( args[i] );            // 6.0.2.5 (2014/10/31) char を append する。
    170                        }
    171                }
    172                buf.append( " }" );
    173                return buf.toString();
    174        }
    175}