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.fukurou.util.StringUtil ; 019import static org.opengion.fukurou.util.StringUtil.nval ; 020 021/** 022 * {@XXXX} 変数の特殊処理を、動的に実行するタグです。 023 * 024 * このタグの目的は、{@XXXX} 変数の使い方をドキュメント化することにあります。 025 * 通常は、動的な編集処理を行う必要はありません。 026 * 027 * 通常のリクエスト変数は、{@XXXX} で取り出すことが可能です。ところが、 028 * {@SYS.XXXX} 、{@USER.XXXX} 、{@GUI.XXXX}、 などのシステム予約の 029 * 変数を取り出す場合に、XXXX 部分を動的に変更することは出来ません。 030 * このタグは、簡易的に、XXXX を引数に取り、動的に取り出すことができるようにします。 031 * 032 * @og.formSample 033 * ●形式: 034 * <og:requestValue 035 * sys = "XXXX" システムパラメータ の値を取得 036 * user = "ID" UserInfoオブジェクトの値を取得(og:userInfo) 037 * gui = "KEY" GUIInfoオブジェクトの値を取得 038 * mem = "XXXX" REQUEST_CACHE の値を取得 039 * lbl = "XXXX" ラベルリソースの値を取得 040 * msg = "XXXX" メッセージリソースの値を取得 041 * db = "COUNT" データベース実行結果を取得 042 * session = "XXXX" session Attribute の値を取得 043 * date = "XXXX" 日付関係の値を取得 044 * nvar = "XXXX" Unicode文字列の値を HTML のエスケープ記号(&#xZZZZ;)に変換します。 045 * > 046 * ●body:なし 047 * 048 * ●Tag定義: 049 * <og:requestValue 050 * sys 【TAG】{@SYS.XXXX} と同等のシステムパラメータ の値を取得します 051 * user 【TAG】{@USER.XXXX} と同等のUserInfoオブジェクトの値を取得します 052 * gui 【TAG】{@GUI.XXXX} と同等のGUIInfoオブジェクトの値を取得します 053 * mem 【TAG】{@MEM.XXXX} と同等のREQUEST_CACHE の値を取得します 054 * lbl 【TAG】{@LBL.XXXX} と同等のラベルリソースの値を取得します 055 * db 【TAG】データベース実行結果を取得します 056 * session 【TAG】session Attribute の値を取得します 057 * date 【TAG】日付関係の値を取得します 058 * nvar 【TAG】Unicode文字列の値を HTML のエスケープ記号(&#xZZZZ;)に変換します 059 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 060 * /> 061 * 062 * 063 * @og.rev 3.8.0.2 (2005/07/11) 新規作成 064 * @og.group 画面部品 065 * 066 * @version 0.9.0 2000/10/17 067 * @author Kazuhiko Hasegawa 068 * @since JDK5.0, 069 */ 070public class RequestValueTag extends CommonTagSupport { 071 //* このプログラムのVERSION文字列を設定します。 {@value} */ 072 private static final String VERSION = "4.0.0.0 (2007/10/18)" ; 073 074 private static final long serialVersionUID = 400020071018L ; 075 076 private String sys = null; 077 private String user = null; 078 private String gui = null; 079 private String mem = null; 080 private String lbl = null; 081// private String msg = null; 082 private String db = null; 083 private String session = null; 084 private String date = null; 085 private String nvar = null; 086 087 /** 088 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 089 * 090 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 091 * 092 * @return 後続処理の指示 093 */ 094 @Override 095 public int doEndTag() { 096 debugPrint(); // 4.0.0 (2005/02/28) 097 098 StringBuilder buf = new StringBuilder(); 099 100 if( sys != null ) { 101 buf.append( sys( sys.trim() ) ); 102 } 103 else if( user != null ) { 104 buf.append( getUserInfo( user.trim() ) ); 105 } 106 else if( gui != null ) { 107 buf.append( getGUIInfoAttri( gui.trim() ) ); 108 } 109 else if( mem != null ) { 110 buf.append( getRequestCacheData( mem.trim() ) ); 111 } 112 else if( lbl != null ) { 113 buf.append( getLabel( lbl.trim() ) ); 114 } 115// else if( msg != null ) { 116// buf.append( getMessage( msg.trim() ) ); 117// } 118 else if( db != null ) { 119 buf.append( getRequestParameter( "{@DB." + db.trim() + "}" ) ); 120 } 121 else if( session != null ) { 122 buf.append( getSessionAttribute( session.trim() ) ); 123 } 124 else if( date != null ) { 125 buf.append( getDateFormat( date.trim() ) ); 126 } 127 else if( nvar != null ) { 128 buf.append( StringUtil.getUnicodeEscape( getRequestValue( nvar.trim() ) ) ); 129 } 130 131 jspPrint( buf.toString() ); 132 133 return(EVAL_PAGE); // ページの残りを評価する。 134 } 135 136 /** 137 * タグリブオブジェクトをリリースします。 138 * 139 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 140 * 141 */ 142 @Override 143 protected void release2() { 144 super.release2(); 145 sys = null; 146 user = null; 147 gui = null; 148 mem = null; 149 lbl = null; 150// msg = null; 151 db = null; 152 session = null; 153 date = null; 154 nvar = null; 155 } 156 157 /** 158 * 【TAG】{@SYS.XXXX} と同等のシステムパラメータ の値を取得します。 159 * 160 * @og.tag 161 * 本来は、システムパラメータ の値を取得できますが、システム的な共有値も 162 * 取得できるように機能追加しています。 163 * また、ユーザー個別にシステムパラメータを変更できます。この取得は、 164 * システムパラメータとして取得します。(値はユーザー個別値を返します。) 165 * 166 * SERVER_NAME このTomcatが実行しているサーバー名 localhost 等 167 * SERVER_URL Portも含むURLアドレス http://localhost:8823/ 168 * CONTEXT_URL 実行しているコンテキストのURLアドレス http://localhost:8823/dbdef2/ 169 * REAL_PATH / ルートに対応する物理ディレクトリ d:/webapps/dbdef2/ 等 170 * CONTEXT_NAME コンテキスト名(webapps 直下の仮想フォルダ名) dbdef 等 171 * DATE YMDH とほぼ同じですが、'yyyy/MM/dd HH:mm:ss' の形式で取得できます。 172 * 任意 ユーザーパラメータ(GE16) の値/システムパラメータ(GE12)の値を取得 173 * 174 * {@SYS.COOKIE.カラム名}で、Cookie の読み込みを行えます。 175 * 上記以外に、予約語や、システムパラメータ の値の読取が可能です。 176 * 177 * @param val キャッシュするサブキー 178 */ 179 public void setSys( final String val ) { 180 sys = nval( getRequestParameter( val ),sys ); 181 } 182 183 /** 184 * 【TAG】{@USER.XXXX} と同等のUserInfoオブジェクトの値を取得します。 185 * 186 * @og.tag 187 * ユーザーパラメータとは異なります。 188 * 189 * 以下の値は UserInfo オブジェクトの項目から取得します。 190 * 191 * ・JNAME ユーザー日本語名称 192 * ・ID ユーザーID 193 * ・IDNO USER.ID が5Byte以上の時のみ先頭1文字を除いたユーザーID 194 * ・INFO ユーザー情報(ユーザーID:日本語名称) 195 * ・LANG 言語 196 * ・ROLES ロール 197 * ・IPADDRESS IPアドレス 198 * ・LOGINTIME ログイン時刻 199 * 200 * 以下の値はあらかじめ、動的に作成されます。 201 * 202 * ・YMD 8byte の今日のシステム日付 203 * ・YMDH 14byte の今日のシステム日時 204 * 205 * それ以外は、外部より設定された値です。 206 * 207 * @param val キャッシュするサブキー 208 */ 209 public void setUser( final String val ) { 210 user = nval( getRequestParameter( val ),user ); 211 } 212 213 /** 214 * 【TAG】{@GUI.XXXX} と同等のGUIInfoオブジェクトの値を取得します。 215 * 216 * @og.tag 217 * GUIInfo オブジェクトで定義されている属性情報を取り出すことが出来ます。 218 * 引数は、"XXXX ID" という状態で受け取ります。(GUI. ははずした形) 219 * XXXXには、画面情報(GUIInfo)の属性キーを指定します。IDが指定されない場合は、 220 * 実行中の自分自身の画面が指定されたことになります。 221 * これは、session 登録項目 の HybsSystem#GUIINFO_KEY キー の値で取得します。 222 * この値は,画面が呼び出される毎に毎回設定されており、リクエスト毎に 223 * 所得し直す必要があります。 224 * 225 * ID に、画面IDを指定した場合は、@ 指定によるリクエスト引数の値を適用できます。 226 * {@GUI.@XXXX ID} や、{@GUI.XXXX @ID} です。(同時指定も可能) 227 * 228 * ・KEY 画面ID 229 * ・ADDRESS 実行アドレス 230 * ・REALADDRESS 実行実アドレス 231 * ・SEQUENCE 表示順 232 * ・GROUPS メニュグループ 233 * ・CLASSIFY メニュ分類 234 * ・LEVEL メニュ階層番号 235 * ・LABEL 画面名称 236 * ・NAME 画面名称(=SNAME) 237 * ・SNAME 画面名称(short) 238 * ・LNAME 画面名称(long) 239 * ・ROLES ロールズ 240 * ・MODE アクセスモード列(mr,mw,-r,-w の羅列) 241 * ・TARGET ターゲット 242 * ・PARAM 設定値(パラメータ) 243 * ・KBLINK リンク区分 244 * ・DESCRIPTION 概要説明 245 * 246 * @param val 画面情報を取り出すキー 247 */ 248 public void setGui( final String val ) { 249 gui = nval( getRequestParameter( val ),gui ); 250 } 251 252 /** 253 * 【TAG】{@MEM.XXXX} と同等のREQUEST_CACHE の値を取得します。 254 * 255 * @og.tag 256 * 検索時の request 情報をキャッシュしているメモリ上から値を取り出します。 257 * 通常は、query_init.jsp で定義されている GAMENID付の 258 * リクエストキャッシュ情報を取り出します。 259 * 260 * @param val キャッシュするサブキー 261 */ 262 public void setMem( final String val ) { 263 mem = nval( getRequestParameter( val ),mem ); 264 } 265 266 /** 267 * 【TAG】{@LBL.XXXX} と同等のラベルリソースの値を取得します。 268 * 269 * @og.tag 270 * ラベルリソースのロケールは、ログインユーザーのロケールになります。 271 * これは、{@LBL.XXXX Y} 引数処理をおこなうための、サポートメソッドです。 272 * 引数は、"XXXX Y" という状態で受け取ります。(LBL. ははずした形) 273 * ラベルには、通常のラベル(Label)以外に、Short,Tips,Comment の情報を持っています。 274 * {@LBL.XXXX Y} の Y に、先のLabel,Short,Tips,Comment の頭文字('L','S','T','C')を 275 * 指定することで、それぞれの状態を取得することが可能になります。 276 * Y を指定しない場合({@LBL.XXXX}) は、'L' が指定された場合と同じ効果があります。 277 * Y は、先頭文字1文字で判断していますので、{@LBL.XXXX Short}と記述できます。 278 * Y 引数には、@で始まるリクエスト引数が指定できます。例えば、{@LBL.XXXX @ZZ} 279 * とすると、ZZ のリクエスト引数の値が Y に適用されます。 280 * ラベルキーそのものをパラメータ化することが出来ます。 281 * これは、{@LBL.@XXXX}という形式になります。引数は、先の説明と同じです。 282 * この場合は、XXXX をキーにリクエスト引数の値が、ラベルリソースのキーになります。 283 * 284 * @param val キャッシュするサブキー 285 */ 286 @Override 287 public void setLbl( final String val ) { 288 lbl = nval( getRequestParameter( val ),lbl ); 289 } 290 291 /** 292 * 【TAG】{@MSG.XXXX} と同等のメッセージリソースの値を取得します。 293 * 294 * @og.tag 295 * メッセージリソースのロケールは、ログインユーザーのロケールになります。 296 * メッセージリソースでは、{@MSG.XXXX AA @BB #CC} という引数処理をおこなう 297 * 事が可能です。 298 * 引数は、"XXXX AA @BB #CC" という状態で受け取ります。(MSG. ははずした形) 299 * "AA @BB #CC" は、スペースで区切られたメッセージリソースの引数文字です。 300 * この、引数文字には、通常文字(AA)、リクエスト文字(@BB)、ラベル文字(#CC)が指定できます。 301 * ・通常文字(AA):そのまま、メッセージリソースの引数にセットされます。 302 * ・リクエスト文字(@BB):リクエスト引数に置き換えます。通常、{@BB} 指定しますが、 303 * メッセージパラメータの引数、{@XXXX ・・・ {@BB} ・・・} と、入れ子で指定できないため、 304 * {@XXXX ・・・ @BB ・・・} と、省略形で指定します。よって、引数として、通常文字の 305 * 先頭に、"@" を使用することは出来ません。 306 * ・ラベル文字(#CC):ラベルキーを指定されたと解釈して、処理します。これは、"CC"を 307 * キーに、ラベルリソースを検索し、その言語に応じた文字に変換後、メッセージリソースの 308 * 引数に指定します。PL/SQL等で、SET_ERRMSGS プロシージャの引数に、{#CC} 文字を 309 * 指定して、ラベルリソースを利用できますが、{@XXXX ・・・ {#CC} ・・・} と、入れ子で 310 * 指定できないため、{@XXXX ・・・ #CC ・・・} と、省略形で指定します。 311 * よって、引数として、通常文字の先頭に、"#" を使用することは出来ません。(エスケープ未採用) 312 * メッセージキーそのものをパラメータ化することが出来ます。 313 * これは、{@MSG.@XXXX}という形式になります。引数は、先の説明と同じです。 314 * この場合は、XXXX をキーにリクエスト引数の値が、メッセージリソースのキーになります。 315 * 316 * @param val キャッシュするサブキー 317 */ 318// public void setMsg( final String val ) { 319// msg = nval( getRequestParameter( val ),msg ); 320// } 321 322 /** 323 * 【TAG】データベース実行結果を取得します。 324 * 325 * @og.tag 326 * 検索結果の件数を、"DB.COUNT" キーでリクエストにセットしています。 327 * 検索結果を、"DB.ERR_CODE" キーでリクエストにセットしています。 328 * これらは、リクエストのアトリビュートへセットしている為、query タグや、 329 * directWriteTable タグの処理以降のリクエストスコープ中での取得になります。 330 * 331 * @param val キャッシュするサブキー 332 */ 333 public void setDb( final String val ) { 334 db = nval( getRequestParameter( val ),db ); 335 } 336 337 /** 338 * 【TAG】session Attribute の値を取得します。 339 * 340 * @og.tag 341 * session スコープに登録されているアトリビュートオブジェクトの値を 342 * 取り出します。 343 * 344 * @param val キャッシュするサブキー 345 */ 346 public void setSession( final String val ) { 347 session = nval( getRequestParameter( val ),session ); 348 } 349 350 /** 351 * 【TAG】日付関係の値を取得します。 352 * 353 * @og.tag 354 * これは、{@DATE.XXXX AA BB} 引数処理をおこなうための、サポートメソッドです。 355 * 引数は、"XXXX AA BB" という状態で受け取ります。(DATE. ははずした形) 356 * "XXXX" は、日付処理を行うキー文字列で予約語になっています。 357 * ・YMD :8文字の日付データ(200X年XX月XX日)を扱います。 358 * ・Y2MD :6文字の日付データ(0X年XX月XX日)を扱います。 359 * ・YM :6文字の日付データ(200X年XX月)を扱います。 360 * ・HMS :6文字の時刻データ(XX時XX分XX秒)を扱います。 361 * ・YMDHMS :14文字の日付データ(200X年XX月XX日XX時XX分XX秒)を扱います。 362 * ・EEE :曜日をデフォルトロケールで表示します。 363 * 364 * F付きは、フォーマットされた日付を返します。 365 * ・YMDF :8文字の日付データ(200X年XX月XX日)を扱います。 366 * ・Y2MDF :6文字の日付データ(0X年XX月XX日)を扱います。 367 * ・YMF :6文字の日付データ(200X年XX月)を扱います。 368 * ・HMSF :6文字の時刻データ(XX時XX分XX秒)を扱います。 369 * ・YMDHMSF:14文字の日付データ(200X年XX月XX日XX時XX分XX秒)を扱います。 370 * 371 * AA 引数は、基準となる日付を、YYYYMMDD形式で指定します。無指定の場合は、 372 * 処理時刻を基準にした、同一タグ内での同一日付(年月日時分秒)を使用して値を取得します。 373 * 指定できる日付は、必ず、YYYYMMDD形式とし、時分秒は ゼロにリセットされた状態になります。 374 * AA には、数字で始まる(20050701など)実日付と@で始まるパラメータが使用できます。 375 * @ZZ と記述することで、{@ZZ}で指定する場合と同様のリクエストパラメータが使用できます。 376 * このパラメータの値は、YYYYMMDD形式の数字か、null(またはゼロストリング)です。nullの 377 * 場合は、なにも指定されていないと判断して、処理時刻を使用します。 378 * 第2引数は、(数字か、@)以外の場合は、省略されたと判断されます。 379 * 380 * BB 引数は、日付についての加減算処理を行います。 381 * 省略すると、なにも加減算処理を行いません。 382 * ・SD :当月の最初の日付にセットします。(当月1日) 383 * ・ED :当月の最後の日付にセットします。(当月月末) 384 * ・SM :本年の最初の月にセットします。(本年1月) 385 * ・EM :本年の最後の月にセットします。(本年12月) 386 * ・SW :日付処理の週初め(月曜日)にセットします。日付は当日より前に移動します。 387 * ・EW :日付処理の週末(日曜日)にセットします。日付は当日より後ろに移動します。 388 * ・D1 〜 DXXX :日を指定の分だけ進めます。D1なら翌日、D200 なら200日後 389 * ・M1 〜 MXXX :月を指定の分だけ進めます。M1なら翌月、M6 なら半年後 390 * 391 * @param val キャッシュするサブキー 392 */ 393 public void setDate( final String val ) { 394 date = nval( getRequestParameter( val ),date ); 395 } 396 397 /** 398 * 【TAG】Unicode文字列の値を HTML のエスケープ記号(&#xZZZZ;)に変換します。 399 * 400 * @og.tag 401 * HTMLでのエスケープ文字を使用して、Unicodeを文字列化して登録する為の変換を行います。 402 * ここでは、入力文字を、キャラクタ(char)型に分解し、(&#xZZZZ;)に変換していきます。 403 * よって、通常に1文字(Shift-JISで2Byte,UTF-8で3Byte)が、8Byteになります。 404 * この変換された文字列を、HTML上でそのまま取り出すと、元のUnicode文字に戻る為、 405 * 通常のShift-JISでは、扱えない文字(中国語など)でも表示可能になります。 406 * 407 * @param val キャッシュするサブキー 408 */ 409 public void setNvar( final String val ) { 410 nvar = nval( getRequestParameter( val ),nvar ); 411 } 412 413 /** 414 * このオブジェクトの文字列表現を返します。 415 * 基本的にデバッグ目的に使用します。 416 * 417 * @return このクラスの文字列表現 418 */ 419 @Override 420 public String toString() { 421 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 422 .println( "VERSION" ,VERSION ) 423 .println( "sys" ,sys ) 424 .println( "user" ,user ) 425 .println( "gui" ,gui ) 426 .println( "mem" ,mem ) 427 .println( "lbl" ,lbl ) 428// .println( "msg" ,msg ) 429 .println( "db" ,db ) 430 .println( "session" ,session ) 431 .println( "date" ,date ) 432 .println( "nvar" ,nvar ) 433 .println( "Other..." ,getAttributes().getAttribute() ) 434 .fixForm().toString() ; 435 } 436}