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 * ●形式:<og:message lbl="…" val0=[…] … />
038 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
039 *
040 * ●Tag定義:
041 *   <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 *   >   ... Body ...
063 *   </og:message>
064 *
065 * ●使用例
066 *     <og:message lbl="MSG0032" language="ja" />
067 *
068 *        lbl       : MessageResource.properties のキー
069 *        language  : ロケール(オプション)
070 *
071 *     例1)
072 *         <og:message lbl="MSG0032" >検索条件</og:message>
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}