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}