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