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