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