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