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}