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