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