    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.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystemException;
    019import org.opengion.hayabusa.resource.LabelInterface;
    020import org.opengion.fukurou.util.StringUtil;
    021
    022import static org.opengion.fukurou.util.StringUtil.nval ;
    023
    024/**
    025 * 画面にラベルリソース等のメッセージを表示させるタグです。
    026 *
    027 * lbl 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、
    028 * 画面に表示します。
    029 * 違う値をセットした場合は、 セットした値が、そのまま出力されます。これは、ロケールが
    030 * 見つからなかった場合の標準の対応方法です。
    031 * ロケールは、ユーザー情報の lang 属性を初期値で使用し、 セットされていない場合は、
    032 * リクエスト情報のロケールから取得します。
    033 * lbl 属性を使用する場合、val0 〜 val9 までの引数を使用することができます。これは、
    034 * メッセージフォーマットの、引数 {0} 〜 {9} に対応して割り付けられます。
    035 *
    036 * @og.formSample
    037 * ●形式：&lt;og:message lbl="…" val0=[…] … /&gt;
    038 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    039 *
    040 * ●Tag定義：
    041 *   &lt;og:message
    042 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    043 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    044 *       command            【TAG】コマンド(INSERT,COPY,MODIFY,DELETE)をセットします
    045 *       comment            【TAG】コメントを指定します
    046 *       type               【TAG】タイプを(Label,Short,Tips,Description)から指定します(初期値:Label)
    047 *       val0               【TAG】メッセージの引数{0}を指定します
    048 *       val1               【TAG】メッセージの引数{1}を指定します
    049 *       val2               【TAG】メッセージの引数{2}を指定します
    050 *       val3               【TAG】メッセージの引数{3}を指定します
    051 *       val4               【TAG】メッセージの引数{4}を指定します
    052 *       val5               【TAG】メッセージの引数{5}を指定します
    053 *       val6               【TAG】メッセージの引数{6}を指定します
    054 *       val7               【TAG】メッセージの引数{7}を指定します
    055 *       val8               【TAG】メッセージの引数{8}を指定します
    056 *       val9               【TAG】メッセージの引数{9}を指定します
    057 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    058 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    059 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true)
    060 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true)
    061 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    062 *   &gt;   ... Body ...
    063 *   &lt;/og:message&gt;
    064 *
    065 * ●使用例
    066 *     &lt;og:message lbl=&quot;MSG0032&quot; language=&quot;ja&quot; /&gt;
    067 *
    068 *        lbl       : MessageResource.properties のキー
    069 *        language  : ロケール(オプション)
    070 *
    071 *     例１)
    072 *         &lt;og:message lbl=&quot;MSG0032&quot; &gt;検索条件&lt;/og:message&gt;
    073 *
    074 *        BODY 部分は、無視されます。コメント等に使用できます。
    075 *        HTMLファイルには、コメント部分は出力されません。
    076 *
    077 *        typeをTipsにした場合には出力をclass=ogmsgのspanタグで囲います。
    078 *
    079 * @og.group 画面部品
    080 *
    081 * @version  4.0
    082 * @author   Kazuhiko Hasegawa
    083 * @since    JDK5.0,
    084 */
    085public class MessageTag extends CommonTagSupport {
    086        //* このプログラムのVERSION文字列を設定します。   {@value} */
    087        private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
    088
    089        private static final long serialVersionUID = 522020101101L ;
    090
    091        private String          comment = null;
    092        private String[]        values  = null;
    093        // 4.0.0 (2005/01/31) メッセージの種類を指定できるようにします。
    094        private String          type    = "Label" ;     // Label,Short,Tips,Description が指定できます。
    095        private String          cmdMsg  = null;
    096
    097        private static final String[] TYPE_LIST = new String[] { "Label","Short","Tips","Description" };
    098
    099        private static  final String tipsPre = "<span class=\"ogmsg\">"; // 5.9.22.2 (2017/07/21)
    100        private static  final String tipsSuf = "</span>";
    101
    102        /**
    103         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    104         *
    105         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    106         *
    107         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    108         */
    109        @Override
    110        public int doStartTag() {
    111                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    112                if( useTag() ) {
    113                        return( EVAL_BODY_BUFFERED );   // Body を評価する。( extends BodyTagSupport 時)
    114                }
    115                return ( SKIP_BODY );                           // Body を評価しない
    116        }
    117
    118        /**
    119         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    120         *
    121         * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。
    122         *
    123         * @return      後続処理の指示(SKIP_BODY)
    124         */
    125        @Override
    126        public int doAfterBody() {
    127                String str = getBodyString();
    128
    129                if( str != null && str.length() > 0 ) {
    130                        comment = StringUtil.htmlFilter( str );
    131                }
    132
    133                return(SKIP_BODY);
    134        }
    135
    136        /**
    137         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    138         *
    139         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    140         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    141         *
    142         * @return      後続処理の指示
    143         */
    144        @Override
    145        public int doEndTag() {
    146                debugPrint();           // 4.0.0 (2005/02/28)
    147                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    148                if( useTag() ) {
    149                        jspPrint( makeTag() );
    150                }
    151                return(EVAL_PAGE);
    152        }
    153
    154        /**
    155         * タグリブオブジェクトをリリースします。
    156         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    157         *
    158         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    159         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    160         *
    161         */
    162        @Override
    163        protected void release2() {
    164                super.release2();
    165                comment = null;
    166                values  = null;
    167                type    = "Label" ;     // Label,Short,Tips,Description が指定できます。
    168                cmdMsg  = null;
    169        }
    170
    171        /**
    172         * 表示用の文字列を指定します。
    173         *
    174         * @og.rev 4.0.0.0 (2005/01/31) タイプ別メッセージ情報を返します。
    175         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
    176         * @og.ref 5.9.22.2 (2017/07/21) Tipsの場合のみ、前後をclass=ogmsg付きのspanで囲います。
    177         *
    178         * @return  変換後の文字列
    179         */
    180        private String makeTag() {
    181                String val  = null;
    182
    183                LabelInterface label = getLabelInterface();
    184
    185                char ch = type.charAt( 0 );     // Label,Short,Tips,Description
    186                if( label != null ) {
    187                        switch( ch ) {
    188                                case 'L': val = label.getMessage( values ); break;
    189                                case 'S': val = label.getShortLabel(); break;
    190//                              case 'T': val = label.getLongLabel(); break;
    191                                case 'T': val = tipsPre + label.getLongLabel() + tipsSuf; break; // 5.9.22.2 (2017/07/21)
    192                                case 'D': val = label.getDescription(); break;
    193                                default : break;
    194                        }
    195                }
    196                else {
    197                        if( cmdMsg != null ) {
    198                                // cmdMsg = INSERT,COPY,MODIFY,DELETE,null
    199//                              val = getResource().getMessage( cmdMsg );
    200                                val = getResource().getLabel( cmdMsg );
    201                        }
    202                        else {
    203                                val = comment;
    204                        }
    205                }
    206
    207                return val;
    208        }
    209
    210        /**
    211         * 【TAG】コメントを指定します。
    212         *
    213         * @og.tag
    214         * msg 属性でメッセージリソースから読み取りますが,開発途中で
    215         * リソース登録を済ましていない状態でコメントを入れる場合に、
    216         * 直接コメントをかけるようにします。
    217         *
    218         * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
    219         * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
    220         *
    221         * @param   cmnt コメント文字列
    222         */
    223        public void setComment( final String cmnt ) {
    224                comment = cmnt;
    225        }
    226
    227        /**
    228         * 【TAG】タイプを(Label,Short,Tips,Description)から指定します(初期値:Label)。
    229         *
    230         * @og.tag
    231         * タイプは、ラベル／メッセージリソースのどの情報を取得したいかを指定できます。
    232         * 従来のラベル／メッセージは、Label に相当します。
    233         * なお、指定は、それぞれの頭文字('L','S','T','D')のみでも可能です。
    234         * 初期値は、"Label" です。
    235         * ・Label  : ラベル／メッセージ表示
    236         * ・Short  : 表形式で使用する短いラベル表示
    237         * ・Tips   : ラベルの上にTips表示
    238         * ・Description : 概要説明を表示
    239         *
    240         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
    241         *
    242         * @param   tp タイプ文字列('L','S','T','D','B')
    243         */
    244        public void setType( final String tp ) {
    245                type = nval( getRequestParameter( tp ),type );
    246
    247                char ch = type.charAt( 0 );     // Label,Short,Tips,Description
    248
    249                if( "LSTD".indexOf( ch ) < 0 ) {
    250                        String errMsg = "type に、指定不可能な文字が設定されました。type=[" + type
    251                                        + "] TYPE_LIST=[" + StringUtil.array2csv( TYPE_LIST ) + "]";
    252                        throw new HybsSystemException( errMsg );
    253                }
    254        }
    255
    256        /**
    257         * 【TAG】メッセージの引数{0}を指定します。
    258         *
    259         * @og.tag メッセージの引数を指定します。
    260         *
    261         * @param   value メッセージの引数
    262         */
    263        public void setVal0( final String value ) { setValues( 0, value ); }
    264
    265        /**
    266         * 【TAG】メッセージの引数{1}を指定します。
    267         *
    268         * @og.tag メッセージの引数を指定します。
    269         *
    270         * @param   value メッセージの引数
    271         */
    272        public void setVal1( final String value ) { setValues( 1, value ); }
    273
    274        /**
    275         * 【TAG】メッセージの引数{2}を指定します。
    276         *
    277         * @og.tag メッセージの引数を指定します。
    278         *
    279         * @param   value メッセージの引数
    280         */
    281        public void setVal2( final String value ) { setValues( 2, value ); }
    282
    283        /**
    284         * 【TAG】メッセージの引数{3}を指定します。
    285         *
    286         * @og.tag メッセージの引数を指定します。
    287         *
    288         * @param   value メッセージの引数
    289         */
    290        public void setVal3( final String value ) { setValues( 3, value ); }
    291
    292        /**
    293         * 【TAG】メッセージの引数{4}を指定します。
    294         *
    295         * @og.tag メッセージの引数を指定します。
    296         *
    297         * @param   value メッセージの引数
    298         */
    299        public void setVal4( final String value ) { setValues( 4, value ); }
    300
    301        /**
    302         * 【TAG】メッセージの引数{5}を指定します。
    303         *
    304         * @og.tag メッセージの引数を指定します。
    305         *
    306         * @param   value メッセージの引数
    307         */
    308        public void setVal5( final String value ) { setValues( 5, value ); }
    309
    310        /**
    311         * 【TAG】メッセージの引数{6}を指定します。
    312         *
    313         * @og.tag メッセージの引数を指定します。
    314         *
    315         * @param   value メッセージの引数
    316         */
    317        public void setVal6( final String value ) { setValues( 6, value ); }
    318
    319        /**
    320         * 【TAG】メッセージの引数{7}を指定します。
    321         *
    322         * @og.tag メッセージの引数を指定します。
    323         *
    324         * @param   value メッセージの引数
    325         */
    326        public void setVal7( final String value ) { setValues( 7, value ); }
    327
    328        /**
    329         * 【TAG】メッセージの引数{8}を指定します。
    330         *
    331         * @og.tag メッセージの引数を指定します。
    332         *
    333         * @param   value メッセージの引数
    334         */
    335        public void setVal8( final String value ) { setValues( 8, value ); }
    336
    337        /**
    338         * 【TAG】メッセージの引数{9}を指定します。
    339         *
    340         * @og.tag メッセージの引数{9}を指定します。
    341         *
    342         * @param   value メッセージの引数
    343         */
    344        public void setVal9( final String value ) { setValues( 9, value ); }
    345
    346        /**
    347         * メッセージの引数を指定します。
    348         *
    349         * @param   no    メッセージの引数の配列番号
    350         * @param   value メッセージの引数
    351         */
    352        private void setValues( final int no,final String val ) {
    353                if( values == null ) { values = new String[10]; }
    354                values[no] = getRequestParameter( val );
    355        }
    356
    357        /**
    358         * 【TAG】コマンド(INSERT,COPY,MODIFY,DELETE)をセットします。
    359         *
    360         * @og.tag
    361         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
    362         * フィールド定数値のいづれかを、指定できます。
    363         * コマンド(INSERT,COPY,MODIFY,DELETE)に対応したメッセージを表示します。
    364         * INSERT : MSG0044  追加処理を行います。
    365         * COPY   : MSG0045  複写処理を行います。
    366         * MODIFY : MSG0046  変更処理を行います。
    367         * DELETE : MSG0047  削除処理を行います。
    368         *
    369         * なお、command によるメッセージの自動選択は、lbl ともにセットされていない
    370         * 場合にのみ有効になります。
    371         *
    372         * @og.rev 4.0.0.0 (2006/11/31) 新規登録
    373         *
    374         * @param       cmd コマンド(public static final 宣言されている文字列)
    375         */
    376        public void setCommand( final String cmd ) {
    377                String cmd2 = nval( getRequestParameter( cmd ),null );
    378                if(      "INSERT".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0044"; }
    379                else if( "COPY".equalsIgnoreCase(   cmd2 ) ) { cmdMsg = "MSG0045"; }
    380                else if( "MODIFY".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0046"; }
    381                else if( "DELETE".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0047"; }
    382                else { cmdMsg = null; }
    383        }
    384
    385        /**
    386         * このオブジェクトの文字列表現を返します。
    387         * 基本的にデバッグ目的に使用します。
    388         *
    389         * @return このクラスの文字列表現
    390         */
    391        @Override
    392        public String toString() {
    393                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    394                                .println( "VERSION"             ,VERSION        )
    395                                .println( "comment"             ,comment        )
    396                                .println( "values"              ,values         )
    397                                .println( "type"                ,type           )
    398                                .println( "TYPE_LIST"   ,TYPE_LIST      )
    399                                .println( "Other..."    ,getAttributes().getAttribute() )
    400                                .fixForm().toString() ;
    401        }
    402}