    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 * {&#064;XXXX} 変数の特殊処理を、動的に実行するタグです。
    023 *
    024 * このタグの目的は、{&#064;XXXX} 変数の使い方をドキュメント化することにあります。
    025 * 通常は、動的な編集処理を行う必要はありません。
    026 *
    027 * 通常のリクエスト変数は、{&#064;XXXX} で取り出すことが可能です。ところが、
    028 * {&#064;SYS.XXXX} 、{&#064;USER.XXXX} 、{&#064;GUI.XXXX}、 などのシステム予約の
    029 * 変数を取り出す場合に、XXXX 部分を動的に変更することは出来ません。
    030 * このタグは、簡易的に、XXXX を引数に取り、動的に取り出すことができるようにします。
    031 *
    032 * @og.formSample
    033 * ●形式：
    034 *    &lt;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 のエスケープ記号(&amp;#xZZZZ;)に変換します。
    045 *    &gt;
    046 * ●body：なし
    047 *
    048 * ●Tag定義：
    049 *   &lt;og:requestValue
    050 *       sys                【TAG】{&#064;SYS.XXXX} と同等のシステムパラメータ の値を取得します
    051 *       user               【TAG】{&#064;USER.XXXX} と同等のUserInfoオブジェクトの値を取得します
    052 *       gui                【TAG】{&#064;GUI.XXXX} と同等のGUIInfoオブジェクトの値を取得します
    053 *       mem                【TAG】{&#064;MEM.XXXX} と同等のREQUEST_CACHE の値を取得します
    054 *       lbl                【TAG】{&#064;LBL.XXXX} と同等のラベルリソースの値を取得します
    055 *       db                 【TAG】データベース実行結果を取得します
    056 *       session            【TAG】session Attribute の値を取得します
    057 *       date               【TAG】日付関係の値を取得します
    058 *       nvar               【TAG】Unicode文字列の値を HTML のエスケープ記号(&amp;#xZZZZ;)に変換します
    059 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    060 *   /&gt;
    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】{&#064;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         * {&#064;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】{&#064;USER.XXXX} と同等のUserInfoオブジェクトの値を取得します。
    180         *
    181         * @og.tag
    182         * ユーザーパラメータとは異なります。
    183         *
    184         * 以下の値は UserInfo オブジェクトの項目から取得します。
    185         *
    186         * ・JNAME     ユーザー日本語名称
    187         * ・ID        ユーザーＩＤ
    188         * ・IDNO      USER.ID が５Byte以上の時のみ先頭１文字を除いたユーザーＩＤ
    189         * ・INFO      ユーザー情報(ユーザーID：日本語名称)
    190         * ・LANG      言語
    191         * ・ROLES     ロール
    192         * ・IPADDRESS IPアドレス
    193         * ・LOGINTIME ログイン時刻
    194         *
    195         * 以下の値はあらかじめ、動的に作成されます。
    196         *
    197         * ・YMD       ８byte の今日のシステム日付
    198         * ・YMDH    １４byte の今日のシステム日時
    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】{&#064;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を指定した場合は、&#064; 指定によるリクエスト引数の値を適用できます。
    221         * {&#064;GUI.&#064;XXXX ID} や、{&#064;GUI.XXXX &#064;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】{&#064;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】{&#064;LBL.XXXX} と同等のラベルリソースの値を取得します。
    263         *
    264         * @og.tag
    265         * ラベルリソースのロケールは、ログインユーザーのロケールになります。
    266         * これは、{&#064;LBL.XXXX Y} 引数処理をおこなうための、サポートメソッドです。
    267         * 引数は、"XXXX Y" という状態で受け取ります。(LBL. ははずした形)
    268         * ラベルには、通常のラベル(Label)以外に、Short,Tips,Comment の情報を持っています。
    269         * {&#064;LBL.XXXX Y} の Y に、先のLabel,Short,Tips,Comment の頭文字('L','S','T','C')を
    270         * 指定することで、それぞれの状態を取得することが可能になります。
    271         * Y を指定しない場合({&#064;LBL.XXXX}) は、'L' が指定された場合と同じ効果があります。
    272         * Y は、先頭文字１文字で判断していますので、{&#064;LBL.XXXX Short}と記述できます。
    273         * Y 引数には、&#064;で始まるリクエスト引数が指定できます。例えば、{&#064;LBL.XXXX &#064;ZZ}
    274         * とすると、ZZ のリクエスト引数の値が Y に適用されます。
    275         * ラベルキーそのものをパラメータ化することが出来ます。
    276         * これは、{&#064;LBL.&#064;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         * これは、{&#064;DATE.XXXX AA BB} 引数処理をおこなうための、サポートメソッドです。
    319         * 引数は、"XXXX AA BB" という状態で受け取ります。(DATE. ははずした形)
    320         * "XXXX" は、日付処理を行うキー文字列で予約語になっています。
    321         * ・YMD　　：８文字の日付データ(200X年XX月XX日)を扱います。
    322         * ・Y2MD　 ：６文字の日付データ(0X年XX月XX日)を扱います。
    323         * ・YM　　 ：６文字の日付データ(200X年XX月)を扱います。
    324         * ・HMS　　：６文字の時刻データ(XX時XX分XX秒)を扱います。
    325         * ・YMDHMS ：１４文字の日付データ(200X年XX月XX日XX時XX分XX秒)を扱います。
    326         * ・EEE　　：曜日をデフォルトロケールで表示します。
    327         *
    328         * F付きは、フォーマットされた日付を返します。
    329         * ・YMDF　 ：８文字の日付データ(200X年XX月XX日)を扱います。
    330         * ・Y2MDF　：６文字の日付データ(0X年XX月XX日)を扱います。
    331         * ・YMF　　：６文字の日付データ(200X年XX月)を扱います。
    332         * ・HMSF　 ：６文字の時刻データ(XX時XX分XX秒)を扱います。
    333         * ・YMDHMSF：１４文字の日付データ(200X年XX月XX日XX時XX分XX秒)を扱います。
    334         *
    335         * AA 引数は、基準となる日付を、YYYYMMDD形式で指定します。無指定の場合は、
    336         * 処理時刻を基準にした、同一タグ内での同一日付(年月日時分秒)を使用して値を取得します。
    337         * 指定できる日付は、必ず、YYYYMMDD形式とし、時分秒は ゼロにリセットされた状態になります。
    338         * AA には、数字で始まる(20050701など)実日付と&#064;で始まるパラメータが使用できます。
    339         * &#064;ZZ と記述することで、{&#064;ZZ}で指定する場合と同様のリクエストパラメータが使用できます。
    340         * このパラメータの値は、YYYYMMDD形式の数字か、null(またはゼロストリング)です。nullの
    341         * 場合は、なにも指定されていないと判断して、処理時刻を使用します。
    342         * 第２引数は、(数字か、&#064;)以外の場合は、省略されたと判断されます。
    343         *
    344         * BB 引数は、日付についての加減算処理を行います。
    345         * 省略すると、なにも加減算処理を行いません。
    346         * ・SD ：当月の最初の日付にセットします。(当月１日)
    347         * ・ED ：当月の最後の日付にセットします。(当月月末)
    348         * ・SM ：本年の最初の月にセットします。(本年１月)
    349         * ・EM ：本年の最後の月にセットします。(本年１２月)
    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 のエスケープ記号(&amp;#xZZZZ;)に変換します。
    363         *
    364         * @og.tag
    365         * HTMLでのエスケープ文字を使用して、Unicodeを文字列化して登録する為の変換を行います。
    366         * ここでは、入力文字を、キャラクタ(char)型に分解し、(&amp;#xZZZZ;)に変換していきます。
    367         * よって、通常に１文字(Shift-JISで２Byte,UTF-8で３Byte)が、８Byteになります。
    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}