    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 java.io.File;
    019import java.util.List;
    020import java.util.ArrayList;
    021import java.util.Calendar;
    022import java.util.GregorianCalendar;
    023import java.util.HashMap;
    024import java.util.Map;
    025
    026import javax.servlet.http.HttpServletRequest;
    027
    028import org.opengion.fukurou.system.OgBuilder ;                          // 6.4.4.1 (2016/03/18)
    029import org.opengion.fukurou.system.DateSet;                                     // 6.4.2.0 (2016/01/29)
    030import org.opengion.fukurou.security.HybsCryptography;          // 5.8.8.0 (2015/06/05)
    031import org.opengion.fukurou.util.StringUtil;
    032import org.opengion.fukurou.util.XHTMLTag;
    033import org.opengion.fukurou.util.ToString;                                      // 6.1.1.0 (2015/01/17)
    034import org.opengion.hayabusa.common.HybsSystem;
    035import org.opengion.hayabusa.common.HybsSystemException;
    036// import org.opengion.hayabusa.html.CreateToken;                               // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止
    037import org.opengion.hayabusa.resource.GUIInfo;
    038import org.opengion.hayabusa.resource.URLXfer;
    039
    040import static org.opengion.fukurou.util.StringUtil.nval;
    041
    042/**
    043 * HTML のaタグと同等のリンクを作成するHTML拡張タグです。
    044 *
    045 * @og.formSample
    046 * ●形式：&lt;og:link href="…" &gt;  ...  &lt;/og:link &gt;
    047 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    048 *
    049 * ●Tag定義：
    050 *   &lt;og:link
    051 *       type               【HTML】リンク先のMIMEタイプを指定します
    052 *       name               【HTML】この要素をリンクの対象とするための名前を指定します(HTML5より廃止)
    053 *       gamenId            【TAG】画面ID属性を登録します
    054 *       useGamenId         【TAG】GAMENID,BACK_GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true)
    055 *       column             【TAG】リンクをつけたいカラムを指定します(ViewLink タグと併用)
    056 *       keys               【TAG】リンク先に渡すキーをCSV形式で複数指定します
    057 *       vals               【TAG】リンク先に渡す値をCSV形式で複数指定します
    058 *       onLink             【TAG】リンクを張る(true or 1)/張らない(false or 0)の設定を指定します(初期値:true)
    059 *       markList           【TAG】処理するマークを、"|"区切りの文字列で指定します
    060 *       href               【HTML】リンク先のURLを指定します
    061 *       target             【HTML】リンク先の表示ターゲットを指定します
    062 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    063 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    064 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    065 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    066 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    067 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    068 *       xlink              【TAG】href ではなく、xlink:href を使用するかどうか[true/false]を指定します(初期値:false)
    069 *       fileCheck          【TAG】ファイルの存在チェックを行うかどうか[true/false]を指定します(初期値:false)
    070 *       filePath           【TAG】アドレスにファイルのディレクトリ直接のアドレスを指定するかどうか[true/false]設定します(初期値:false)
    071 *       hreflang           【HTML】リンク先の基本となる言語コードを指定します
    072 *       rel                【HTML】この文書から見た、href属性で指定されるリンク先との関係を指定します
    073 *       rev                【HTML】href属性で指定されるリンク先から見た、この文書との関係をしてします
    074 *       charset            【HTML】リンク先の文字コードセットを指定します
    075 *       shape              【HTML】リンクボタンの形状(イメージマップ rect/circle/poly/default)を指定します
    076 *       coords             【HTML】リンクボタンの座標を指定します
    077 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
    078 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
    079 *       dir                【HTML】文字表記の方向(dir)を指定します
    080 *       title              【HTML】要素に対する補足的情報(title)を設定します
    081 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
    082 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 ～ 32767)
    083 *       accesskey          【HTML】アクセスキー(alt+キーで直接指定)を割り当てます
    084 *       clazz              【HTML】要素に対して class 属性を設定します
    085 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    086 *       useDirectJump      【TAG】ダイレクトジャンプを使用するかどうか[true/false]を指定します(初期値:false)
    087 *       useRequestCache    【TAG】リクエストキャッシュ情報を使用するかどうか[true/false]を指定します(初期値:true)
    088 *       hrefOnly           【TAG】リンク(アンカータグ)ではなく、href 属性をそのまま返すかどうか[true/false]を指定します(初期値:false)
    089 *       hrefTarget         【TAG】リンク(アンカータグ)ではなく、href 属性と、target属性を キーも含めて返すかどうか[true/false]を指定します(初期値:false)
    090 *       delKeys            【TAG】リクエストキャッシュ情報使用時に使用しない(削除する)キーをCSV形式で複数指定します
    091 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
    092 *       onBlur             【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")
    093 *       onFocus            【HTML】JavaScriptのイベント onFocus を設定します
    094 *       ondblClick         【HTML】JavaScriptのイベント ondblClick を設定します
    095 *       onMouseDown        【HTML】JavaScriptのイベント onMouseDown を設定します
    096 *       onMouseUp          【HTML】JavaScriptのイベント onMouseUp を設定します
    097 *       onMouseMove        【HTML】JavaScriptのイベント onMouseMove を設定します
    098 *       onMouseOut         【HTML】JavaScriptのイベント onMouseOut を設定します
    099 *       onMouseOver        【HTML】JavaScriptのイベント onMouseOver を設定します
    100 *       roles              【TAG】ロールをセットします
    101 *       useURLCheck        【TAG】リンクアドレスにURLチェック用の確認キーを付加するかどうか[true/false]を指定します(初期値:false)
    102 *       urlCheckUser       【TAG】URLチェック用の確認キーに対して、リンクを開くことのできるユーザーIDを指定します(初期値:ログインユーザー)
    103 *       urlCheckTime       【TAG】URLチェック用の確認キーに対して、リンクの有効期限を指定します(初期値:1440分=1日)
    104 *       urlCheckCrypt      【TAG】URLチェックの暗号化キーを指定します。受け側に依存します。未指定の場合はデフォルトの値が利用されます。
    105 *       useHrefEncode      【TAG】href 部分に対して、(;%)の２文字だけ URLEncodeを行うかどうかを指定します(初期値:USE_HREF_URLENCODE[=false])
    106 *       strictCheck        【TAG】(通常は使いません)カラムＩＤの存在チェックを行うかどうか[true/false]を指定します(初期値:true)
    107 *   X   extToken           【廃止】利用するCreateTokenプラグイン名を設定します。6.9.5.0 (2018/04/23)
    108 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    109 *   &gt;   ... Body ...
    110 *   &lt;/og:link&gt;
    111 *
    112 *    6.7.6.0 (2017/03/17) [strictCheck属性]は、カラムＩＤの存在チェックを行うかどうかを指定します(初期値:true)
    113 *      true    カラムＩＤがDBTableModel に存在しない場合は、エラーになる。
    114 *      false   カラムＩＤがDBTableModel に存在しない場合は、無視する。
    115 *
    116 * ●使用例
    117 *    ・普通のリンク
    118 *        &lt;og:link gamenId="32ExcelIn" href="direct.jsp" keys="location,filename,modifyType" value="{&#064;GUI.ADDRESS},{&#064;GUI.ADDRESS}.xls,A"  target="RESULT" &gt;
    119 *            &lt;img src="{&#064;SYS.JSP}/image/insert.gif" alt="Excel Insert" /&gt;&lt;og:message lbl="MSG0057" /&gt;
    120 *        &lt;/og:link&gt;
    121 *
    122 *    ・検索結果テーブル内でのリンク
    123 *        &lt;og:viewLink command="{&#064;command}"&gt;
    124 *            &lt;og:link column="KMZ" gamenId="RK0251" href="index.jsp" target="CONTENTS"
    125 *                keys="KMZ,ORDER_BY,command" vals="[KMZ],'LKIS',NEW" /&gt;
    126 *        &lt;/og:viewLink&gt;
    127 *
    128 *    ・ダイレクトジャンプ(指定の画面へ直接飛ばす)URL
    129 *      gamenId を指定しなければこの画面へのURLを作成します。
    130 *      このURLは、その画面の index.jsp に直接ジャンプするためのURLです。
    131 *      この場合、useRequestCache="true" が初期値なので、必要なければ、false に設定願います。
    132 *        &lt;og:link useDirectJump="true" delKeys="pageSize"
    133 *                     keys="location,filename,modifyType" value="{&#064;GUI.ADDRESS},{&#064;GUI.ADDRESS}.xls,A" /&gt;
    134 * @og.group 画面表示
    135 *
    136 * @version  4.0
    137 * @author       Kazuhiko Hasegawa
    138 * @since    JDK5.0,
    139 */
    140public class LinkTag extends HTMLTagSupport {
    141        /** このプログラムのVERSION文字列を設定します。   {@value} */
    142        private static final String VERSION = "6.9.5.0 (2018/04/23)" ;
    143        private static final long serialVersionUID = 695020180423L ;
    144
    145        private static final long INIT_TIME = 24*60*60*1000L ;                                                                  // 6.2.5.0 (2015/06/05) 1日=24(時)*60(分)*60(秒)*1000(ミリ秒)
    146
    147        private String          column          ;
    148        private String          onLink          = "true";       // true または 1
    149        private boolean         fileCheck       ;
    150        private boolean         filePath        ;
    151        private String          baseURL         = HybsSystem.sys( "FILE_URL" );
    152        // 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。fileURL変数を廃止します。
    153        private String          gamenId         ;
    154        private boolean         useGamenId      = true;
    155        // 3.5.2.0 (2003/10/20)
    156        private String          markList                = "true|TRUE|1";        // true または 1
    157        private boolean         xlink                   ;                                       // 3.5.5.0 (2004/03/12)
    158        private boolean         useDirectJump   ;                                       // 3.7.1.0 (2005/04/26)
    159        private boolean         useRequestCache = true;                         // 3.7.1.0 (2005/04/26)
    160        private int                     validDuration   = -1;
    161        private boolean         hrefOnly                ;                                       // 4.0.0 (2005/11/30)
    162        private boolean         hrefTarget              ;                                       // 5.5.5.6 (2012/08/31)
    163        private boolean         useHrefEncode   = HybsSystem.sysBool( "USE_HREF_URLENCODE" );           // 6.0.2.0 (2014/09/19)
    164        private boolean         strictCheck             = true;                         // 6.7.6.0 (2017/03/17) カラムＩＤの存在チェックを行うかどうかを指定します。
    165
    166        private String[]        keys                    ;                                       // 3.5.6.2 (2004/07/05)
    167        private String[]        vals                    ;                                       // 3.5.6.2 (2004/07/05)
    168        private String[]        delKeys                 ;                                       // 3.7.1.0 (2005/04/26)
    169        private boolean         useURLCheck             ;                                       // 4.3.7.0 (2009/06/01)
    170        private String          urlCheckUser    ;                                       // 4.3.7.0 (2009/06/01)
    171        private long            urlCheckTime    = INIT_TIME;            // 6.2.5.0 (2015/06/05)
    172        private String          urlCheckCrypt   ;                                       // 5.8.8.0 (2015/06/05)
    173//      private String          extToken                ;                                       // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止
    174
    175//      private transient List<CreateToken>     ctArray ;                       // 6.3.9.0 (2015/11/06) transient 追加 6.9.5.0 (2018/04/23) 廃止
    176
    177        /**
    178         * デフォルトコンストラクター
    179         *
    180         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    181         */
    182        public LinkTag() { super(); }           // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    183
    184        /**
    185         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    186         *
    187         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。ボディが存在する場合のみボディが呼ばれる対応。
    188         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    189         * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更
    190         *
    191         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    192         */
    193        @Override
    194        public int doStartTag() {
    195                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    196                if( useTag() ) {
    197                        String msglbl = getMsglbl();    // 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更
    198                        if( msglbl == null && column != null ) { msglbl = "[" + column + "]"; }
    199                        set( "body",msglbl );
    200                        return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
    201                }
    202                return SKIP_BODY ;                              // Body を評価しない
    203        }
    204
    205        /**
    206         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    207         *
    208         * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。
    209         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。ボディが存在する場合のみボディが呼ばれる対応。
    210         *
    211         * @return      後続処理の指示(SKIP_BODY)
    212         */
    213        @Override
    214        public int doAfterBody() {
    215                final String label = getBodyString();
    216
    217                if( label != null && label.length() > 0 ) {
    218                        set( "body",label );
    219                }
    220
    221                return SKIP_BODY ;
    222        }
    223
    224        /**
    225         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    226         *
    227         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    228         * @og.rev 3.1.2.0 (2003/04/07) リンク指定時に、画面IDを渡して、実アドレスを求める事ができる様にする。
    229         * @og.rev 3.1.7.0 (2003/05/02) 戻るボタン用のBACK_GAMENID を、引数に追加します。
    230         * @og.rev 3.1.8.0 (2003/05/16) GAMENID属性のＵＲＬへの自動セットを行うかどうかを決める属性( useGamenId )を追加。
    231         * @og.rev 3.1.8.0 (2003/05/16) 画面ＩＤが指定されたときのリンク情報作成方法を通常のリンク時にも適用する。
    232         * @og.rev 3.1.8.0 (2003/05/16) 画面のロールに応じて、リンクを張る/張らないを自動判断する。
    233         * @og.rev 3.5.2.0 (2003/10/20) markList属性を追加
    234         * @og.rev 3.5.5.0 (2004/03/12) xlink属性をAttributeオブジェクトに追加
    235         * @og.rev 3.5.6.2 (2004/07/05) makeTag() の処理範囲変更、viewlink へのパラメータ変更。
    236         * @og.rev 3.7.1.0 (2005/04/26) ダイレクトジャンプリンク機能を追加
    237         * @og.rev 4.0.0.0 (2005/11/30) roles 属性の追加
    238         * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。
    239         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    240         * @og.rev 4.3.7.1 (2009/06/08) URLチェック機能対応
    241         * @og.rev 4.3.7.4 (2009/07/01) 循環参照を解消
    242         * @og.rev 4.3.8.0 (2009/08/01) ユーザーIDの外部設定に対応
    243         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    244         * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode 属性対応
    245         * @og.rev 5.8.2.1 (2014/12/14) トークンプラグイン対応
    246         * @og.rev 5.8.8.0 (2015/06/05) urlCheckCrypt対応
    247         * @og.rev 6.2.5.0 (2015/06/05) System.currentTimeMillis() + urlCheckTime を、最初に計算しておく。
    248         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。fileURL変数を廃止します。
    249         * @og.rev 6.7.3.0 (2017/01/27) ViewLinkTag経由の判定を入れる。
    250         * @og.rev 6.7.6.0 (2017/03/17) strictCheck 追加。
    251         * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止
    252         *
    253         * @return      後続処理の指示
    254         */
    255        @Override
    256        public int doEndTag() {
    257                debugPrint();           // 4.0.0 (2005/02/28)
    258                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    259                if( !useTag() ) { return EVAL_PAGE ; }
    260
    261                // 3.1.8.0 (2003/05/16) GAMENID属性のＵＲＬへの自動セットを行うかどうかを決める属性( useGamenId )を追加。
    262                // 4.0.0 (2005/11/30) 指定のロールが、アクセス許可の場合は、出力します。
    263                final String roles = get( "roles" );
    264                // 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    265                if( ! getUser().isAccess( roles ) ) {
    266                        return EVAL_PAGE ;
    267                }
    268
    269                //  4.3.7.1 (2009/06/08)
    270                if( useURLCheck ) {
    271                        // 4.3.8.0 (2009/08/01)
    272                        urlCheckUser = nval( urlCheckUser, getUser().getUserID() );
    273                }
    274
    275                // 6.2.5.0 (2015/06/05) System.currentTimeMillis() + urlCheckTime を、最初に計算しておく。
    276                final long plusCheckTime = System.currentTimeMillis() + urlCheckTime ;
    277
    278                final ViewLinkTag viewlink = (ViewLinkTag)findAncestorWithClass( this,ViewLinkTag.class );
    279                if( viewlink != null ) {
    280                        if( isGamenCheck() ) {  set( "onLink", onLink );  }
    281                        else {                                  set( "onLink", "false" ); }
    282                         // 4.3.7.1 (2009/06/08)
    283                        if( useURLCheck ) {
    284                                set( "useURLCheck"      , "true" );
    285                                set( "urlCheckUser"     , urlCheckUser );
    286                                set( "urlCheckTime"     , String.valueOf( plusCheckTime ) );                                                            // 6.2.5.0 (2015/06/05)
    287                                set( "urlCheckCrypt", urlCheckCrypt );  // 5.8.8.0 (2015/06/05)
    288                        }
    289                        set( "markList"   , markList );
    290                        set( "linkFormat" , makeTag() );                // 3.5.6.2 (2004/07/05)
    291
    292                        // 4.0.0 (2005/08/31) 同一カラムの複数登録を許可します。
    293                        set( "column"      , column );
    294//                      set( "extToken"    , extToken );                                                        // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止
    295                        set( "strictCheck" , String.valueOf( strictCheck ) );           // 6.7.6.0 (2017/03/17)
    296
    297                        // 6.0.2.0 (2014/09/19) useHrefEncode 属性対応
    298                        if( !useGamenId && useHrefEncode ) {
    299                                set( "useHrefEncode","true" );
    300                        }
    301                        viewlink.addAttribute( getAttributes() );
    302                }
    303                // 3.7.1.0 (2005/04/26) ダイレクトジャンプリンク機能を追加
    304                // 画面の利用権限有無などは調査不要
    305                else if( useDirectJump ) {
    306                        jspPrint( makeDirectLink() );
    307                }
    308                else {
    309                        if( isFileCheck() && isGamenCheck() && markList.indexOf( onLink ) >= 0 ) {
    310                                // 3.5.6.2 (2004/07/05) makeTag() より移動
    311                                if( filePath ) {
    312                                        final String furl  = get( "href" );
    313
    314                                        // 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。fileURL変数を廃止します。
    315                                        final String filename =  HybsSystem.url2dir( baseURL,furl );
    316
    317                                        set( "href",filename );
    318                                }
    319
    320                                // 4.3.7.1 (2009/06/08)
    321                                // 6.7.3.0 (2017/01/27) ViewLinkTag経由の判定を入れる。
    322                                String tag = makeTag( false );          // ViewLinkTag経由しない。
    323                                if( useURLCheck ) {
    324                                        // 5.8.8.0 (2015/06/05) urlCheckCrypt対応
    325                                        HybsCryptography criptCls = null;
    326                                        if( urlCheckCrypt != null && urlCheckCrypt.length() > 0 ){
    327                                                criptCls = new HybsCryptography( urlCheckCrypt );
    328                                        }
    329
    330                                        if( hrefOnly ) {
    331                                                // 4.3.7.4 (2009/07/01) 循環参照を解消
    332                                                tag = XHTMLTag.addURLCheckKey( tag, HybsSystem.URL_CHECK_KEY, getUser().getUserID(), plusCheckTime, criptCls );         // 5.8.8.0
    333                                        }
    334                                        else {
    335                                                // 4.3.7.4 (2009/07/01) 循環参照を解消
    336                                                tag = XHTMLTag.embedURLCheckKey( tag, HybsSystem.URL_CHECK_KEY, getUser().getUserID(), plusCheckTime, criptCls );       // 5.8.8.0
    337                                        }
    338                                }
    339//                              // 5.8.2.1 (2014/12/14) URLトークンプラグイン
    340//                              // 6.9.5.0 (2018/04/23) extToken 廃止
    341//                              if( ctArray != null && !ctArray.isEmpty() ){            // 6.1.1.0 (2015/01/17) refactoring
    342//                                      for( final CreateToken ct : ctArray){
    343//                                              if( hrefOnly ){
    344//                                                      tag = ct.generateURL( tag, plusCheckTime, null );       // 5.8.8.0
    345//                                              }
    346//                                              else{
    347//                                                      tag = ct.embedToken( tag, plusCheckTime, null );        // 5.8.8.0
    348//                                              }
    349//                                      }
    350//                              }
    351                                jspPrint( tag );
    352                        }
    353                }
    354
    355                return EVAL_PAGE ;
    356        }
    357
    358        /**
    359         * タグリブオブジェクトをリリースします。
    360         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    361         *
    362         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    363         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    364         * @og.rev 3.1.2.0 (2003/04/07) リンク指定時に、画面IDを渡して、実アドレスを求める事ができる様にする。
    365         * @og.rev 3.1.8.0 (2003/05/16) GAMENID属性のＵＲＬへの自動セットを行うかどうかを決める属性( useGamenId )を追加。
    366         * @og.rev 3.5.2.0 (2003/10/20) markList属性を追加
    367         * @og.rev 3.5.5.0 (2004/03/12) xlink属性を追加
    368         * @og.rev 3.5.6.2 (2004/07/05) keys , vals属性を追加
    369         * @og.rev 3.7.1.0 (2005/04/26) useDirectJump , useRequestCache , delKeys 属性を追加
    370         * @og.rev 4.0.0.0 (2005/09/30) validDuration 属性を追加
    371         * @og.rev 4.3.7.0 (2009/06/01) useURLCheck属性を追加
    372         * @og.rev 5.5.5.6 (2012/08/31) hrefTarget属性を追加
    373         * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode属性を追加
    374         * @og.rev 5.8.2.1 (2014/12/14) トークンプラグイン対応(extToken,ctArray属性を追加)
    375         * @og.rev 5.8.8.0 (2015/06/05) urlCheckCrypt追加
    376         * @og.rev 6.2.5.0 (2015/06/05) urlCheckTimeの初期値を、INIT_TIMEに変更
    377         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。fileURL変数を廃止します。
    378         * @og.rev 6.7.6.0 (2017/03/17) strictCheck 追加。
    379         * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止
    380         */
    381        @Override
    382        protected void release2() {
    383                super.release2();
    384                column                  = null;
    385                onLink                  = "true";       // true または 1
    386                markList                = "true|TRUE|1";        // 3.5.2.0 (2003/10/20)
    387                fileCheck               = false;
    388                filePath                = false;
    389                baseURL                 = HybsSystem.sys( "FILE_URL" );
    390                gamenId                 = null;
    391                useGamenId              = true;
    392                xlink                   = false;        // 3.5.5.0 (2004/03/12)
    393                keys                    = null;         // 3.5.6.2 (2004/07/05)
    394                vals                    = null;         // 3.5.6.2 (2004/07/05)
    395                useDirectJump   = false;        // 3.7.1.0 (2005/04/26)
    396                useRequestCache = true;         // 3.7.1.0 (2005/04/26)
    397                delKeys                 = null;         // 3.7.1.0 (2005/04/26)
    398                validDuration   = -1;
    399                hrefOnly                = false;        // 4.0.0 (2005/11/30)
    400                hrefTarget              = false;        // 5.5.5.6 (2012/08/31)
    401                useURLCheck             = false;        // 4.3.7.0 (2009/06/01)
    402                urlCheckUser    = null;         // 4.3.7.0 (2009/06/01)
    403                urlCheckTime    = INIT_TIME;            // 6.2.5.0 (2015/06/05)
    404                urlCheckCrypt   = null;                         // 5.8.8.0 (2015/06/05)
    405                useHrefEncode   = HybsSystem.sysBool( "USE_HREF_URLENCODE" );           // 6.0.2.0 (2014/09/19)
    406                strictCheck             = true;         // 6.7.6.0 (2017/03/17)
    407//              extToken                = null;                                                                                         // 5.8.2.1 (2014/12/14) 6.9.5.0 (2018/04/23) extToken 廃止
    408//              ctArray                 = null;                                                                                         // 5.8.2.1 (2014/12/14) 6.9.5.0 (2018/04/23) extToken 廃止
    409        }
    410
    411        /**
    412         * リンクを作成します。
    413         *
    414         * これは、HTMLTagSupportのmakeTag()のオーバーライド用のメソッドです。
    415         * ViewLinkTag経由の場合は、引数 true で、独自のメソッドを呼び出します。
    416         * これは、戻り行番号( BACK_ROW={I} )が、処理されないため、IE上でエラーが発生するのを
    417         * 避けるためです。
    418         *
    419         * @og.rev 6.7.3.0 (2017/01/27) Override用のメソッドを用意しておきます。
    420         *
    421         * @return      リンクタグ文字列
    422         * @og.rtnNotNull
    423         */
    424        @Override
    425        protected String makeTag() {
    426                return makeTag( true );         // 互換性。ViewLinkTag経由の場合
    427        }
    428
    429        /**
    430         * リンクを作成します。
    431         *
    432         * @og.rev 3.5.5.0 (2004/03/12) xlink 属性に応じたリンク文字を作成します。
    433         * @og.rev 3.5.6.2 (2004/07/05) XHTMLTag の変換値のみを返す様に変更。
    434         * @og.rev 3.7.0.3 (2005/03/01) リンク作成時に行番号を引数に追加する。
    435         * @og.rev 4.0.0.0 (2005/11/30) href 属性のみを返します。
    436         * @og.rev 4.0.1.0 (2007/12/17) BACK_ADDRESSの追加
    437         * @og.rev 4.3.3.5 (2008/11/08) サーバーアドレスを取得する際に、リクエストから取得するように変更します。
    438         * @og.rev 4.3.7.0 (2009/06/01) URLチェック機能対応
    439         * @og.rev 4.3.7.1 (2009/06/08) ↑の実装を#doEndTagに移動
    440         * @og.rev 5.5.5.6 (2012/08/31) 「href="*******" target="******"」 という キー付きの文字列を作成
    441         * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode 属性対応
    442         * @og.rev 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。
    443         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    444         * @og.rev 6.7.3.0 (2017/01/27) ViewLinkTag経由の判定を入れる。
    445         *
    446         * @param       useViewLink ViewLinkTag経由の判定 [true:ViewLinkTag経由/false:その他]
    447         * @return      リンクタグ文字列
    448         * @og.rtnNotNull
    449         */
    450        private String makeTag( final boolean useViewLink ) {
    451
    452                makeGamenLink();                // 3.5.6.2 (2004/07/05)
    453                if( get( "body" ) == null ) { set( "body" , get( "href" ) ); }
    454
    455                // xlink と通常の link では、URL接続文字が異なる。
    456                final String sep = xlink ? "&amp;" : "&" ;
    457
    458                final OgBuilder urlEncBuf = new OgBuilder()
    459                                .append( XHTMLTag.urlEncode( keys,vals,sep ) );
    460                // 3.5.6.2 (2004/07/05) addBackGamenId() メソッドの内容を移動
    461                if( useGamenId ) {
    462                        urlEncBuf.appendIf( useViewLink , sep , "BACK_ROW={I}" )                                        // ViewLinkTag経由の場合のみ、出力します。
    463                                         .append( sep , "BACK_GAMENID=" , getGUIInfoAttri( "KEY" ) )
    464                                         .appendIf( gamenId != null && !gamenId.isEmpty()                                       // if
    465                                                        , sep , "GAMENID=" , gamenId )
    466                                         .append( sep , "BACK_ADDRESS=" )
    467                                         .append( getContextURL() , getGUIInfoAttri( "ADDRESS" ) , "/index.jsp" );
    468                }
    469                // 6.0.2.0 (2014/09/19) useHrefEncode 属性対応
    470                else if( useHrefEncode ) {
    471                        String furl = get( "href" );
    472                        if( furl != null ) {
    473                                furl = StringUtil.urlEncode2( furl );                                                   // ASCII以外の文字の、URLエンコードを行う。
    474                                set( "href",furl );
    475                        }
    476                }
    477                final String urlEnc = urlEncBuf.toString();
    478
    479                // 4.0.0 (2005/11/30) href 属性のみを返します。
    480                if( hrefOnly ) {
    481                        return XHTMLTag.addUrlEncode( get( "href" ),urlEnc,sep );
    482                }
    483
    484                // 5.5.5.6 (2012/08/31) 「href="*******" target="******"」 という キー付きの文字列を作成
    485                if( hrefTarget ) {
    486                        final StringBuilder hrefTemp = new StringBuilder( BUFFER_MIDDLE );
    487
    488                        // 6.0.2.5 (2014/10/31) char を append する。
    489                        hrefTemp.append( "href=\"" ).append( XHTMLTag.addUrlEncode( get( "href" ),urlEnc,sep ) ).append( '"' );
    490
    491                        final String target = get( "target" ) ;
    492                        if( target != null && !target.isEmpty() ) {
    493                                hrefTemp.append( " target=\"" ).append( target ).append( '"' );         // 6.0.2.5 (2014/10/31) char を append する。
    494                        }
    495
    496                        return hrefTemp.toString() ;
    497                }
    498
    499                if( xlink ) {
    500                        return XHTMLTag.xlink( getAttributes(),urlEnc ) ;
    501                }
    502                else {
    503                        return XHTMLTag.link( getAttributes(),urlEnc ) ;
    504                }
    505        }
    506
    507        /**
    508         * ダイレクトジャンプリンクを作成します。
    509         *
    510         * gamenId を指定しなければ、この画面が指定されたと考えます。
    511         * target を指定しなければ、"_blank" を指定します。
    512         * msg がなければ(または、BODY部が空の場合)、画面名にこのリンクを作成します。
    513         *
    514         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    515         * @og.rev 4.0.0.0 (2005/09/30) リンク文字列をハッシュ化します。
    516         * @og.rev 4.3.3.5 (2008/11/08) サーバーアドレスを取得する際に、リクエストから取得するように変更します。
    517         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
    518         *
    519         * @return      ダイレクトジャンプリンク文字列
    520         */
    521        private String makeDirectLink() {
    522
    523                // gamenId を指定しなければ、この画面が指定されたと考えます。
    524                if( gamenId == null ) {
    525                        gamenId = getGUIInfoAttri( "KEY" );
    526                }
    527
    528                // キャッシュ情報と keys,vals情報を設定します。
    529                if( useRequestCache ) { makeRequestCache2Vals( gamenId ); }
    530                final String urlEnc = XHTMLTag.urlEncode( keys,vals )
    531                                                        + "&GAMENID=" + gamenId ;
    532
    533                String href = get( "href" );
    534                if( href == null || href.isEmpty() ) {
    535                        // 4.3.3.5 (2008/11/08) サーバーアドレスを取得する際に、リクエストから取得するように変更します。
    536                        href = getContextURL() + "index.jsp" ;
    537                }
    538
    539                final String redirectURL = href + "?" + urlEnc ;
    540                final String name = getGUIInfoAttri( "LNAME" );
    541
    542                String validDate = null;        // 設定されない場合は、無制限
    543                if( validDuration != 0 ) {
    544                        if( validDuration < 0 ) {       // マイナスの場合は、初期値が使われます。
    545                                validDuration = sysInt( "LINK_VALID_DURATION_DAYS" );
    546                        }
    547                                                                     //  ミリ秒    秒    時間
    548                        final long nowTime = System.currentTimeMillis() + 1000L * 3600L * 24L * validDuration ;
    549                        validDate = DateSet.getDate( nowTime,"yyyyMMdd" );                              // 6.4.2.0 (2016/01/29)
    550                }
    551                final String userid   = getUser().getUserID();
    552
    553                final URLXfer xfer = new URLXfer();
    554                // redirectURL,name,validDate,userid
    555                return xfer.getRandomURL( redirectURL,name,validDate,userid );
    556        }
    557
    558        /**
    559         * リクエストキャッシュ情報を加味した keys,vals を再作成します。
    560         * このメソッドは、ダイレクトジャンプ時のみ有効です。
    561         *
    562         * リクエスト情報のMapを取り出します。そのとき、keys,vals を優先して
    563         * 設定します。
    564         *
    565         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    566         *
    567         * @param       gamenId 画面ID (リクエストキャッシュの取り出しキー)
    568         */
    569        @SuppressWarnings(value={"unchecked"})
    570        private void makeRequestCache2Vals( final String gamenId ) {
    571                final Map<String,String[]> reqMap = new HashMap<>();
    572
    573                final String reqKey = HybsSystem.REQ_CACHE_KEY + gamenId ;
    574                final Map<String,String[]> attMap = (Map<String,String[]>)getSessionAttribute( reqKey );
    575                if( attMap != null ) { reqMap.putAll( attMap ); }
    576
    577                if( keys != null ) {
    578                        for( int i=0; i<keys.length; i++ ) {
    579                                // keys,vals をキャッシュに上書き( キャッシュは、文字列配列)
    580                                final String[] temp = new String[] { vals[i] } ;
    581                                reqMap.put( keys[i],temp );
    582                        }
    583                }
    584
    585                // ダイレクトジャンプするための画面IDは、別途設定するため、削除しておきます。
    586                reqMap.remove( "GAMENID" );
    587
    588                // 使用しないキーを、削除しておきます。
    589                if( delKeys != null ) {
    590                        for( int i=0; i<delKeys.length; i++ ) {
    591                                reqMap.remove( delKeys[i] );
    592                        }
    593                }
    594
    595                // マップキーを取得。キャッシュ値は、String[] なので、複数キー登録する。
    596                // 6.3.9.0 (2015/11/06) 配列にせずに、拡張for文で処理する。
    597
    598                final List<String> v_keys = new ArrayList<>();
    599                final List<String> v_vals = new ArrayList<>();
    600                for( final Map.Entry<String,String[]> entry : reqMap.entrySet() ) {
    601                        final String   kk = entry.getKey();
    602                        final String[] vv = entry.getValue();
    603                        if( vv != null ) {
    604                                for( final String val : vv ) {
    605                                        v_keys.add( kk );
    606                                        v_vals.add( val );
    607                                }
    608                        }
    609                }
    610
    611                keys = v_keys.toArray( new String[v_keys.size()] );
    612                vals = v_vals.toArray( new String[v_vals.size()] );
    613        }
    614
    615        /**
    616         * ファイルの存在チェックを行います。
    617         *
    618         * 実ファイルは、URL(httpの引数)より、変換して求めます。
    619         *
    620         * @og.rev 3.1.8.0 (2003/05/16) 画面のロールに応じて、リンクを張る/張らないを自動判断する。
    621         *
    622         * @return      ファイルが存在する(true)/存在しない(false)
    623         */
    624        private boolean isFileCheck() {
    625                boolean rtn = true;
    626
    627                if( fileCheck ) {
    628                        File file = null;
    629
    630                        final String url  = get( "href" );
    631                        if( url != null ) {
    632                                final String fin = HybsSystem.url2dir( url );
    633                                file = new File( fin );
    634                        }
    635                        rtn = file != null && file.exists() ;
    636                }
    637
    638                return rtn ;
    639        }
    640
    641        /**
    642         * リンク先の画面のロールに応じて、リンクを張る/張らないを自動判断を行います。
    643         *
    644         * リンク先の画面ＩＤは、gamenId 属性で指定してください。それ以外のリンクは、
    645         * 自動判断できません。
    646         * link タグ単独の場合に、画面にアクセスできない場合は、メッセージも表示されません。
    647         * viewLink タグを利用される場合は、リンクのON/OFF で制御します。
    648         *
    649         * @og.rev 3.1.8.0 (2003/05/16) 画面のロールに応じて、リンクを張る/張らないを自動判断する。
    650         * @og.rev 4.0.0.0 (2005/01/31) GUIオブジェクトがマップに無ければ、アクセスできない。
    651         *
    652         * @return      画面アクセス許可する(true)/許可しない(false)
    653         */
    654        private boolean isGamenCheck() {
    655                boolean rtn = true;
    656
    657                if( gamenId != null ) {
    658                        final GUIInfo guiInfo = getGUIInfo( gamenId );          // 4.0.0 (2005/01/31)
    659
    660                        // 4.0.0 (2005/01/31) ユーザー毎にアクセスできるGUIが設定されている為
    661                        // 存在しなければ、アクセス不可ということ。
    662                        if( guiInfo == null ) { rtn = false; }
    663                }
    664
    665                return rtn ;
    666        }
    667
    668        /**
    669         * 画面ＩＤとhref から、指定のＵＲＬを作成します。
    670         *
    671         * @og.rev 3.1.2.0 (2003/04/07) リンク指定時に、画面IDを渡して、実アドレスを求める事ができる様にする。
    672         * @og.rev 3.1.8.0 (2003/05/16) リンク作成時に、kyes/values が null の時の処理の修正。
    673         * @og.rev 3.1.8.0 (2003/05/16) GAMENID属性のＵＲＬへの自動セットを行うかどうかを決める属性( useGamenId )を追加。
    674         * @og.rev 3.1.8.0 (2003/05/16) 画面ＩＤが指定されたときのリンク情報作成方法を通常のリンク時にも適用する。
    675         * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。
    676         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
    677         *
    678         */
    679        private void makeGamenLink() {
    680                if( gamenId == null || gamenId.isEmpty() ) { return ; } // 4.0.0 (2005/11/30)
    681
    682                final GUIInfo guiInfo = getGUIInfo( gamenId );          // 4.0.0 (2005/01/31)
    683                if( guiInfo == null ) { return ; }      // 見つからない場合は、アクセス不可
    684
    685                final String address = guiInfo.getRealAddress( get( "href" ) );
    686                final String url = getRequestParameter( address );
    687                set( "href",url );
    688
    689                final String label = guiInfo.getLabel();
    690                if( get( "title" ) == null ) {
    691                        set( "title","To:" + label );
    692                }
    693                if( get( "body" ) == null ) {
    694                        set( "body",label );
    695                }
    696        }
    697
    698        /**
    699         * リクエストからサーバーアドレス(例：http://hn5120:8824/ver4/jsp/)を取得します。
    700         *
    701         * @og.rev 4.3.3.5 (2008/11/08) 新規追加。
    702         * @og.rev 5.4.3.8 (2011/01/24) プロトコルhttps対応
    703         *
    704         * @return      サーバーアドレス文字列
    705         * @og.rtnNotNull
    706         */
    707        private String getContextURL() {
    708                final HttpServletRequest request = (HttpServletRequest) getRequest();
    709                final StringBuilder link = new StringBuilder( BUFFER_MIDDLE )
    710                        .append( request.getScheme()     ).append( "://" )              // 5.4.3.8
    711                        .append( request.getServerName() ).append( ':' )                // 6.0.2.5 (2014/10/31) char を append する。
    712                        .append( request.getServerPort() )
    713                        .append( request.getContextPath() )
    714                        .append( "/jsp/" );
    715                return link.toString();
    716        }
    717
    718        /**
    719         * 【HTML】リンク先のMIMEタイプを指定します。
    720         *
    721         * @og.tag リンク先のMIMEタイプを指定します。
    722         *
    723         * @param       type MIMEタイプ
    724         */
    725        public void setType( final String type ) {
    726                set( "type",getRequestParameter( type ) );
    727        }
    728
    729        /**
    730         * 【HTML】この要素をリンクの対象とするための名前を指定します。
    731         *
    732         * @og.tag この要素をリンクの対象とするための名前を指定します。
    733         *
    734         * ※ HTML5では、a要素のname属性は廃止されています。
    735         * HTML4.01におけるname属性は、ウェブページ内の特定個所に名前を付けて、
    736         * ページ内リンクを作成する際などに使用していました。 HTML5で同様の
    737         * 機能を作成する場合にはid属性を使用します。 id属性は、ひとつの
    738         * 文書の中では重複して同じ名前を付けることはできないので、
    739         * ウェブページ内の場所を一意に特定できます。
    740         *
    741         * @param       name 名前
    742         * @see         <a href="http://www.htmq.com/html5/a.shtml">a</a>
    743         */
    744        public void setName( final String name ) {
    745                set( "name",getRequestParameter( name ) );
    746        }
    747
    748        /**
    749         * 【TAG】リンクをつけたいカラムを指定します(ViewLink タグと併用)。
    750         *
    751         * @og.tag
    752         * このカラム名のTableModelに対して、 ViewLink タグが存在する場合は,
    753         * リンクを張ります。
    754         *
    755         * @param       clm カラム
    756         */
    757        public void setColumn( final String clm ) {
    758                this.column = getRequestParameter( clm );
    759        }
    760
    761        /**
    762         * 【HTML】リンク先のURLを指定します。
    763         *
    764         * @og.tag リンク先のURLを指定します。
    765         *
    766         * @param       href リンク先のURL
    767         */
    768        public void setHref( final String href ) {
    769                set( "href",getRequestParameter( href ) );
    770        }
    771
    772        /**
    773         * 【HTML】リンク先の基本となる言語コードを指定します。
    774         *
    775         * @og.tag リンク先の基本となる言語コードを指定します。
    776         *
    777         * @param       hreflang 言語コード
    778         */
    779        public void setHreflang( final String hreflang ) {
    780                set( "hreflang",getRequestParameter( hreflang ) );
    781        }
    782
    783        /**
    784         * 【HTML】この文書から見た、href属性で指定されるリンク先との関係を指定します。
    785         *
    786         * @og.tag この文書から見た、href属性で指定されるリンク先との関係を指定します。
    787         *
    788         * @param       rel リンク先との関係
    789         */
    790        public void setRel( final String rel ) {
    791                set( "rel",getRequestParameter( rel ) );
    792        }
    793
    794        /**
    795         * 【HTML】href属性で指定されるリンク先から見た、この文書との関係をしてします。
    796         *
    797         * @og.tag href属性で指定されるリンク先から見た、この文書との関係をしてします。
    798         *
    799         * @param       rev リンク先から見たこの文書との関係
    800         */
    801        public void setRev( final String rev ) {
    802                set( "rev",getRequestParameter( rev ) );
    803        }
    804
    805        /**
    806         * 【HTML】リンク先の文字コードセットを指定します。
    807         *
    808         * @og.tag リンク先の文字コードセットを指定します。
    809         *
    810         * @param       charset 文字コードセット
    811         */
    812        public void setCharset( final String charset ) {
    813                set( "charset",getRequestParameter( charset ) );
    814        }
    815
    816        /**
    817         * 【HTML】リンク先の表示ターゲットを指定します。
    818         *
    819         * @og.tag リンク先の文書を表示させるフレーム、またはウィンドウの名前を指定します。
    820         *
    821         * @param       target ターゲット
    822         */
    823        public void setTarget( final String target ) {
    824                set( "target",getRequestParameter( target ) );
    825        }
    826
    827        /**
    828         * 【HTML】リンクボタンの形状[rect/circle/poly/default]を指定します。
    829         *
    830         * @og.tag HTMLのイメージマップとして指定できる設定値[rect/circle/poly/default]を指定します。
    831         *
    832         * @param       shape 形状 [rect/circle/poly/default]
    833         */
    834        public void setShape( final String shape ) {
    835                set( "shape",getRequestParameter( shape ) );
    836        }
    837
    838        /**
    839         * 【HTML】リンクボタンの座標を指定します。
    840         *
    841         * @og.tag
    842         * coords セット
    843         *
    844         * @param       coords リンクボタンの座標
    845         */
    846        public void setCoords( final String coords ) {
    847                set( "coords",getRequestParameter( coords ) );
    848        }
    849
    850        /**
    851         * 【TAG】リンク先に渡すキーをCSV形式で複数指定します。
    852         *
    853         * @og.tag リンク先に渡すキーを指定します。
    854         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    855         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    856         *
    857         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    858         *
    859         * @param       key キー(CSV形式)
    860         */
    861        public void setKeys( final String key ) {
    862                keys = getCSVParameter( key );
    863        }
    864
    865        /**
    866         * 【TAG】リンク先に渡す値をCSV形式で複数指定します。
    867         *
    868         * @og.tag リンク先に渡す値を指定します。
    869         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    870         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    871         * keys,vals を使用すると、URLエンコードされます。
    872         *
    873         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    874         *
    875         * @param       val 値(CSV形式)
    876         */
    877        public void setVals( final String val ) {
    878                vals = getCSVParameter( val );
    879        }
    880
    881        /**
    882         * 【TAG】リンクを張る(true or 1)/張らない(false or 0)の設定を指定します(初期値:true)。
    883         *
    884         * @og.tag
    885         * リンクを張る場合は、"true"(または "1") リンクを張らない
    886         * 場合は, "true以外"(または "0")をセットします。
    887         * 初期値は、 "true"(リンクを張る)です。
    888         * さらに、[カラム名] で、動的にカラムの値で、リンクを張る、張らないを
    889         * 選ぶ事が可能になります。値は、"true"(または "1") で、マークします。
    890         * 追記 3.5.2.0 (2003/10/20)：markList属性に、処理対象文字列郡を指定できます。
    891         * これにより、リンクを処理するかどうかの判断が、true,1 以外にも使用できるようになりました。
    892         *
    893         * @og.rev 3.5.2.0 (2003/10/20) markList属性を追加
    894         *
    895         * @param       flag リンクの設定 [true,1:リンクを張る/true,1以外:リンクを張らない]
    896         */
    897        public void setOnLink( final String flag ) {
    898                onLink = nval( getRequestParameter( flag ),onLink );
    899        }
    900
    901        /**
    902         * 【TAG】ファイルの存在チェックを行うかどうか[true/false]を指定します(初期値:false)。
    903         *
    904         * @og.tag
    905         * "true"の場合は、ファイルの存在チェックを行い、ファイルがあれば
    906         * リンクを張ります。ファイルが存在しない場合は, 何も表示されません。
    907         * 初期値は、 "false"(ファイルチェックを行わない)です。
    908         * 注意：現状、viewLink タグからの使用は出来ませんので、ご了承願います。
    909         *
    910         * @param       flag 存在チェック [true:行う/false:行わない])
    911         */
    912        public void setFileCheck( final String flag ) {
    913                fileCheck = nval( getRequestParameter( flag ),fileCheck );
    914        }
    915
    916        /**
    917         * 【TAG】アドレスにファイルのディレクトリ直接のアドレスを指定するかどうか[true/false]設定します(初期値:false)。
    918         *
    919         * @og.tag
    920         * "true"の場合は、ファイルの物理ディレクトリをリンクします。
    921         * 初期値は、 "false"(ファイルの直接アドレスを行わない)です。
    922         *
    923         * @param       flag ファイルのディレクトリ直接のアドレスの指定 [true:直接アドレス/その他:通常のURL]
    924         */
    925        public void setFilePath( final String flag ) {
    926                filePath = nval( getRequestParameter( flag ),filePath );
    927        }
    928
    929        /**
    930         * 【TAG】画面ID を指定します。
    931         *
    932         * @og.tag
    933         * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。
    934         * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、
    935         * href 属性をそのままリンク情報を作成します。
    936         * 画面IDを指定する場合の href は、JSPファイル名(例えば、index.jsp 等)です。
    937         * ※ 画面ID属性は、[カラム名]等の動的指定はできません。
    938         *
    939         * @og.rev 3.1.2.0 (2003/04/07) リンク指定時に、画面IDを渡して、実アドレスを求める事ができる様にする。
    940         *
    941         * @param   id 画面ID属性
    942         */
    943        public void setGamenId( final String id ) {
    944                gamenId = nval( getRequestParameter( id ),gamenId );
    945        }
    946
    947        /**
    948         * 【TAG】GAMENID,BACK_GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true)。
    949         *
    950         * @og.tag
    951         * "true"の場合は、GAMENID,BACK_GAMENID 属性を href に追加します。(?KEY1=VAL1&amp;KEY2=VAL2･･･)
    952         * "false"の場合は、付加しません。
    953         * JavaScript や、通常のファイル( .html や .pdf 等)に、GAMENID,BACK_GAMENID 属性を付けないように
    954         * する事が出来ます。
    955         * 初期値は、 "true"(GAMENID,BACK_GAMENID 属性を href に追加する)です。
    956         *
    957         * @og.rev 3.1.8.0 (2003/05/16) GAMENID属性のＵＲＬへの自動セットを行うかどうかを決める属性( useGamenId )を追加。
    958         *
    959         * @param       flag BACK_GAMENID属性の追加可否 [true:追加する/その他:追加しない]
    960         */
    961        public void setUseGamenId( final String flag ) {
    962                useGamenId = nval( getRequestParameter( flag ),useGamenId );
    963        }
    964
    965        /**
    966         * 【TAG】処理するマークを含むような文字列を、"|"区切りの文字列で指定します(初期値:"true|TRUE|1")。
    967         *
    968         * @og.tag
    969         * markListで与えられた文字列に、onLink文字列(大文字/小文字の区別あり)が
    970         * 含まれていれば、処理します。
    971         * 例えば、"A","B","C" という文字列が、onLink で指定された
    972         * 場合に処理するようにしたい場合は、"A|B|C" をセットします。
    973         * markList には、[カラム名]指定が可能です。
    974         * 初期値は、 "true|TRUE|1"です。
    975         *
    976         * @og.rev 3.5.2.0 (2003/10/20) 新規追加
    977         *
    978         * @param       list 処理するマーク (indexOf による含む/含まない判定)
    979         */
    980        public void setMarkList( final String list ) {
    981                markList = nval( getRequestParameter( list ),markList );
    982        }
    983
    984        /**
    985         * 【TAG】href ではなく、xlink:href を使用するかどうか[true/false]を指定します(初期値:false)。
    986         *
    987         * @og.tag
    988         * xlink:href 属性は、XMLでのリンクを指定します。その場合、href 属性で指定した
    989         * 内容は、xlink:href に置き換えられます。
    990         * また、URL文字列の接続文字列(&amp;)を、(&amp;amp;)で接続します。これは、xlink として、
    991         * XMLファイルに埋め込む場合に、置き換えが必要な為です。
    992         * 初期値は、 "false"(通常の href) です。
    993         *
    994         * @og.rev 3.5.5.0 (2004/03/12) 新規追加
    995         *
    996         * @param       lnk XMLリンクを使用可否 [true:する/false:しない]
    997         */
    998        public void setXlink( final String lnk ) {
    999                xlink = nval( getRequestParameter( lnk ),xlink );
    1000        }
    1001
    1002        /**
    1003         * 【TAG】ダイレクトジャンプを使用するかどうか[true/false]を指定します(初期値:false)。
    1004         *
    1005         * @og.tag
    1006         * ダイレクトジャンプ(指定の画面へ直接飛ばす)は、簡易ワークフロー的に、画面への
    1007         * リンクを作成する場合に使用します。一般には、メール本文に記述して、指定の画面まで
    1008         * 直接飛ばす場合に使用します。
    1009         * このリンクは、その画面の index.jsp に直接ジャンプします。
    1010         *
    1011         * gamenId を指定しなければ、この画面が指定されたと考えます。
    1012         * target を指定しなければ、"_blank" を指定します。
    1013         * msg がなければ(または、BODY部が空の場合)、画面名にこのリンクを作成します。
    1014         * 初期値は、 "false"(使用しない) です。
    1015         *
    1016         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    1017         *
    1018         * @param       directJump ダイレクトジャンプを使用可否 [true:する/false:しない]
    1019         */
    1020        public void setUseDirectJump( final String directJump ) {
    1021                useDirectJump = nval( getRequestParameter( directJump ),useDirectJump );
    1022        }
    1023
    1024        /**
    1025         * 【TAG】リクエストキャッシュ情報を使用するかどうか[true/false]を指定します(初期値:true)。
    1026         *
    1027         * @og.tag
    1028         * リクエストキャッシュ情報は、戻るリンクで画面を差表示(command=RENEW)する場合に
    1029         * 最後に検索に利用された情報をキャッシュしておき、再利用する場合に利用する値です。
    1030         * ダイレクトジャンプ機能(useDirectJum=true)の場合のみ有効です。
    1031         * 戻るリンクによる再表示は、各画面自身が持っている情報を利用しますが、
    1032         * ダイレクトジャンプ等で、すでにキャッシュが存在していない(セッションが異なっている)
    1033         * 場合に、リンク情報に直接紐付けて、再検索させる必要がある場合に利用します。
    1034         * このキャッシュは、keys,vals による値の再設定で、書き換えることが可能です。
    1035         *
    1036         * 初期値は、 "true"(使用する) です。
    1037         *
    1038         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    1039         *
    1040         * @param       useCache リクエストキャッシュ使用可否 [true:する/false:しない]
    1041         */
    1042        public void setUseRequestCache( final String useCache ) {
    1043                useRequestCache = nval( getRequestParameter( useCache ),useRequestCache );
    1044        }
    1045
    1046        /**
    1047         * 【TAG】リクエストキャッシュ情報使用時に使用しない(削除する)キーをCSV形式で複数指定します。
    1048         *
    1049         * @og.tag
    1050         * リクエストキャッシュ情報には、一般に検索時に使用されたすべての引数が
    1051         * 使用されます。この引数を、転送先画面では、使用しないケースがあり、その場合に、
    1052         * 指定のキー情報を、削除します。
    1053         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    1054         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    1055         *
    1056         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    1057         *
    1058         * @param       key     使用しない(削除する)キー(CSV形式)
    1059         */
    1060        public void setDelKeys( final String key ) {
    1061                delKeys = getCSVParameter( key );
    1062        }
    1063
    1064        /**
    1065         * 【TAG】ダイレクトジャンプリンク時のハッシュ化されたURLの有効期間を日数を指定します
    1066         *              (初期値:LINK_VALID_DURATION_DAYS[={@og.value SystemData#LINK_VALID_DURATION_DAYS}])。
    1067         *
    1068         * @og.tag
    1069         * ダイレクトジャンプリンクの引数を作成する場合、有効期限を指定できます。
    1070         * ここでは、設定時刻からの有効期間を日数指定します。
    1071         * 実際には、GE17のvalidDateカラムに設定される、日付と現在日を比較して、
    1072         * 有効かどうかを判断します。
    1073         * ゼロが指定された場合は、制限なしに設定されます。マイナスの場合は、初期値が使われます。
    1074         * (初期値:ユーザー定数のLINK_VALID_DURATION_DAYS[={@og.value SystemData#LINK_VALID_DURATION_DAYS}])。
    1075         *
    1076         * @og.rev 4.0.0.0 (2005/09/30) 新規追加
    1077         *
    1078         * @param       validDura       URLの有効期間日数
    1079         * @see         org.opengion.hayabusa.common.SystemData#LINK_VALID_DURATION_DAYS
    1080         */
    1081        public void setValidDuration( final String validDura ) {
    1082                validDuration = nval( getRequestParameter( validDura ),validDuration );
    1083        }
    1084
    1085        /**
    1086         * 【TAG】リンク(アンカータグ)ではなく、href 属性をそのまま返すかどうか[true/false]を指定します(初期値:false)。
    1087         *
    1088         * @og.tag
    1089         * 通常のリンクは、アンカータグ(aタグ)の状態で出力されます。その場合、HTML上では
    1090         * リンクとして表示されます。このフラグをtrue にセットすると、リンク文字列
    1091         * そのものが出力されます。これは、リンク文字列を作成してDBに登録する場合などに
    1092         * 使用します。
    1093         *
    1094         * 初期値は、false:リンク です。
    1095         *
    1096         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    1097         *
    1098         * @param       flag href属性 [true:href属性/false:リンク]
    1099         */
    1100        public void setHrefOnly( final String flag ) {
    1101                hrefOnly = nval( getRequestParameter( flag ),hrefOnly );
    1102        }
    1103
    1104        /**
    1105         * 【TAG】リンク(アンカータグ)ではなく、href 属性と、target属性を キーも含めて返すかどうか[true/false]を指定します(初期値:false)。
    1106         *
    1107         * @og.tag
    1108         * 内容的には、hrefOnly と類似の機能で、アンカータグ(aタグ)の出力ではなく、href 属性と、
    1109         * target属性を キーも含めて作成します。
    1110         * 「href="*******" target="******"」 という形式になります。
    1111         * これは、クリッカブルマップ等の href 属性と target属性の両方を使用するようなケースで使います。
    1112         * また、onLink、markList を使ったリンク作成可否の処理をおこなった場合、通常であれば、
    1113         * 指定のカラムの値が取得できますが、その場合は、先頭文字列が、href かどうかを判定することで、
    1114         * リンク作成可否の判断が可能です。
    1115         * 逆に言えば、この属性を true にセットした場合は、先頭文字列が、href で始まることが保障されます。
    1116         * hrefOnly = true と同時に設定した場合は、hrefOnly が優先されます。
    1117         *
    1118         * 初期値は、false:リンク です。
    1119         *
    1120         * @og.rev 5.5.5.6 (2012/08/31) 新規追加
    1121         *
    1122         * @param       flag 出力形式 [true:href,target形式/false:リンク]
    1123         */
    1124        public void setHrefTarget( final String flag ) {
    1125                hrefTarget = nval( getRequestParameter( flag ),hrefTarget );
    1126        }
    1127
    1128        /**
    1129         * 【TAG】リンクアドレスにURLチェック用の確認キーを付加するかどうか[true/false]を指定します(初期値:false)。
    1130         *
    1131         * @og.tag
    1132         * この属性は、URLCheckFilter(org.opengion.hayabusa.filter.URLCheckFilter)と合わせて使用します。
    1133         * trueが指定された場合、リンクURLのパラメーターに、URL確認用のパラメーターが出力されます。
    1134         * このパラメーターを、URLCheckFilterが復号化し、正式なアクセスであるかどうかの判定を行います。
    1135         *
    1136         * 初期値は、 "false"(確認キーを出力しない) です。
    1137         *
    1138         * @og.rev 4.3.7.0 (2009/06/01) 新規追加
    1139         *
    1140         * @param       flag 暗号化するかかどうか [true:暗号化する/false:しない]
    1141         * @see org.opengion.hayabusa.filter.URLCheckFilter
    1142         */
    1143        public void setUseURLCheck( final String flag ) {
    1144                useURLCheck = nval( getRequestParameter( flag ),useURLCheck );
    1145        }
    1146
    1147        /**
    1148         * 【TAG】URLチェック用の確認キーに対して、リンクを開くことのできるユーザーIDを指定します(初期値:ログインユーザー)。
    1149         *
    1150         * @og.tag
    1151         * URLチェック用の確認キーに対して、リンクを開くことのできるユーザーIDを
    1152         * CSV形式で指定します。
    1153         * "*"が指定された場合、ユーザーチェックは行われません。
    1154         *
    1155         * 初期値は、 ログインユーザーです。
    1156         *
    1157         * @og.rev 4.3.8.0 (2009/08/01) 新規追加
    1158         *
    1159         * @param       user リンクにアクセス可能なユーザー一覧
    1160         */
    1161        public void setUrlCheckUser( final String user ) {
    1162                urlCheckUser = nval( getRequestParameter( user ),urlCheckUser );
    1163        }
    1164
    1165        /**
    1166         * 【TAG】URLチェック用の確認キーに対して、リンクの有効期限を指定します(初期値:60分)。
    1167         *
    1168         * @og.tag
    1169         * URLチェック用の確認キーに対して、リンクが生成されてからの有効期限を分単位で設定します。
    1170         * 属性値の先頭に'D'をつけることで、日付指定を行うことができます。
    1171         * (D20090612 ⇒ 20090612まで(当日を含む)は有効)
    1172         *
    1173         * 初期値は、現在時間を基準として+ "1440"(1日) です。
    1174         *
    1175         * @og.rev 4.3.8.0 (2009/08/01) 新規追加
    1176         * @og.rev 6.2.5.0 (2015/06/05) urlCheckTimeの初期値を、INIT_TIMEに変更
    1177         *
    1178         * @param       time リンクの有効期限(分)
    1179         */
    1180        public void setUrlCheckTime( final String time ) {
    1181                final String tm = getRequestParameter( time );
    1182
    1183                if( StringUtil.startsChar( tm , 'D' ) ) {                       // 6.2.0.0 (2015/02/27) １文字 String.startsWith
    1184                        if( tm.length() < 9 ) {
    1185                                final String errMsg = "urlCheckTime属性の日付はYYYYMMDD形式で指定して下さい。"
    1186                                                        + " 値=" + tm ;                  // 5.1.8.0 (2010/07/01) errMsg 修正
    1187                                throw new HybsSystemException( errMsg );
    1188                        }
    1189                        final Calendar cal = new GregorianCalendar(
    1190                                        Integer.parseInt( tm.substring( 1, 5 ) )
    1191                                        ,Integer.parseInt( tm.substring( 5, 7 ) ) - 1
    1192                                        ,Integer.parseInt( tm.substring( 7, 9 ) ) );            // 6.0.2.4 (2014/10/17) メソッド間違い
    1193                        urlCheckTime = INIT_TIME + cal.getTimeInMillis() - System.currentTimeMillis() ;         // 6.2.5.0 (2015/06/05)
    1194                }
    1195                // 6.2.5.0 (2015/06/05) tm が null でない時のみセット。null の場合は、初期値のままになる。
    1196                else if( tm != null ) {
    1197                        // 6.3.9.0 (2015/11/06) 整数乗算の結果を long にキャストしている(findbugs)
    1198                        urlCheckTime = 60L * 1000L * Integer.parseInt( tm ) ;
    1199                }
    1200        }
    1201
    1202        /**
    1203         * 【TAG】URLチェック用の暗号化キーを指定します(初期値:デフォルト)。
    1204         *
    1205         * @og.tag
    1206         * URLチェックに利用される暗号化のキーをしています。
    1207         * 受け側の設定(URL_CHECK_CRYPT)に合わせてください。
    1208         *
    1209         * 未指定の場合は標準が利用されます。
    1210         *
    1211         * @og.rev 5.8.8.0 (2015/06/05) 新規追加
    1212         *
    1213         * @param       crypt 暗号化キー
    1214         */
    1215        public void setUrlCheckCrypt( final String crypt ) {
    1216                urlCheckCrypt = nval( getRequestParameter( crypt ),urlCheckCrypt );
    1217        }
    1218
    1219        /**
    1220         * 【TAG】ファイルのhref 部分の一部をURLEncodeするかどうか[true/false]を指定します
    1221         *              (初期値:USE_HREF_URLENCODE[={@og.value SystemData#USE_HREF_URLENCODE}])。
    1222         *
    1223         * @og.tag
    1224         * ファイル等のリンクで、keys,vals は、URLEncode していましたが、URL に相当する箇所は
    1225         * http:// など URLEncode してはいけない箇所がある為、何もしていませんでした。
    1226         * ファイルのダウンロード等で、ファイル名に、";" や "%" が存在すると、認識できないため
    1227         * ファイルが見つからないエラーが発生していました。
    1228         * なお、ファイルに限定する意味で、useGamenId="false" の場合のみ、有効にします。
    1229         *      (初期値:USE_HREF_URLENCODE[={@og.value SystemData#USE_HREF_URLENCODE}])。
    1230         *
    1231         * ※ 6.2.0.1 (2015/03/06) ASCII以外の文字＋";" と "%"の、URLエンコードを行う様に仕様変更。
    1232         *
    1233         * @og.rev 6.0.2.0 (2014/09/19) 新規追加
    1234         *
    1235         * @param       useEnc hrefの一部をURLEncode可否 [true:する/false:しない]
    1236         */
    1237        public void setUseHrefEncode( final String useEnc ) {
    1238                useHrefEncode = nval( getRequestParameter( useEnc ),useHrefEncode );
    1239        }
    1240
    1241        /**
    1242         * 【TAG】(通常は使いません)カラムＩＤの存在チェックを行うかどうか[true/false]を指定します(初期値:true)。
    1243         *
    1244         * @og.tag
    1245         * true の場合、カラムＩＤがDBTableModel に存在しない場合は、エラーになります。
    1246         * false の場合、カラムＩＤがDBTableModel に存在しない場合は、無視します。
    1247         * これは、検索条件によって、設定されるカラムが異なる場合でも、後続処理を
    1248         * 正常に動作させたい場合に、使用します。
    1249         * 初期値は true (チェックを行う) です。
    1250         * この属性は、column属性とともに、ViewLink タグを使用する場合にのみ有効です。
    1251         *
    1252         * @og.rev 6.7.6.0 (2017/03/17) strictCheck 追加。
    1253         *
    1254         * @param  check 存在チェック [true:行う/false:行わない]
    1255         */
    1256        public void setStrictCheck( final String check ) {
    1257                strictCheck = nval( getRequestParameter( check ),strictCheck );
    1258        }
    1259
    1260//      /**
    1261//       * 【TAG】外部（プラグイン）のトークンを利用する場合にプラグインを指定します。
    1262//       *
    1263//       * @og.tag
    1264//       * プラグインの名前を指定する事で、該当のCreateTokenを利用して
    1265//       * URLに対してトークンを付与します。
    1266//       * （CreatetToken_xxxのxxxを指定します）
    1267//       *
    1268//       * CSV形式を分解して、プラグインを配列として持ちます。
    1269//       * 適応は前から順番に行います。
    1270//       *
    1271//       * @og.rev 5.8.2.1 (2014/12/13) 新規追加
    1272//       * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。
    1273//       * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止
    1274//       *
    1275//       * @param       name 利用するCreateTokenプラグイン
    1276//       */
    1277//      public void setExtToken( final String name ) {
    1278//              extToken = nval( getRequestParameter( name ),extToken );
    1279//              ctArray  = new ArrayList<>();
    1280//
    1281//              if( extToken != null && extToken.length() > 0 ) {
    1282//                      final String[] tokens = StringUtil.csv2Array( extToken );
    1283//                      for( final String tk : tokens ) {
    1284//                              final CreateToken ct = HybsSystem.newInstance( "CreateToken_" , tk );
    1285//                              ctArray.add( ct );
    1286//                      }
    1287//              }
    1288//      }
    1289
    1290        /**
    1291         * このオブジェクトの文字列表現を返します。
    1292         * 基本的にデバッグ目的に使用します。
    1293         *
    1294         * @return このクラスの文字列表現
    1295         * @og.rtnNotNull
    1296         */
    1297        @Override
    1298        public String toString() {
    1299                return ToString.title( this.getClass().getName() )
    1300                                .println( "VERSION"                     ,VERSION                )
    1301                                .println( "column"                      ,column                 )
    1302                                .println( "onLink"                      ,onLink                 )
    1303                                .println( "fileCheck"           ,fileCheck              )
    1304                                .println( "filePath"            ,filePath               )
    1305                                .println( "baseURL"                     ,baseURL                )
    1306                                .println( "gamenId"                     ,gamenId                )
    1307                                .println( "useGamenId"          ,useGamenId             )
    1308                                .println( "markList"            ,markList               )
    1309                                .println( "xlink"                       ,xlink                  )
    1310                                .println( "useDirectJump"       ,useDirectJump  )
    1311                                .println( "useRequestCache"     ,useRequestCache)
    1312                                .println( "hrefOnly"            ,hrefOnly               )
    1313                                .println( "hrefTarget"          ,hrefTarget             )               // 5.5.5.6 (2012/08/31)
    1314                                .println( "strictCheck"         ,strictCheck    )               // 6.7.6.0 (2017/03/17)
    1315                                .println( "validDuration"       ,validDuration  )
    1316                                .println( "keys"                        ,keys                   )
    1317                                .println( "vals"                        ,vals                   )
    1318                                .println( "delKeys"                     ,delKeys                )
    1319                                .println( "useURLCheck"         ,useURLCheck    )
    1320                                .println( "urlCheckUser"        ,urlCheckUser   )
    1321                                .println( "urlCheckTime"        ,urlCheckTime   )
    1322                                .println( "Other..."            ,getAttributes().getAttribute() )
    1323                                .fixForm().toString() ;
    1324        }
    1325}