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    }