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