2 * Copyright (c) 2009 The openGion Project.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13 * either express or implied. See the License for the specific language
14 * governing permissions and limitations under the License.
16 package org.opengion.hayabusa.taglib;
18 import org.opengion.hayabusa.common.HybsSystemException;
19 import org.opengion.hayabusa.resource.LabelInterface;
20 import org.opengion.fukurou.util.StringUtil;
21 import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17)
23 import static org.opengion.fukurou.util.StringUtil.nval ;
26 * 画面にラベルリソース等のメッセージを表示させるタグです。
28 * lbl 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、
30 * 違う値をセットした場合は、 セットした値が、そのまま出力されます。これは、ロケールが
31 * 見つからなかった場合の標準の対応方法です。
32 * ロケールは、ユーザー情報の lang 属性を初期値で使用し、 セットされていない場合は、
33 * リクエスト情報のロケールから取得します。
34 * lbl 属性を使用する場合、val0 ~ val9 までの引数を使用することができます。これは、
35 * メッセージフォーマットの、引数 {0} ~ {9} に対応して割り付けられます。
38 * ●形式:<og:message lbl="…" val0=[…] … />
39 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
43 * lbl 【TAG】ラベルリソースのラベルIDを指定します
44 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
45 * command 【TAG】コマンド (INSERT,COPY,MODIFY,DELETE)をセットします
46 * comment 【TAG】コメントを指定します
47 * type 【TAG】タイプを(Label,Short,Tips,Description)から指定します(初期値:Label)
48 * val0 【TAG】メッセージの引数{0}を指定します
49 * val1 【TAG】メッセージの引数{1}を指定します
50 * val2 【TAG】メッセージの引数{2}を指定します
51 * val3 【TAG】メッセージの引数{3}を指定します
52 * val4 【TAG】メッセージの引数{4}を指定します
53 * val5 【TAG】メッセージの引数{5}を指定します
54 * val6 【TAG】メッセージの引数{6}を指定します
55 * val7 【TAG】メッセージの引数{7}を指定します
56 * val8 【TAG】メッセージの引数{8}を指定します
57 * val9 【TAG】メッセージの引数{9}を指定します
58 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
59 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
60 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
61 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
62 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
63 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
68 * <og:message lbl="MSG0032" language="ja" />
70 * lbl : MessageResource.properties のキー
71 * language : ロケール(オプション)
74 * <og:message lbl="MSG0032" >検索条件</og:message>
76 * BODY 部分は、無視されます。コメント等に使用できます。
77 * HTMLファイルには、コメント部分は出力されません。
79 * typeをTipsにした場合には出力をclass=ogmsgのspanタグで囲います。 5.9.22.2 (2017/07/21)
84 * @author Kazuhiko Hasegawa
87 public class MessageTag extends CommonTagSupport {
88 /** このプログラムのVERSION文字列を設定します。 {@value} */
89 private static final String VERSION = "7.1.0.1 (2020/02/07)" ;
90 private static final long serialVersionUID = 710120200207L ;
92 private String comment ;
93 private String[] values ;
94 // 4.0.0 (2005/01/31) メッセージの種類を指定できるようにします。
95 private String type = "Label" ; // Label,Short,Tips,Description が指定できます。
96 private String cmdMsg ;
98 private static final String[] TYPE_LIST = { "Label","Short","Tips","Description" };
100 // 6.8.5.0 (2018/01/09) PMD Variables that are final and static should be all capitals。tipsPre,tipsSuf → TIPS_PRE,TIPS_SUF
101 private static final String TIPS_PRE = "<span class=\"ogmsg\">"; // 5.9.22.2 (2017/07/21)
102 private static final String TIPS_SUF = "</span>";
107 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
109 public MessageTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
112 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
114 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
116 * @return 後続処理の指示( EVAL_BODY_BUFFERED )
119 public int doStartTag() {
120 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
121 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
123 ? EVAL_BODY_BUFFERED // Body を評価する。( extends BodyTagSupport 時)
124 : SKIP_BODY ; // Body を評価しない
128 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
130 * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。
132 * @return 後続処理の指示(SKIP_BODY)
135 public int doAfterBody() {
136 final String str = getBodyString();
138 if( str != null && str.length() > 0 ) {
139 comment = StringUtil.htmlFilter( str );
146 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
148 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
149 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
154 public int doEndTag() {
155 debugPrint(); // 4.0.0 (2005/02/28)
156 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
158 jspPrint( makeTag() );
164 * タグリブオブジェクトをリリースします。
165 * キャッシュされて再利用されるので、フィールドの初期設定を行います。
167 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
168 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
172 protected void release2() {
176 type = "Label" ; // Label,Short,Tips,Description が指定できます。
183 * @og.rev 4.0.0.0 (2005/01/31) タイプ別メッセージ情報を返します。
184 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
185 * @og.ref 5.9.22.2 (2017/07/21) Tipsの場合のみ、前後をclass=ogmsg付きのspanで囲います。
186 * @og.rev 6.8.5.0 (2018/01/09) PMD Variables that are final and static should be all capitals。tipsPre,tipsSuf → TIPS_PRE,TIPS_SUF
187 * @og.rev 7.1.0.1 (2020/02/07) ショートラベルと概要に引数を渡します。
191 private String makeTag() {
194 final LabelInterface label = getLabelInterface();
196 final char ch = type.charAt(0); // Label,Short,Tips,Description
197 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
198 if( label == null ) {
199 val = cmdMsg == null ? comment : getResource().getLabel( cmdMsg ); // cmdMsg = INSERT,COPY,MODIFY,DELETE,null
203 case 'L': val = label.getMessage( values ); break;
204 // case 'S': val = label.getShortLabel(); break;
205 case 'S': val = label.getShortMessage( values ); break; // 7.1.0.1 (2020/02/07)
206 case 'T': val = TIPS_PRE + label.getLongLabel() + TIPS_SUF; break; // 6.8.5.0 (2018/01/09)
207 // case 'D': val = label.getDescription(); break;
208 case 'D': val = label.getDescription( values); break; // 7.1.0.1 (2020/02/07)
220 * msg 属性でメッセージリソースから読み取りますが、開発途中で
221 * リソース登録を済ましていない状態でコメントを入れる場合に、
224 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更
225 * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止
227 * @param cmnt コメント文字列
229 public void setComment( final String cmnt ) {
234 * 【TAG】タイプ[Label/Short/Tips/Description]を指定します(初期値:Label)。
237 * タイプは、ラベル/メッセージリソースのどの情報を取得したいかを指定できます。
238 * 従来のラベル/メッセージは、Label に相当します。
239 * なお、指定は、それぞれの頭文字('L','S','T','D')のみでも可能です。
241 * ・Label : ラベル/メッセージ表示
242 * ・Short : 表形式で使用する短いラベル表示
243 * ・Tips : ラベルの上にTips表示
244 * ・Description : 概要説明を表示
246 * @og.rev 4.0.0.0 (2005/01/31) 新規登録
248 * @param tp タイプ文字列 [Label/Short/Tips/Description]
250 public void setType( final String tp ) {
251 type = nval( getRequestParameter( tp ),type );
253 final char ch = type.charAt(0); // Label,Short,Tips,Description
255 if( "LSTD".indexOf( ch ) < 0 ) {
256 final String errMsg = "type に、指定不可能な文字が設定されました。type=[" + type
257 + "] TYPE_LIST=[" + StringUtil.array2csv( TYPE_LIST ) + "]";
258 throw new HybsSystemException( errMsg );
263 * 【TAG】メッセージの引数{0}を指定します。
265 * @og.tag メッセージの引数を指定します。
267 * @param value メッセージの引数
269 public void setVal0( final String value ) { setValues( 0, value ); }
272 * 【TAG】メッセージの引数{1}を指定します。
274 * @og.tag メッセージの引数を指定します。
276 * @param value メッセージの引数
278 public void setVal1( final String value ) { setValues( 1, value ); }
281 * 【TAG】メッセージの引数{2}を指定します。
283 * @og.tag メッセージの引数を指定します。
285 * @param value メッセージの引数
287 public void setVal2( final String value ) { setValues( 2, value ); }
290 * 【TAG】メッセージの引数{3}を指定します。
292 * @og.tag メッセージの引数を指定します。
294 * @param value メッセージの引数
296 public void setVal3( final String value ) { setValues( 3, value ); }
299 * 【TAG】メッセージの引数{4}を指定します。
301 * @og.tag メッセージの引数を指定します。
303 * @param value メッセージの引数
305 public void setVal4( final String value ) { setValues( 4, value ); }
308 * 【TAG】メッセージの引数{5}を指定します。
310 * @og.tag メッセージの引数を指定します。
312 * @param value メッセージの引数
314 public void setVal5( final String value ) { setValues( 5, value ); }
317 * 【TAG】メッセージの引数{6}を指定します。
319 * @og.tag メッセージの引数を指定します。
321 * @param value メッセージの引数
323 public void setVal6( final String value ) { setValues( 6, value ); }
326 * 【TAG】メッセージの引数{7}を指定します。
328 * @og.tag メッセージの引数を指定します。
330 * @param value メッセージの引数
332 public void setVal7( final String value ) { setValues( 7, value ); }
335 * 【TAG】メッセージの引数{8}を指定します。
337 * @og.tag メッセージの引数を指定します。
339 * @param value メッセージの引数
341 public void setVal8( final String value ) { setValues( 8, value ); }
344 * 【TAG】メッセージの引数{9}を指定します。
346 * @og.tag メッセージの引数{9}を指定します。
348 * @param value メッセージの引数
350 public void setVal9( final String value ) { setValues( 9, value ); }
355 * @param no メッセージの引数の配列番号
356 * @param value メッセージの引数
358 private void setValues( final int no,final String val ) {
359 if( values == null ) { values = new String[10]; }
360 values[no] = getRequestParameter( val );
364 * 【TAG】コマンド (INSERT,COPY,MODIFY,DELETE)をセットします。
367 * コマンドは、HTMLから(get/post)指定されますので、CMD_xxx で設定される
368 * フィールド定数値のいづれかを、指定できます。
369 * コマンド (INSERT,COPY,MODIFY,DELETE)に対応したメッセージを表示します。
370 * INSERT : MSG0044 追加処理を行います。
371 * COPY : MSG0045 複写処理を行います。
372 * MODIFY : MSG0046 変更処理を行います。
373 * DELETE : MSG0047 削除処理を行います。
375 * なお、command によるメッセージの自動選択は、lbl ともにセットされていない
378 * @og.rev 4.0.0.0 (2006/11/31) 新規登録
380 * @param cmd コマンド (public static final 宣言されている文字列)
382 public void setCommand( final String cmd ) {
383 final String cmd2 = nval( getRequestParameter( cmd ),null );
384 if( "INSERT".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0044"; }
385 else if( "COPY".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0045"; }
386 else if( "MODIFY".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0046"; }
387 else if( "DELETE".equalsIgnoreCase( cmd2 ) ) { cmdMsg = "MSG0047"; }
388 else { cmdMsg = null; }
392 * このオブジェクトの文字列表現を返します。
395 * @return このクラスの文字列表現
399 public String toString() {
400 return ToString.title( this.getClass().getName() )
401 .println( "VERSION" ,VERSION )
402 .println( "comment" ,comment )
403 .println( "values" ,values )
404 .println( "type" ,type )
405 .println( "TYPE_LIST" ,TYPE_LIST )
406 .println( "Other..." ,getAttributes().getAttribute() )
407 .fixForm().toString() ;