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