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         * 任意            ユーザーパラメータ(GE16) の値/システムパラメータ(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}