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