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.IOException;
021import java.io.ObjectInputStream;
022import java.io.ObjectOutputStream;
023
024import javax.mail.internet.MimeUtility;
025import javax.servlet.ServletException;
026import javax.servlet.http.HttpServletRequest;
027import javax.servlet.http.HttpServletResponse;
028
029import org.opengion.fukurou.security.HybsCryptography;
030import org.opengion.fukurou.util.LogWriter;
031import org.opengion.fukurou.util.StringUtil;
032import org.opengion.fukurou.util.XHTMLTag;
033import org.opengion.hayabusa.common.HybsSystem;
034import org.opengion.hayabusa.common.HybsSystemException;
035import org.opengion.hayabusa.db.DBTableModel;
036import org.opengion.hayabusa.resource.GUIInfo;
037
038/**
039 * 制御を別の画面にフォワードする場合に使用するタグです(通常は、entry.jsp で使用します)。
040 *
041 * フォワード時に、指定の引数をセットできます。
042 *
043 * @og.formSample
044 * ●形式:<og:forward page="…" gamenId="[…]" />
045 * ●body:なし
046 *
047 * ●Tag定義:
048 *   <og:forward
049 *       gamenId            【TAG】gamenId 属性を登録します
050 *       page             ○【TAG】転送先URLを指定します(必須)。
051 *       keys               【TAG】キーを CSV 形式でセットします
052 *       vals               【TAG】キーに対応する値を CSV 形式でセットします
053 *       dbkeys             【TAG】DBキーをCSV 形式でセットします
054 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
055 *       useRedirect        【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)
056 *       target             【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します
057 *       filename           【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)
058 *       noTransition       【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します
059 *       useAjaxSubmit      【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します
060 *       redirectEncode     【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)
061 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
062 *   />
063 *
064 * ●使用例
065 *       <og:forward
066 *          page          = "転送先URLを指定します(必須)。"
067 *          dbkeys        = "DBキーをCSV 形式でセットします。"
068 *          keys          = "キーを CSV 形式でセットします。"
069 *          vals          = "キーに対応する値を CSV 形式でセットします。"
070 *          scope         = "キャッシュする場合のスコープ(request,page,session,applicaton)を指定します(初期値:session)。"
071 *          gamenId       = "gamenId 属性を登録します。"
072 *          useRedirect   = "useRedirect 属性を登録します。"
073 *          filename      = "ファイル転送時にファイル名を指定する場合に設定します。"
074 *          target        = "taregt 属性を登録します。"
075 *          noTransition  = "実際にforwardせずに、id="forwardUrl"属性のbody部分に遷移先のURLを出力します。(画面遷移なしモード時に使用します)"
076 *       />
077 *
078 * @og.group 画面制御
079 *
080 * @version  4.0
081 * @author       Kazuhiko Hasegawa
082 * @since    JDK5.0,
083 */
084public class ForwardTag extends CommonTagSupport {
085        //* このプログラムのVERSION文字列を設定します。   {@value} */
086        private static final String VERSION = "5.7.4.1 (2014/03/14)" ;
087
088        private static final long serialVersionUID = 574120140314L ;
089
090        private transient DBTableModel  table   = null;
091        private String          tableId         = HybsSystem.TBL_MDL_KEY;
092        private String          page            = null;
093        private String          keys            = null;
094        private String          dbkeys          = null;
095        private String[]        vals            = null;
096        private String          gamenId         = null;         // 3.5.4.9 (2004/02/25) 追加
097        private boolean         useRedirect = false;    // 3.5.6.6 (2004/08/23) 追加
098        private String          target          = null;         // 3.8.0.4 (2005/08/08) 追加
099        private String          filename        = null;         // 4.0.0 (2005/11/30) 追加
100//      private static final String             disposition = "inline"; // 固定
101        private String          disposition = "inline"; // 5.10.12.0 (2019/06/03)
102        private boolean         noTransition= false;    // 4.3.3.0 (2008/10/01) 追加
103        private boolean         useAjaxSubmit           = false;        // 4.3.8.0 (2009/08/01) 追加
104//      private boolean         useEncodeRedirect       = true;         // 5.6.5.0 (2013/06/07) 追加、即廃止
105        private String          redirectEncode  = null;                 // 5.6.5.0 (2013/06/07) 追加
106        // urlCheck関係 5.10.11.0 (2019/05/03) 追加
107        private boolean useURLCheck = HybsSystem.sysBool( "LINK_URL_CHECK" );
108        private long            urlCheckTime= 1000*60*60*24;// 5.10.11.0 (2019/05/03)
109        private String          urlCheckCrypt = HybsSystem.sys( "URL_CHECK_CRYPT" );
110        private boolean useForceEnc = false; // 5.10.15.3 (2019/09/27) 強制URLエンコード用
111
112        /**
113         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
114         *
115         * @og.rev 2.1.0.0 (2002/10/11) 戻り値の先頭の "?" を追加しないように変更。
116         * @og.rev 3.0.1.3 (2003/03/11) 直接転送した場合の整合性を取る為の対応。
117         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
118         * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定値を、定義ファイルを使用するように変更する。
119         * @og.rev 3.5.4.9 (2004/02/25) gamenId を指定して、フォワードできるようにします。
120         * @og.rev 3.5.6.6 (2004/08/23) useRedirect 属性を追加します。
121         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
122         * @og.rev 4.3.7.1 (2009/06/08) target属性に絶対パス及び"_"で始まる予約語を指定できるようにします。
123         * @og.rev 4.3.8.0 (2009/08/01) useAjaxSubmit対応、noTransition値取得メソッド名変更
124         * @og.rev 5.0.0.4 (2009/10/01) 画面遷移なし登録で戻った際に最終行が選択されるバグを修正
125         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
126         * @og.rev 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
127         * @og.rev 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
128         * @og.rev 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
129         * @og.rev 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
130         * @og.rev 5.3.8.0 (2011/08/01) ファイル名指定でIEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。
131         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
132         * @og.rev 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
133         * @og.rev 5.9.29.0 (2018/01/30) Edge,safariの日本語ファイル名対応(RFC6266方式を併記)
134         * @og.rev 5.10.11.0 (2019/05/03) URLチェック対応を追加
135         * @og.rev 5.10.12.0 (2019/06/03) content-typeを追加
136         *
137         * @return      後続処理の指示
138         */
139        @Override
140        public int doEndTag() {
141                debugPrint();           // 4.0.0 (2005/02/28)
142                // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加
143//              noTransition = isNoTransitionSession() || noTransition; // 4.3.8.0 (2009/08/01) メソッド名変更
144//              useAjaxSubmit    = isAjaxSubmitSession() || useAjaxSubmit; // 4.3.8.0 (2009/08/01) 追加
145                noTransition = isNoTransitionRequest(); // 5.1.3.0 (2010/02/01)
146                useAjaxSubmit = isAjaxSubmitRequest(); // 5.1.3.0 (2010/02/01)
147
148                String urlEnc = getUrlEncode();
149                String fwdUrl = makeGamenLink();                // 3.5.4.9 (2004/02/25)
150
151                HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
152                try {
153                        String url = response.encodeRedirectURL( fwdUrl );      // 3.5.4.9 (2004/02/25)
154
155                        if( filename != null ) {
156                                // 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
157//                              if( ( (HttpServletRequest)pageContext.getRequest() ).getHeader( "User-Agent" ).indexOf( "MSIE" ) == -1 ) {
158//                                      filename = MimeUtility.encodeWord( filename, "UTF-8", "B" );
159//                              }
160//                              else {
161//                                      // 5.3.8.0 (2011/08/01) IEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。
162////                                    filename = StringUtil.urlEncode( filename );
163//                                      filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" );
164//                              }
165                                String newFilename        = filename;
166                                String newFilenameEnc = StringUtil.urlEncode( newFilename );  // 5.9.29.0 (2018/02/02)
167                        
168                                // 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
169                                // 条件を反転させた上でIE11対応を行う
170                                String reqHeader = ((HttpServletRequest)pageContext.getRequest()).getHeader( "User-Agent" );
171                                if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 ) {
172                                        filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" );
173                                }
174                                else {
175                                        filename = MimeUtility.encodeWord( filename, "UTF-8", "B" );
176                                }
177
178                                (response).setContentType( "application/octet-stream" ); // 5.10.12.0 (2019/06/3)
179                                
180//                              (response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );
181                                (response).setHeader( "Content-disposition",disposition + "; filename=\"" + newFilename + "\"; "
182                                                + "filename*=UTF-8''" + newFilenameEnc ); // 5.9.29.0 (2018/02/02) RFC6266方式を併記
183                        }
184                        // 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
185                        // 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
186                        else {
187//                              if( page.endsWith( ".jsp" ) ) {
188                                if( !page.startsWith( "http" ) && page.endsWith( ".jsp" ) ) {
189                                        if( keys == null || keys.length() == 0 || ( "," + keys + "," ).indexOf( ",GAMENID," ) < 0 ) {
190                                                if( gamenId != null && gamenId.length() > 0 ) {
191                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + gamenId );
192                                                }
193                                                // useRedirect=trueでGAMENIDを指定せず、../GF9100/index.jsp等と書かれている場合の対応
194                                                else if( !useRedirect ) {
195                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + getGUIInfoAttri( "KEY" ) );
196                                                }
197                                        }
198                                }
199                        }
200
201                        // 3.5.6.6 (2004/08/23) useRedirect 属性を追加
202                        String url2 = XHTMLTag.addUrlEncode( url , urlEnc );
203                        // 4.3.3.0 (2008/10/01) 追加
204                        // if( noTransition ) {
205                        if( noTransition || useAjaxSubmit ) { // 4.3.8.0 (2009/08/01) useAjaxSubmitと共用
206                                // 5.0.0.4 (2009/10/01)
207                                if( noTransition ) {
208                                        int selRow = nval( getRequestValue( "SEL_ROW" ),-1 );
209                                        if( selRow > 0 ) {
210                                                url2 = XHTMLTag.addUrlEncode( url2, "SEL_ROW=" + selRow );
211                                        }
212                                }
213                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
214                                        url2 = addURLCheck(url2);
215                                }
216                                jspPrint( "<div id=\"noTransitionUrl\">" + url2 + "</div>" );
217                                jspPrint( "<div id=\"noTransitionTarget\">" + target + "</div>" );
218                        }
219                        
220                        // 3.8.0.4 (2005/08/08) target 属性を追加します。
221//                      else if( target != null ) {
222                        else if( target != null && target.length() > 0 ) {
223                                // 4.3.7.1 (2009/06/08)
224                                String src = null;
225                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
226                                        url2 = addURLCheck(url2);
227                                }
228                                
229                                if( target.startsWith( "_b" ) ) { // "_blank"
230                                        src = "window.open(\"" + url2 + "\", \"_blank\") ";
231                                }
232                                else {
233                                        String frameTop = "";
234                                        if( target.indexOf('.') < 0 ) { frameTop = "top."; }
235                                        src = frameTop + target + ".location.href=\"" + url2 + "\"" + HybsSystem.CR;
236                                }
237//                              String script = "<script language=\"JavaScript\" ><!-- " + HybsSystem.CR
238                                String script = "<script type=\"text/javascript\" ><!-- " + HybsSystem.CR
239                                                                + src + HybsSystem.CR
240                                                        + "// --></script>" ;
241                                jspPrint( script );
242                        }
243                        else if( useRedirect ) {
244                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
245                                        url2 = addURLCheck(url2);
246                                }
247                                // 5.6.5.0 (2013/06/07) redirectEncode 属性追加
248                                if( redirectEncode != null ) {
249                                        url2 = new String( url2.getBytes( redirectEncode ), "ISO-8859-1" );
250                                }
251                                response.sendRedirect( url2  );
252                        }
253                        else {
254                                pageContext.forward( url2 );
255                        }
256                } catch(IOException ex) {
257                        String errMsg = "フォワード/リダイレクトでIOエラーが発生しました。"
258                                                                + HybsSystem.CR
259                                                                + fwdUrl + "?" + urlEnc ;
260                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
261                } catch( ServletException ex) {
262                        String errMsg = "フォワード/リダイレクトでServletエラーが発生しました。"
263                                                                + HybsSystem.CR
264                                                                + fwdUrl + "?" + urlEnc ;
265                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
266                }
267
268                // 3.0.1.3 (2003/03/11) forward で直接転送した場合の整合性を取る為の対応。
269                // 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
270                if( fwdUrl != null && fwdUrl.endsWith( ".jsp" ) ) {
271                        setSessionAttribute( HybsSystem.FORWARD_PAGE_KEY, fwdUrl );     // 3.5.4.9 (2004/02/25)
272                }
273
274                return(SKIP_PAGE);              // ページの残りの処理を行わない。
275        }
276
277        /**
278         * タグリブオブジェクトをリリースします。
279         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
280         *
281         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
282         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
283         * @og.rev 3.5.4.9 (2004/02/25) 画面ID属性(gamenId)を追加
284         * @og.rev 3.8.5.0 (2006/03/06) filename 属性を追加します。
285         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
286         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
287         * @og.rev 5.10.11.0 (2019/05/03) urlCheck対応
288         * @og.rev 5.10.12.0 (2019/06/03) disposition
289         * @og.rev 5.10.15.3 (2019/09/27) useForceEnc
290         *
291         */
292        @Override
293        protected void release2() {
294                super.release2();
295                tableId         = HybsSystem.TBL_MDL_KEY;
296                page            = null;
297                keys            = null;
298                dbkeys          = null;
299                vals            = null;
300                table           = null;
301                gamenId         = null;
302                useRedirect = false;    // 3.5.6.6 (2004/08/23) 追加
303                target          = null;         // 3.8.0.4 (2005/08/08) 追加
304                filename        = null;
305                noTransition= false;    // 4.3.3.0 (2008/10/01) 追加
306                useAjaxSubmit           = false;        // 4.3.8.0 (2009/08/01) 追加
307                redirectEncode  = null;                 // 5.6.5.0 (2013/06/07) 追加
308                useURLCheck             = HybsSystem.sysBool( "LINK_URL_CHECK" ); // 5.10.11.0 (2019/05/03)
309                disposition     = "inline"; // 5.10.12.0 (2019/06/03)
310                useForceEnc = false; // 5.10.15.3 (2019/09/27)
311        }
312
313        /**
314         * keys 属性 を元に、request情報より values の値を取り込む。
315         *
316         * keys属性は キー情報がカンマ区切りになっている為,ばらして
317         * values属性の配列に一つづつ設定していきます。
318         *
319         * @og.rev 3.1.7.0 (2003/05/02) 戻るボタン用のBACK_GAMENID を、引数に追加します。
320         * @og.rev 3.1.8.0 (2003/05/16) 戻るボタン用のBACK_GAMENID の自動登録を廃止します。
321         * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
322         * @og.rev 5.10.15.3 (2019/09/27) forceEnc対応
323         *
324         * @return      URLエンコードされた文字列
325         */
326        private String getUrlEncode() {
327                String[] dbkey = StringUtil.csv2Array( dbkeys );
328                String[] key   = StringUtil.csv2Array( keys );
329
330//              int dbCount = (dbkey != null) ? dbkey.length : 0 ;
331//              int count   = (key   != null) ? key.length   : 0 ;
332                int dbCount = dbkey.length;
333                int count   = key.length  ;
334
335                String[] allKey = new String[ dbCount + count ];
336                String[] allval = new String[ dbCount + count ];
337
338                int[] rowNo = getParameterRows();               // 4.0.0 (2005/01/31)
339                if( dbCount > 0 && dbkey[0] != null && dbkey[0].length() > 0 && rowNo.length > 0 ) {
340                        table = (DBTableModel)getObject( tableId );
341                        if( table != null ) {
342                                for( int i=0; i<dbCount; i++ ) {
343                                        allKey[i] = dbkey[i];
344                                        allval[i] = table.getValue(rowNo[0],table.getColumnNo( dbkey[i] ));
345                                }
346                        }
347                }
348
349                if( count > 0 ) {
350                        for( int i=0; i<count; i++ ) {
351                                allKey[i+dbCount] = key[i];
352                                allval[i+dbCount] = vals[i];
353                        }
354                }
355
356//              return XHTMLTag.urlEncode( allKey,allval );
357                return XHTMLTag.urlEncode( allKey,allval,"&",useForceEnc ); // 5.10.15.3 (2019/09/27)
358        }
359
360        /**
361         * 【TAG】転送先URLを指定します。
362         *
363         * @og.tag 転送先URLを指定します。
364         *
365         * @param       url 転送先URL
366         */
367        public void setPage( final String url ) {
368                page = getRequestParameter( url );
369        }
370
371        /**
372         * 【TAG】DBキーをCSV 形式でセットします。
373         *
374         * @og.tag
375         * URI の引数にセットするキーを CSV 形式でセットします。
376         * ここの指定は,DBTableModel 上のデータを取り込みます。
377         *
378         * @param       key DBキー(CSV 形式)
379         */
380        public void setDbkeys( final String key ) {
381                dbkeys = getRequestParameter( key ) ;
382        }
383
384        /**
385         * 【TAG】キーを CSV 形式でセットします。
386         *
387         * @og.tag
388         * URI の引数にセットするキーを CSV 形式でセットします。
389         *
390         * @param       key キー(CSV 形式)
391         */
392        public void setKeys( final String key ) {
393                keys = getRequestParameter( key ) ;
394        }
395
396        /**
397         * 【TAG】キーに対応する値を CSV 形式でセットします。
398         *
399         * @og.tag
400         * URI の引数にセットする値を CSV 形式でセットします。
401         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
402         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
403         *
404         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
405         *
406         * @param       val 値(CSV 形式)
407         */
408        public void setVals( final String val ) {
409                vals = getCSVParameter( val );
410
411                // 先に分解しないとデータ自身にカンマを持っている場合に分解をミスる。
412        }
413
414        /**
415         * 画面IDとpage から、フォワードするURLを作成します。
416         * page が null の場合は、index.jsp に転送されます。
417         *
418         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
419         * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。
420         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
421         *
422         * @return      フォワードするURL(転送先URL)
423         */
424        private String makeGamenLink() {
425                if( page == null ) { page = "index.jsp"; }
426
427                if( gamenId == null || gamenId.length() == 0 ) { return page; }
428
429                GUIInfo guiInfo = getGUIInfo( gamenId );
430                if( guiInfo == null ) { // 見つからない場合は、転送しない
431                        LogWriter.log( "Forward[" + gamenId + "]先にはアクセス不可です。" );
432                        return page;
433                }
434
435                String address = guiInfo.getRealAddress( page );
436                String link = getRequestParameter( address );
437
438                // Ver 4.0.0 (2007/06/12) gamenId を使用する場合は、useRedirect = true をセット
439                useRedirect = true;
440                return link;
441        }
442
443        /**
444         * 【TAG】gamenId 属性を登録します。
445         *
446         * @og.tag
447         * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。
448         * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、
449         * page 属性をそのままリダイレクトアドレスとします。
450         * gamenId を指定した場合は、このuseRedirect属性に関係なく、Redirect されます。
451         *
452         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
453         *
454         * @param   id gamenId 属性
455         * @see         #setUseRedirect( String )
456         */
457        public void setGamenId( final String id ) {
458                gamenId = nval( getRequestParameter( id ),gamenId );
459        }
460
461        /**
462         * 【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)。
463         *
464         * @og.tag
465         * useRedirect 属性は、URLの転送方式を指定できます。
466         * 通常は、pageContext.forward しますが、この属性に true を
467         * 設定すると、response.sendRedirect します。
468         * gamenId を指定した場合は、この属性に関係なく、Redirect されます。
469         * 初期値は、false (forward) です。
470         *
471         * @og.rev 3.5.6.6 (2004/08/23) 新規追加
472         *
473         * @param   flag useRedirect 属性 [false:forwrd/true:redirect]
474         * @see         #setGamenId( String )
475         */
476        public void setUseRedirect( final String flag ) {
477                useRedirect = nval( getRequestParameter( flag ),useRedirect );
478        }
479
480        /**
481         * 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します。
482         *
483         * @og.tag サブミット先のフレーム名(ターゲット属性)を設定します。
484         *
485         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
486         *
487         * @param       flag サブミット先の文書のフレーム名(ターゲット属性)
488         */
489        public void setTarget( final String flag ) {
490                target = nval( getRequestParameter( flag ),target );
491        }
492
493        /**
494         * 【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)。
495         *
496         * @og.tag
497         * ファイルを転送する場合に、オープンさせるファイル名を指定します。
498         * 指定しない場合は、フォラード前に呼び出されたアドレスがそのまま使用されます。
499         *
500         * @param   name ファイル名
501         */
502        public void setFilename( final String name ) {
503                filename = nval( getRequestParameter( name ),filename );
504        }
505        
506        /**
507         * 【TAG】ファイルダウンロードさせる場合に、Content-Disposition に設定する値
508         *
509         * @og.tag
510         * inline(そのまま開く) を指定すると、画面表示が基本です。
511         * PDF などは直接ダウンロードが始まります。
512         * attachment(ダウンロードダイアログを表示する) を指定すると、保存のダイアログを表示します。
513         * ただ、サーバやブラウザによって挙動が変わる事があるようです。
514         * 
515         *
516         * @og.rev 5.10.12.0 (2019/06/03) 6.4.3.0の移植で新規追加
517         *
518         * @param   dispos Content-Dispositionに設定する値(inline/attachment)
519         */
520        public void setDisposition( final String dispos ) {
521                final String temp = nval( getRequestParameter( dispos ),disposition );
522
523                if( "inline".equals( temp ) || "attachment".equals( temp ) ) {
524                        disposition = temp;
525                }
526                else {
527                        final String errMsg = "disposition 属性は、[inline/attachment] から、指定してください。"
528                                                                + " disposition=[" + dispos + "]";
529                        throw new HybsSystemException( errMsg );
530                }
531        }
532
533        /**
534         * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。
535         *
536         * @og.tag
537         * 画面遷移なしの登録を行うかどうかを指定します。
538         * trueが指定された場合、forwardタグでは、実際の画面遷移は行わずに、forward先の
539         * URLを<div id="noTransitionUrl">[URL]</div>の形でHTMLとして出力し、JavaScript側で
540         * 実際の画面遷移を発生させます。target属性は<div id="noTransitionTarget">[TARGET]</div>で
541         * 出力されます。
542         *
543         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
544         *
545         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
546         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
547         *
548         * @param   noTrnstn 画面遷移を行わない形式の登録方法を使用するか
549         */
550        public void setNoTransition( final String noTrnstn ) {
551//              noTransition = nval( getRequestParameter( noTrnstn ), noTransition );
552                setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) );
553        }
554
555        /**
556         * 【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します。
557         *
558         * @og.tag
559         * ajaxを利用したSubmit処理を行うかどうかを指定します。
560         * setNoTransitionをtrueにした場合と同様の処理を行います。
561         * (forwardせずにURLをDIVタグで出力する)
562         *
563         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
564         *
565         * @og.rev 4.3.8.0 (2009/08/01) 新規追加
566         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
567         *
568         * @param   ajaxSubmit ajaxを利用したsubmitを利用するかどうか
569         */
570        public void setUseAjaxSubmit( final String ajaxSubmit ) {
571//              useAjaxSubmit = nval( getRequestParameter( ajaxSubmit ), useAjaxSubmit );
572                setAjaxSubmitRequest( nval( getRequestParameter( ajaxSubmit ), isAjaxSubmitRequest() ) );
573        }
574
575        /**
576         * 【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)
577         *
578         * @og.tag
579         * 日本語ファイル名を持つ URL を useRedirect で転送する場合に、転送先(page)をバイナリ変換しないと、転送できないケースがあります。
580         * このあたりは、ブラウザにも依存するので、既存の処理に影響しない様に、このパラメータを使用する場合のみ
581         * 処理を実行します。
582         * IEでの日本語ファイル転送で、うまくいかない場合の、暫定処置です。
583         * IEの場合は、redirectEncode="UTF-8" で、日本語ファイルを転送できます。
584         * ただし、useRedirect=true時に filename 属性によるファイル名の書き換え処理はできませんので、ご注意ください。
585         * 初期値は、null で、バイナリエンコードしません。(互換性ありの状態です。)
586         *
587         * @og.rev 5.6.5.0 (2013/06/07) 新規追加
588         *
589         * @param   redEnc URL を 転送する場合に、日本語を含む転送先(page)をバイナリ変換するときのコード名
590         */
591        public void setRedirectEncode( final String redEnc ) {
592                redirectEncode = nval( getRequestParameter( redEnc ), redirectEncode );
593        }
594        
595        /**
596         * 【TAG】リンクアドレスにURLチェック用の確認キーを付加するかどうか[true/false]を指定します。
597         *
598         * @og.tag
599         * この属性は、URLCheckFilter(org.opengion.hayabusa.filter.URLCheckFilter)と合わせて使用します。
600         * trueが指定された場合、リンクURLのパラメーターに、URL確認用のパラメーターが出力されます。
601         * このパラメーターを、URLCheckFilterが復号化し、正式なアクセスであるかどうかの判定を行います。
602         *
603         * 初期値は、 システムリソースのLINK_URL_CHECK です。
604         *
605         * @og.rev 5.10.11.0 (2019/05/03) 新規追加
606         *
607         * @param       flag 暗号化するかかどうか [true:暗号化する/false:しない]
608         * @see org.opengion.hayabusa.filter.URLCheckFilter
609         */
610        public void setUseURLCheck( final String flag ) {
611                useURLCheck = nval( getRequestParameter( flag ),useURLCheck );
612        }
613        
614        /**
615         * 【TAG】valsの値が[で開始している場合でもURLEncodeを通すかを設定します(初期値:false)。
616         * 
617         * @og.tag
618         * テーブルモデルの値の変換のため、通常は先頭が[の場合はエンコードがかかりません。
619         * 強制的にかける場合にtrueにします。
620         * 
621         * @og.rev 5.10.15.3 (2019/09/27) forceEnc追加
622         * 
623         * @param flg
624         */
625        public void setForceEnc( final String flg ) {
626                useForceEnc = nval( getRequestParameter( flg ), useForceEnc );
627        }
628
629        /**
630         * シリアライズ用のカスタムシリアライズ書き込みメソッド
631         *
632         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
633         * @serialData 一部のオブジェクトは、シリアライズされません。
634         *
635         * @param       strm    ObjectOutputStreamオブジェクト
636         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
637         */
638        private void writeObject( final ObjectOutputStream strm ) throws IOException {
639                strm.defaultWriteObject();
640        }
641
642        /**
643         * シリアライズ用のカスタムシリアライズ読み込みメソッド
644         *
645         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
646         *
647         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
648         * @serialData 一部のオブジェクトは、シリアライズされません。
649         *
650         * @param       strm    ObjectInputStreamオブジェクト
651         * @see #release2()
652         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
653         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
654         */
655        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
656                strm.defaultReadObject();
657        }
658        
659        /**
660         * urlCheckのパラメータを付加します。 
661         * 
662         * @param url 元のアドレス
663         * @return urlCheckを付加したアドレス
664         */
665        private String addURLCheck( final String url ) {
666                HybsCryptography criptCls = null;
667                if( urlCheckCrypt != null && urlCheckCrypt.length() > 0 ){
668                        criptCls = new HybsCryptography( urlCheckCrypt );
669                }
670                return XHTMLTag.addURLCheckKey( url, HybsSystem.URL_CHECK_KEY, getUser().getUserID(), System.currentTimeMillis() + urlCheckTime, criptCls );
671        }
672        
673
674        /**
675         * このオブジェクトの文字列表現を返します。
676         * 基本的にデバッグ目的に使用します。
677         *
678         * @return このクラスの文字列表現
679         */
680        @Override
681        public String toString() {
682                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
683                                .println( "VERSION"             ,VERSION        )
684                                .println( "tableId"             ,tableId        )
685                                .println( "page"                ,page           )
686                                .println( "keys"                ,keys           )
687                                .println( "dbkeys"              ,dbkeys         )
688                                .println( "vals"                ,vals           )
689                                .println( "gamenId"             ,gamenId        )
690                                .println( "useRedirect" ,useRedirect)
691                                .println( "target"              ,target         )
692                                .println( "filename"    ,filename       )
693                                .println( "disposition"         ,disposition    )
694                                .println( "noTransition"        ,noTransition   )
695                                .println( "useAjaxSubmit"       ,useAjaxSubmit  )
696                                .println( "redirectEncode"      ,redirectEncode )
697                                .println( "useURLCheck" ,useURLCheck    )
698                                .println( "Other..."    ,getAttributes().getAttribute() )
699                                .fixForm().toString() ;
700        }
701}