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