    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import java.io.IOException;
    019
    020import javax.mail.internet.MimeUtility;
    021import javax.servlet.ServletException;
    022import javax.servlet.http.HttpServletRequest;
    023import javax.servlet.http.HttpServletResponse;
    024
    025import org.opengion.fukurou.system.LogWriter;
    026import org.opengion.fukurou.util.StringUtil;
    027import org.opengion.fukurou.util.XHTMLTag;
    028import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    029import org.opengion.hayabusa.common.HybsSystem;
    030import org.opengion.hayabusa.common.HybsSystemException;
    031import org.opengion.hayabusa.db.DBTableModel;
    032import org.opengion.hayabusa.resource.GUIInfo;
    033
    034import static org.opengion.fukurou.util.StringUtil.nval;
    035
    036/**
    037 * 制御を別の画面にフォワードする場合に使用するタグです(通常は、entry.jsp で使用します)。
    038 *
    039 * フォワード時に、指定の引数をセットできます。
    040 *
    041 * @og.formSample
    042 * ●形式：&lt;og:forward page="…" gamenId="[…]" /&gt;
    043 * ●body：なし
    044 *
    045 * ●Tag定義：
    046 *   &lt;og:forward
    047 *       gamenId            【TAG】gamenId 属性を登録します
    048 *       page             ○【TAG】転送先URLを指定します(必須)。
    049 *       keys               【TAG】キーを CSV形式でセットします
    050 *       vals               【TAG】キーに対応する値を CSV形式でセットします
    051 *       dbkeys             【TAG】DBキーをCSV形式でセットします
    052 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
    053 *       useRedirect        【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)
    054 *       target             【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します
    055 *       filename           【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)
    056 *       disposition        【TAG】ファイル転送時のヘッダー情報として、Content-Dispositionに設定する値を指定します(初期値:CONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。
    057 *       noTransition       【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します
    058 *       useAjaxSubmit      【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します
    059 *       redirectEncode     【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)
    060 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    061 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    062 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    063 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    064 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    065 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    066 *   /&gt;
    067 *
    068 * ※ 6.4.3.0 (2016/02/05) disposition 追加
    069 *    以前は、inline 固定でしたが、引数で指定できるようにします。
    070 *
    071 * ●使用例
    072 *       &lt;og:forward
    073 *          page          = "転送先URLを指定します(必須)。"
    074 *          dbkeys        = "DBキーをCSV形式でセットします。"
    075 *          keys          = "キーを CSV形式でセットします。"
    076 *          vals          = "キーに対応する値を CSV形式でセットします。"
    077 *          scope         = "キャッシュする場合のスコープ(request,page,session,application)を指定します(初期値:session)。"
    078 *          gamenId       = "gamenId 属性を登録します。"
    079 *          useRedirect   = "useRedirect 属性を登録します。"
    080 *          filename      = "ファイル転送時にファイル名を指定する場合に設定します。"
    081 *          target        = "taregt 属性を登録します。"
    082 *          noTransition  = "実際にforwardせずに、id="forwardUrl"属性のbody部分に遷移先のURLを出力します。(画面遷移なしモード時に使用します)"
    083 *       /&gt;
    084 *
    085 * @og.group 画面制御
    086 *
    087 * @version  4.0
    088 * @author       Kazuhiko Hasegawa
    089 * @since    JDK5.0,
    090 */
    091public class ForwardTag extends CommonTagSupport {
    092        /** このプログラムのVERSION文字列を設定します。   {@value} */
    093        private static final String VERSION = "6.9.8.0 (2018/05/28)" ;
    094        private static final long serialVersionUID = 698020180528L ;
    095
    096        private transient DBTableModel  table   ;
    097        private String          tableId         = HybsSystem.TBL_MDL_KEY;
    098        private String          page            ;
    099        private String          keys            ;
    100        private String          dbkeys          ;
    101        private String[]        vals            ;
    102        private String          gamenId         ;                                               // 3.5.4.9 (2004/02/25) 追加
    103        private boolean         useRedirect ;                                           // 3.5.6.6 (2004/08/23) 追加
    104        private String          target          ;                                               // 3.8.0.4 (2005/08/08) 追加
    105        private String          filename        ;                                               // 4.0.0   (2005/11/30) 追加
    106        private String          disposition     = HybsSystem.sys( "CONTENT_DISPOSITION" );              // 6.4.3.0 (2016/02/05) 追加
    107        private boolean         noTransition;                                           // 4.3.3.0 (2008/10/01) 追加
    108        private boolean         useAjaxSubmit   ;                                       // 4.3.8.0 (2009/08/01) 追加
    109        private String          redirectEncode  ;                                       // 5.6.5.0 (2013/06/07) 追加
    110
    111        /**
    112         * デフォルトコンストラクター
    113         *
    114         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    115         */
    116        public ForwardTag() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    117
    118        /**
    119         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    120         *
    121         * @og.rev 2.1.0.0 (2002/10/11) 戻り値の先頭の "?" を追加しないように変更。
    122         * @og.rev 3.0.1.3 (2003/03/11) 直接転送した場合の整合性を取る為の対応。
    123         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    124         * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定値を、定義ファイルを使用するように変更する。
    125         * @og.rev 3.5.4.9 (2004/02/25) gamenId を指定して、フォワードできるようにします。
    126         * @og.rev 3.5.6.6 (2004/08/23) useRedirect 属性を追加します。
    127         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
    128         * @og.rev 4.3.7.1 (2009/06/08) target属性に絶対パス及び"_"で始まる予約語を指定できるようにします。
    129         * @og.rev 4.3.8.0 (2009/08/01) useAjaxSubmit対応、noTransition値取得メソッド名変更
    130         * @og.rev 5.0.0.4 (2009/10/01) 画面遷移なし登録で戻った際に最終行が選択されるバグを修正
    131         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    132         * @og.rev 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
    133         * @og.rev 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
    134         * @og.rev 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
    135         * @og.rev 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
    136         * @og.rev 5.3.8.0 (2011/08/01) ファイル名指定でIEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。
    137         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
    138         * @og.rev 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
    139         * @og.rev 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。
    140         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
    141         * @og.rev 6.4.0.2 (2015/12/11) 飛び先の画面が見つからない(アクセス権がない)場合、転送先URL を null にする。
    142         * @og.rev 6.9.0.0 (2018/01/31) Windows10 の Edge で、ﾌｧｲﾙの文字化け対応(FileDownload servletと同じ対応を入れます)。
    143         * @og.rev 6.9.8.0 (2018/05/28) debug="true" 時は、画面遷移は行わない。
    144         *
    145         * @return      後続処理の指示
    146         */
    147        @Override
    148        public int doEndTag() {
    149                debugPrint();                                                                   // 4.0.0 (2005/02/28)
    150                if( !useTag() ) { return EVAL_PAGE ; }                  // 6.3.4.0 (2015/08/01)
    151
    152                // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加
    153                noTransition  = isNoTransitionRequest();                // 5.1.3.0 (2010/02/01)
    154                useAjaxSubmit = isAjaxSubmitRequest();                  // 5.1.3.0 (2010/02/01)
    155
    156                final String fwdUrl = makeGamenLink();                  // 3.5.4.9 (2004/02/25)
    157                if( fwdUrl == null ) { return EVAL_PAGE ; }             // 6.4.0.2 (2015/12/11)
    158
    159                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid declaring a variable if it is unreferenced before a possible exit point.
    160                final String urlEnc = getUrlEncode();
    161                final HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
    162                try {
    163                        String url = response.encodeRedirectURL( fwdUrl );      // 3.5.4.9 (2004/02/25)
    164                        // 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
    165                        // 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
    166                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    167                        if( filename == null ) {
    168                                if( !page.startsWith( "http" ) && page.endsWith( ".jsp" ) ) {
    169                                        if( keys == null || keys.isEmpty() || ( "," + keys + "," ).indexOf( ",GAMENID," ) < 0 ) {
    170                                                if( gamenId != null && gamenId.length() > 0 ) {
    171                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + gamenId );
    172                                                }
    173                                                // useRedirect=trueでGAMENIDを指定せず、../GF9100/index.jsp等と書かれている場合の対応
    174                                                else if( !useRedirect ) {
    175                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + getGUIInfoAttri( "KEY" ) );
    176                                                }
    177                                        }
    178                                }
    179                        }
    180                        else {
    181                                // 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
    182                                // 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
    183                                // 条件を反転させた上でIE11対応を行う
    184                                final String reqHeader = ((HttpServletRequest)pageContext.getRequest()).getHeader( "User-Agent" );
    185//                              if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 ) {
    186                                if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 || reqHeader.indexOf( "Edge" ) >= 0 ) {             // 6.9.0.0 (2018/01/31)
    187                                        filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" );
    188                                }
    189                                else {
    190                                        filename = MimeUtility.encodeWord( filename, "UTF-8", "B" );
    191                                }
    192
    193                                response.setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );            // 6.4.3.0 (2016/02/05)
    194                        }
    195
    196                        // 3.5.6.6 (2004/08/23) useRedirect 属性を追加
    197                        String url2 = XHTMLTag.addUrlEncode( url , urlEnc );
    198                        // 4.3.3.0 (2008/10/01) 追加
    199                        // if( noTransition ) {
    200                        if( noTransition || useAjaxSubmit ) { // 4.3.8.0 (2009/08/01) useAjaxSubmitと共用
    201                                // 5.0.0.4 (2009/10/01)
    202                                if( noTransition ) {
    203                                        final int selRow = nval( getRequestValue( "SEL_ROW" ),-1 );
    204                                        if( selRow > 0 ) {
    205                                                url2 = XHTMLTag.addUrlEncode( url2, "SEL_ROW=" + selRow );
    206                                        }
    207                                }
    208                                // 6.9.8.0 (2018/05/28) debug="true" 時は、画面遷移は行わない。
    209                                final String script = "<div id=\"noTransitionUrl\">" + url2 + "</div>" +
    210                                                                                "<div id=\"noTransitionTarget\">" + target + "</div>" ;
    211
    212//                              jspPrint( "<div id=\"noTransitionUrl\">" + url2 + "</div>" );
    213//                              jspPrint( "<div id=\"noTransitionTarget\">" + target + "</div>" );
    214                                if( isDebug() ) {
    215                                        final String debugMsg = "<pre>debug=\"true\" 時には、画面遷移を行いません。" + CR
    216                                                                                        + " noTransition=" + noTransition + " , useAjaxSubmit=" + useAjaxSubmit + CR
    217                                                                                        + " URL=" + url2 + CR
    218                                                                                        + "</pre>" + CR;
    219                                        jspPrint( debugMsg );
    220                                }
    221                                else {
    222                                        jspPrint( script );
    223                                }
    224                        }
    225                        // 3.8.0.4 (2005/08/08) target 属性を追加します。
    226                        else if( target != null && target.length() > 0 ) {
    227                                // 4.3.7.1 (2009/06/08)
    228                                String src = null;
    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 + "\"" + CR;
    236                                }
    237                                final String script = "<script type=\"text/javascript\" ><!-- " + CR
    238                                                                + src + CR
    239                                                                + "// --></script>" ;
    240                                // 6.9.8.0 (2018/05/28) debug="true" 時は、画面遷移は行わない。
    241                                if( isDebug() ) {
    242                                        final String debugMsg = "<pre>debug=\"true\" 時には、画面遷移を行いません。" + CR
    243                                                                                        + " target=" + target + CR
    244                                                                                        + " src=" + src + CR
    245                                                                                        + "</pre>" + CR;
    246                                        jspPrint( debugMsg );
    247                                }
    248                                else {
    249                                        jspPrint( script );
    250                                }
    251                        }
    252                        else if( useRedirect ) {
    253                                // 5.6.5.0 (2013/06/07) redirectEncode 属性追加
    254                                if( redirectEncode != null ) {
    255                                        url2 = new String( url2.getBytes( redirectEncode ), "ISO-8859-1" );
    256                                }
    257
    258                                // 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。
    259                                if( isDebug() ) {
    260                                        final String debugMsg = "<pre>debug=\"true\" 時には、forward も sendRedirect も行いません。"
    261                                                                                        + CR
    262                                                                                        + "Redirect URL=" + url2 + CR
    263                                                                                        + "</pre>" + CR;
    264                                        jspPrint( debugMsg );
    265                                }
    266                                else {
    267                                        response.sendRedirect( url2 );
    268                                }
    269                        }
    270                        else {
    271                                // 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。
    272                                if( isDebug() ) {
    273                                        final String debugMsg = "<pre>debug=\"true\" 時には、forward も sendRedirect も行いません。"
    274                                                                                        + CR
    275                                                                                        + "Forward URL=" + url2  + CR
    276                                                                                        + "</pre>" + CR;
    277                                        jspPrint( debugMsg );
    278                                }
    279                                else {
    280                                        pageContext.forward( url2 );
    281                                }
    282                        }
    283                } catch( final IOException ex ) {
    284                        final String errMsg = "フォワード/リダイレクトでIOエラーが発生しました。"
    285                                                                + CR
    286                                                                + fwdUrl + "?" + urlEnc ;
    287                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    288                } catch( final ServletException ex) {
    289                        final String errMsg = "フォワード/リダイレクトでServletエラーが発生しました。"
    290                                                                + CR
    291                                                                + fwdUrl + "?" + urlEnc ;
    292                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    293                }
    294
    295                // 3.0.1.3 (2003/03/11) forward で直接転送した場合の整合性を取る為の対応。
    296                // 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
    297                // 6.9.8.0 (2018/05/28) FindBugs:null でないことがわかっている値の冗長な null チェック
    298//              if( fwdUrl != null && fwdUrl.endsWith( ".jsp" ) ) {
    299                if( fwdUrl.endsWith( ".jsp" ) ) {                                                               // fwdUrl は、nullチェック済み
    300                        setSessionAttribute( HybsSystem.FORWARD_PAGE_KEY, fwdUrl );     // 3.5.4.9 (2004/02/25)
    301                }
    302
    303                return SKIP_PAGE ;              // ページの残りの処理を行わない。
    304        }
    305
    306        /**
    307         * タグリブオブジェクトをリリースします。
    308         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    309         *
    310         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    311         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    312         * @og.rev 3.5.4.9 (2004/02/25) 画面ID属性(gamenId)を追加
    313         * @og.rev 3.8.5.0 (2006/03/06) filename 属性を追加します。
    314         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
    315         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
    316         * @og.rev 6.4.3.0 (2016/02/05) disposition属性、新規追加。
    317         *
    318         */
    319        @Override
    320        protected void release2() {
    321                super.release2();
    322                tableId                 = HybsSystem.TBL_MDL_KEY;
    323                page                    = null;
    324                keys                    = null;
    325                dbkeys                  = null;
    326                vals                    = null;
    327                table                   = null;
    328                gamenId                 = null;
    329                useRedirect             = false;                                // 3.5.6.6 (2004/08/23) 追加
    330                target                  = null;                                 // 3.8.0.4 (2005/08/08) 追加
    331                filename                = null;
    332                disposition             = HybsSystem.sys( "CONTENT_DISPOSITION" );              // 6.4.3.0 (2016/02/05) 追加
    333                noTransition    = false;                                // 4.3.3.0 (2008/10/01) 追加
    334                useAjaxSubmit   = false;                                // 4.3.8.0 (2009/08/01) 追加
    335                redirectEncode  = null;                                 // 5.6.5.0 (2013/06/07) 追加
    336        }
    337
    338        /**
    339         * keys 属性 を元に、request情報より values の値を取り込む。
    340         *
    341         * keys属性は キー情報がCSV形式になっている為,ばらして
    342         * values属性の配列に一つづつ設定していきます。
    343         *
    344         * @og.rev 3.1.7.0 (2003/05/02) 戻るボタン用のBACK_GAMENID を、引数に追加します。
    345         * @og.rev 3.1.8.0 (2003/05/16) 戻るボタン用のBACK_GAMENID の自動登録を廃止します。
    346         * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
    347         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    348         *
    349         * @return      URLエンコードされた文字列
    350         */
    351        private String getUrlEncode() {
    352                final String[] dbkey = StringUtil.csv2Array( dbkeys );
    353                final String[] key   = StringUtil.csv2Array( keys );
    354
    355                final int dbCount = dbkey.length;
    356                final int count   = key.length  ;
    357
    358                String[] allKey = new String[ dbCount + count ];
    359                String[] allval = new String[ dbCount + count ];
    360
    361                final int[] rowNo = getParameterRows();         // 4.0.0 (2005/01/31)
    362                if( dbCount > 0 && dbkey[0] != null && dbkey[0].length() > 0 && rowNo.length > 0 ) {
    363                        table = (DBTableModel)getObject( tableId );
    364                        if( table != null ) {
    365                                for( int i=0; i<dbCount; i++ ) {
    366                                        allKey[i] = dbkey[i];
    367                                        allval[i] = table.getValue(rowNo[0],table.getColumnNo( dbkey[i] ));
    368                                }
    369                        }
    370                }
    371
    372                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    373                if( count > 0 && vals != null && vals.length == count ) {
    374                        for( int i=0; i<count; i++ ) {
    375                                allKey[i+dbCount] = key[i];
    376                                allval[i+dbCount] = vals[i];
    377                        }
    378                }
    379
    380                return XHTMLTag.urlEncode( allKey,allval );
    381        }
    382
    383        /**
    384         * 【TAG】転送先URLを指定します。
    385         *
    386         * @og.tag 転送先URLを指定します。
    387         *
    388         * @param       url 転送先URL
    389         */
    390        public void setPage( final String url ) {
    391                page = getRequestParameter( url );
    392        }
    393
    394        /**
    395         * 【TAG】DBキーをCSV形式でセットします。
    396         *
    397         * @og.tag
    398         * URI の引数にセットするキーを CSV形式でセットします。
    399         * ここの指定は,DBTableModel 上のデータを取り込みます。
    400         *
    401         * @param       key DBキー(CSV形式)
    402         */
    403        public void setDbkeys( final String key ) {
    404                dbkeys = getRequestParameter( key ) ;
    405        }
    406
    407        /**
    408         * 【TAG】キーを CSV形式でセットします。
    409         *
    410         * @og.tag
    411         * URI の引数にセットするキーを CSV形式でセットします。
    412         *
    413         * @param       key キー(CSV形式)
    414         */
    415        public void setKeys( final String key ) {
    416                keys = getRequestParameter( key ) ;
    417        }
    418
    419        /**
    420         * 【TAG】キーに対応する値を CSV形式でセットします。
    421         *
    422         * @og.tag
    423         * URI の引数にセットする値を CSV形式でセットします。
    424         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    425         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    426         *
    427         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    428         *
    429         * @param       val 値(CSV形式)
    430         */
    431        public void setVals( final String val ) {
    432                vals = getCSVParameter( val );
    433
    434                // 先に分解しないとデータ自身にカンマを持っている場合に分解をミスる。
    435        }
    436
    437        /**
    438         * 画面ＩＤとpage から、フォワードするＵＲＬを作成します。
    439         * page が null の場合は、index.jsp に転送されます。
    440         *
    441         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
    442         * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。
    443         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
    444         * @og.rev 6.4.0.2 (2015/12/11) 飛び先の画面が見つからない(アクセス権がない)場合、転送先URL を null にする。
    445         *
    446         * @return      フォワードするＵＲＬ(転送先URL)
    447         */
    448        private String makeGamenLink() {
    449                if( page == null ) { page = "index.jsp"; }
    450
    451                if( gamenId == null || gamenId.isEmpty() ) { return page; }
    452
    453                final GUIInfo guiInfo = getGUIInfo( gamenId );
    454                if( guiInfo == null ) {                                 // 見つからない場合は、転送しない
    455                        LogWriter.log( "Forward[" + gamenId + "]先にはアクセス不可です。" );
    456                        return null;                                            // 6.4.0.2 (2015/12/11)
    457                }
    458
    459                final String address = guiInfo.getRealAddress( page );
    460                final String link    = getRequestParameter( address );
    461
    462                // Ver 4.0.0 (2007/06/12) gamenId を使用する場合は、useRedirect = true をセット
    463                useRedirect = true;
    464                return link;
    465        }
    466
    467        /**
    468         * 【TAG】画面ID を指定します。
    469         *
    470         * @og.tag
    471         * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。
    472         * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、
    473         * page 属性をそのままリダイレクトアドレスとします。
    474         * gamenId を指定した場合は、このuseRedirect属性に関係なく、Redirect されます。
    475         *
    476         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
    477         *
    478         * @param   id 画面ID
    479         * @see         #setUseRedirect( String )
    480         */
    481        public void setGamenId( final String id ) {
    482                gamenId = nval( getRequestParameter( id ),gamenId );
    483        }
    484
    485        /**
    486         * 【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)。
    487         *
    488         * @og.tag
    489         * useRedirect 属性は、URLの転送方式を指定できます。
    490         * 通常は、pageContext.forward しますが、この属性に true を
    491         * 設定すると、response.sendRedirect します。
    492         * gamenId を指定した場合は、この属性に関係なく、Redirect されます。
    493         * 初期値は、false (forward) です。
    494         *
    495         * @og.rev 3.5.6.6 (2004/08/23) 新規追加
    496         *
    497         * @param   flag リダイレクト転送か [true:redirect/false:forwrd]
    498         * @see         #setGamenId( String )
    499         */
    500        public void setUseRedirect( final String flag ) {
    501                useRedirect = nval( getRequestParameter( flag ),useRedirect );
    502        }
    503
    504        /**
    505         * 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します。
    506         *
    507         * @og.tag サブミット先のフレーム名(ターゲット属性)を設定します。
    508         *
    509         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
    510         *
    511         * @param       name フレーム名(ターゲット属性)
    512         */
    513        public void setTarget( final String name ) {
    514                target = nval( getRequestParameter( name ),target );
    515        }
    516
    517        /**
    518         * 【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)。
    519         *
    520         * @og.tag
    521         * ファイルを転送する場合に、オープンさせるファイル名を指定します。
    522         * 指定しない場合は、フォラード前に呼び出されたアドレスがそのまま使用されます。
    523         *
    524         * ※ useRedirect="true"時(つまり、リダイレクトする場合)は、ファイル名の指定が
    525         * できません。(少なくとも私の知識では出来ませんでした。)
    526         *
    527         * @param   name ファイル名
    528         */
    529        public void setFilename( final String name ) {
    530                filename = nval( getRequestParameter( name ),filename );
    531        }
    532
    533        /**
    534         * 【TAG】ファイルダウンロードさせる場合に、Content-Disposition に設定する値
    535         *              (初期値:CONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。
    536         *
    537         * @og.tag
    538         * inline(そのまま開く) を指定すると、PDF などは直接ダウンロードが始まります。
    539         * attachment(ダウンロードダイアログを表示する) を指定すると、保存のダイアログを表示しますが
    540         * EXCEL などの場合、inline にしても、ダイアログが表示され、開くをクリックしても
    541         * ダウンロードが始まらなかったり、EXCELが開いたあと、ブラウザの操作が出来なくなったり、
    542         * よくわからないため、選択できるようにします。
    543         * (初期値:システム定数のCONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。
    544         *
    545         * @og.rev 6.4.3.0 (2016/02/05) disposition属性、新規追加。
    546         *
    547         * @param   dispos Content-Dispositionに設定する値(inline/attachment)
    548         */
    549        public void setDisposition( final String dispos ) {
    550                final String temp = nval( getRequestParameter( dispos ),disposition );
    551
    552                if( "inline".equals( temp ) || "attachment".equals( temp ) ) {
    553                        disposition = temp;
    554                }
    555                else {
    556                        final String errMsg = "disposition 属性は、[inline/attachment] から、指定してください。"
    557                                                                + " disposition=[" + dispos + "]" + CR ;
    558                        throw new HybsSystemException( errMsg );
    559                }
    560        }
    561
    562        /**
    563         * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。
    564         *
    565         * @og.tag
    566         * 画面遷移なしの登録を行うかどうかを指定します。
    567         * trueが指定された場合、forwardタグでは、実際の画面遷移は行わずに、forward先の
    568         * URLを<div id="noTransitionUrl">[URL]</div>の形でHTMLとして出力し、JavaScript側で
    569         * 実際の画面遷移を発生させます。target属性は<div id="noTransitionTarget">[TARGET]</div>で
    570         * 出力されます。
    571         *
    572         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
    573         *
    574         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
    575         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    576         *
    577         * @param   noTrnstn 画面遷移を行わない登録か [true:画面遷移を伴わない/false:伴う]
    578         */
    579        public void setNoTransition( final String noTrnstn ) {
    580                setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) );
    581        }
    582
    583        /**
    584         * 【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうか[true:利用する/false:利用しない]を指定します。
    585         *
    586         * @og.tag
    587         * ajaxを利用したSubmit処理を行うかどうかを指定します。
    588         * setNoTransitionをtrueにした場合と同様の処理を行います。
    589         * (forwardせずにURLをDIVタグで出力する)
    590         *
    591         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
    592         *
    593         * @og.rev 4.3.8.0 (2009/08/01) 新規追加
    594         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    595         *
    596         * @param   ajaxSubmit ajaxを利用したsubmitを利用するか [true:利用する/false:利用しない]
    597         */
    598        public void setUseAjaxSubmit( final String ajaxSubmit ) {
    599                setAjaxSubmitRequest( nval( getRequestParameter( ajaxSubmit ), isAjaxSubmitRequest() ) );
    600        }
    601
    602        /**
    603         * 【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)。
    604         *
    605         * @og.tag
    606         * 日本語ファイル名を持つ URL を useRedirect で転送する場合に、転送先(page)をバイナリ変換しないと、転送できないケースがあります。
    607         * このあたりは、ブラウザにも依存するので、既存の処理に影響しない様に、このパラメータを使用する場合のみ
    608         * 処理を実行します。
    609         * IEでの日本語ファイル転送で、うまくいかない場合の、暫定処置です。
    610         * IEの場合は、redirectEncode="UTF-8" で、日本語ファイルを転送できます。
    611         * ただし、useRedirect=true時に filename 属性によるファイル名の書き換え処理はできませんので、ご注意ください。
    612         * 初期値は、null で、バイナリエンコードしません。（互換性ありの状態です。）
    613         *
    614         * @og.rev 5.6.5.0 (2013/06/07) 新規追加
    615         *
    616         * @param   redEnc 転送先(page)の変換文字コード名 (UTF-8/Windows-31Jなど)
    617         */
    618        public void setRedirectEncode( final String redEnc ) {
    619                redirectEncode = nval( getRequestParameter( redEnc ), redirectEncode );
    620        }
    621
    622        /**
    623         * このオブジェクトの文字列表現を返します。
    624         * 基本的にデバッグ目的に使用します。
    625         *
    626         * @return このクラスの文字列表現
    627         * @og.rtnNotNull
    628         */
    629        @Override
    630        public String toString() {
    631                return ToString.title( this.getClass().getName() )
    632                                .println( "VERSION"                     ,VERSION                )
    633                                .println( "tableId"                     ,tableId                )
    634                                .println( "page"                        ,page                   )
    635                                .println( "keys"                        ,keys                   )
    636                                .println( "dbkeys"                      ,dbkeys                 )
    637                                .println( "vals"                        ,vals                   )
    638                                .println( "gamenId"                     ,gamenId                )
    639                                .println( "useRedirect"         ,useRedirect    )
    640                                .println( "target"                      ,target                 )
    641                                .println( "filename"            ,filename               )
    642                                .println( "disposition"         ,disposition    )
    643                                .println( "noTransition"        ,noTransition   )
    644                                .println( "useAjaxSubmit"       ,useAjaxSubmit  )
    645                                .println( "redirectEncode"      ,redirectEncode )
    646                                .println( "Other..."            ,getAttributes().getAttribute() )
    647                                .fixForm().toString() ;
    648        }
    649}