    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 org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.resource.GUIInfo;
    020import org.opengion.hayabusa.resource.RoleMode ;
    021import org.opengion.hayabusa.db.DBLastSql;
    022import org.opengion.fukurou.system.OgBuilder ;                          // 6.4.4.1 (2016/03/18)
    023import org.opengion.fukurou.util.Attributes;
    024import org.opengion.fukurou.util.XHTMLTag;
    025import org.opengion.fukurou.util.StringUtil ;
    026import org.opengion.fukurou.util.ToString;                                      // 6.1.1.0 (2015/01/17)
    027
    028import static org.opengion.fukurou.util.StringUtil.nval ;
    029
    030/**
    031 * ファイルアップロード/ダウンロードリンクを作成するタグです(通常は result_info.jsp に組込み)。
    032 *
    033 * 画面検索した結果を、ダウンロードしたり、アップロードする機能は、画面リソースの
    034 * ロール制御で管理しています。
    035 * ただし、デフォルトで、以下の制限が掛かっています。
    036 *
    037 * ファイルダウンロード
    038 *   ・command="NEW|RENEW|FIRST|LAST|PREV|NEXT|VIEW|RESET" のみ
    039 * ファイルアップロード
    040 *   ・command="COPY|INSERT" のみ
    041 *
    042 * 5.7.8.1 (2014/07/18)
    043 *  addDownCmnd と、addUpldCmnd を指定すれば、ダウンロード、アップロードできる
    044 *  command を増やすことが可能です。
    045 *
    046 * また、typeDownload="true" にするとDownload 処理を行う為の前処理を実施します。
    047 * Download 処理を行うには、指定の画面(呼び出し元)と、抜き出した時の
    048 * DBTableModel がマッチしているか判定します。
    049 * また、DBTableModel が存在しない、または、不備な場合(オーバーフロー)は、
    050 * 最終SQLを実行する必要があり、そもそも、抜出処理が出来ない状態では、
    051 * エラーを返す必要があります。
    052 * それら、一連のDownload 処理を行うかどうかを指定します。
    053 * true の場合、session の HybsSystem.DB_LAST_SQL_KEY に格納された
    054 * DBLastSql オブジェクトを取得し、scope が request または、overflow が
    055 * true の場合に、BODY部を実行します。(通常、queryタグを記述します。)
    056 * query の出力先は、scope を request にします。
    057 * それ以外は、tableId から取り出した DBTableModel を、scope = "request"
    058 * に(アドレスのみ)コピーします。
    059 * writeTable タグでは、scope = "request" から、DBTableModel を取り出します。
    060
    061 * @og.formSample
    062 * ●形式：一般ユーザーが直接組み込むことはありません。
    063 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    064 *
    065 * ●Tag定義：
    066 *   &lt;og:fileUD
    067 *       command            【TAG】command を指定します
    068 *       downloadImg        【TAG】ダウンロード時のアイコンを指定します(初期値:"{&#064;SYS.JSP}/image/fileDownload.gif")
    069 *       downloadJsp        【TAG】ダウンロード時の呼び出しJSPを指定します(初期値:"{&#064;SYS.JSP}/common/fileDownload.jsp")
    070 *       uploadImg          【TAG】アップロード時のアイコンを指定します(初期値:"{&#064;SYS.JSP}/image/fileUpload.gif")
    071 *       uploadJsp          【TAG】アップロード時の呼び出しJSPを指定します(初期値:"{&#064;SYS.JSP}/common/fileUpload.jsp")
    072 *       imgWidth           【TAG】アイコン幅サイズ(px)を指定します(初期値:20px)
    073 *       imgHeight          【TAG】アイコン高さサイズ(px)を指定します(初期値:20px)
    074 *       filename           【TAG】ダウンロード時ファイル名を指定します(初期値:"{&#064;GUI.LABEL}")  6.8.1.4 (2017/08/25) 拡張子はつけません。
    075 *       addDownCmnd        【TAG】ダウンロード時のコマンドを追加指定できます(初期値:null)
    076 *       addUpldCmnd        【TAG】アップロード時のコマンドを追加指定できます(初期値:null)
    077 *       roles              【TAG】ロールズをセットします
    078 *       target             【TAG】ダウンロード文書を表示させるフレーム、またはウィンドウの名前を指定します
    079 *       errorMsg           【TAG】ダウンロード出来ない場合のエラーメッセージIDを指定します(初期値:ERR0028)
    080 *       typeDownload       【TAG】Download 処理を行うかどうかを指定します(初期値:false)
    081 *       useEditLink        【TAG】編集リンク自体を出すかどうかどうか(初期値:true)
    082 *       editImg            【TAG】編集アイコンを指定します(初期値:"{&#064;SYS.JSP}/icon/edit.png")
    083 *       clmEdit            【TAG】編集時にカラム編集タブを表示するかどうか(初期値:true)
    084 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    085 *   &gt;   ... Body ...
    086 *   &lt;/og:fileUD&gt;
    087 *
    088 * ●使用例
    089 *     &lt;og:fileUD command="{&#064;command}" /&gt;
    090 *
    091 *     &lt;og:fileUD
    092 *         command        = command設定 (ダウンロード="NEW|RENEW|FIRST|LAST|PREV|NEXT|VIEW" 、   アップロード="COPY|INSERT")
    093 *       [ downloadImg ]  = "{&#064;SYS.JSP}/image/fileDownload.gif"   ダウンロード時のアイコン
    094 *       [ downloadJsp ]  = "{&#064;SYS.JSP}/common/fileDownload.jsp"  ダウンロード時の呼び出しJSP
    095 *       [ uploadImg   ]  = "{&#064;SYS.JSP}/image/fileUpload.gif"     アップロード時のアイコン
    096 *       [ uploadJsp   ]  = "{&#064;SYS.JSP}/common/filePopup.jsp"     アップロード時の呼び出しJSP
    097 *       [ imgWidth    ]  = "20px"                                アイコン幅サイズ(px)
    098 *       [ imgHeight   ]  = "20px"                                アイコン高さサイズ(px)
    099 *       [ filename    ]  = "{&#064;GUI.LABEL}.xls"               ダウンロード時ファイル名
    100 *       [ roles       ]  = "GE|DOC"                              アクセスロールズ
    101 *       [ target      ]  = "_blank"                              ダウンロードファイルを開くターゲット
    102 *       [ errorMsg    ]  = "ERR0042"                             エラーメッセージID
    103 *       [ typeDownload]  = "false/true"                          Download 処理を行うかどうか(初期値:false)
    104 *     /&gt;
    105 *
    106 * @og.group ファイルアップロード/ダウンロード
    107 *
    108 * @og.rev 4.3.0.0 (2008/07/04) 新規追加
    109 * @og.rev 5.7.4.1 (2014/03/15) エラーメッセージ変更
    110 * @og.rev 5.9.32.1 (2018/05/08) URLチェック対応
    111 * @og.rev 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します。
    112 *
    113 * @version  4.0
    114 * @author       Kazuhiko Hasegawa
    115 * @since    JDK5.0,
    116 */
    117public class FileUDTag extends CommonTagSupport {
    118        /** このプログラムのVERSION文字列を設定します。   {@value} */
    119        private static final String VERSION = "7.3.2.3 (2021/04/09)" ;
    120        private static final long serialVersionUID = 732320210409L ;
    121
    122        // 7.3.2.3 (2021/04/09) sysJspを、static化します。
    123//      private String  sysJsp                  = HybsSystem.sys( "JSP" );
    124        // 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します。
    125        private static final String JSP      = HybsSystem.sys( "JSP" ) ;
    126        private static final String JSP_ICON = HybsSystem.sys( "JSP_ICON" );
    127
    128        private String  command                 ;                       // ダウンロード="NEW|RENEW" 、アップロード="COPY|INSERT"
    129        // 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します。
    130//      private String  downloadImg             = sysJsp + "/image/fileDownload.gif";   // ダウンロード時のアイコン
    131//      private String  downloadJsp             = sysJsp + "/common/fileDownload.jsp";  // ダウンロード時の呼び出しJSP
    132//      private String  uploadImg               = sysJsp + "/image/fileUpload.gif";             // アップロード時のアイコン
    133//      private String  uploadJsp               = sysJsp + "/common/filePopup.jsp";             // アップロード時の呼び出しJSP
    134        private String  downloadImg             = JSP_ICON + "/fileDownload.gif";               // ダウンロード時のアイコン
    135        private String  downloadJsp             = JSP + "/common/fileDownload.jsp";             // ダウンロード時の呼び出しJSP
    136        private String  uploadImg               = JSP_ICON + "/fileUpload.gif";         // アップロード時のアイコン
    137        private String  uploadJsp               = JSP + "/common/filePopup.jsp";                // アップロード時の呼び出しJSP
    138        private String  imgWidth                = "20px";                                       // アイコン幅サイズ(px)
    139        private String  imgHeight               = "20px";                                       // アイコン高さサイズ(px)
    140        private String  filename                ;                                                       // ダウンロード時ファイル名("{@GUI.LABEL}")  6.8.1.4 (2017/08/25) 拡張子はつけません。
    141        private String  roles                   ;                                                       // アクセスロールズ
    142        private String  target                  ;                                                       // ダウンロードファイルを開くターゲット
    143        private String  errorMsg                = "ERR0042";                            // 出力対象データが見つかりませんでした。再度検索して下さい。 5.7.4.1 (2014/03/15)
    144        private boolean isError                 ;
    145        private boolean typeDownload    ;                                                       // Download 処理を行うかどうか(初期値:false)
    146        private boolean isEdit                  = true;                                         // 5.6.0.2 (2013/01/19) ロールのisEditとほぼ同等。clmEdit用。
    147        private boolean useEditLink             = true;                                         // 5.7.5.0 (2014/04/04) 編集リンク自体を出すかどうかどうか(初期値:true)
    148
    149        private String  addDownCmnd             ;                                                       // 5.7.8.1 (2014/07/18) ダウンロード時のコマンドを追加
    150        private String  addUpldCmnd             ;                                                       // 5.7.8.1 (2014/07/18) アップロード時のコマンドを追加
    151
    152        private static final String     EDIT_GAMENID= "14_EDIT";                                        // 編集画面の画面ID
    153        // 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します。
    154//      private String  editImg                 = sysJsp + "/image/edit.png";   // 編集時のアイコン
    155        private String  editImg                 = JSP_ICON + "/edit.png";               // 編集時のアイコン
    156
    157        // 5.9.32.1 (2018/05/08) URLチェック対応
    158        private boolean useURLCheck             =  HybsSystem.sysBool( "USE_FILEUD_URL_CHECK" );        // Ver5 では、FILEUD_URL_CHECK
    159        private static final long       URL_CHECK_TIME  = 1000*60*60*24;                                                // 初期値：２４時間(とりあえず固定値)
    160        // private String       urlCheckCrypt   = HybsSystem.sys( "URL_CHECK_CRYPT" );                  // 将来使用するかも
    161
    162        /**
    163         * デフォルトコンストラクター
    164         *
    165         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    166         */
    167        public FileUDTag() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    168
    169        /**
    170         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    171         *
    172         * @og.rev 5.1.6.0 (2010/05/01) 画面項目並べ替え対応
    173         * @og.rev 6.2.0.1 (2015/03/06) 画面IDのキーを"GAMENID" に統一します。
    174         *
    175         * @return      後続処理の指示(SKIP_BODY)
    176         */
    177        @Override
    178        public int doStartTag() {
    179
    180                if( typeDownload ) {
    181                        final DBLastSql lastSql = (DBLastSql)getSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );
    182                        if( lastSql != null ) {
    183                                final String guikey = getRequest().getParameter( "GAMENID" );           // 6.2.0.1 (2015/03/06) 画面IDのキーを"GAMENID" に統一します。
    184                                if( lastSql.isGuiMatch( guikey ) ) {
    185                                        // view タグで仕込んだ clmNames を、Request 変数に設定します。
    186                                        setRequestAttribute( "DB.CLM_NAMES"                     , lastSql.getClmNames() );
    187                                        // 5.1.6.0 (2010/05/01) 画面項目並べ替え対応
    188                                        setRequestAttribute( "DB.VIEW_CLM_NAMES"        , lastSql.getViewClmNames() );
    189                                        setRequestAttribute( "DB.VIEW_EDITABLE"         , Boolean.toString( lastSql.isViewEditable() ) );
    190
    191                                        // 6.3.9.0 (2015/11/06) Deeply nested if..then statements are hard to read (PMD)
    192                                        if( lastSql.isRequest() && getUserInfo( "LASTSQL" ) != null ) {
    193                                                return EVAL_BODY_BUFFERED ;             // Body を評価する。( extends BodyTagSupport 時)
    194                                        }
    195
    196                                        final String tableId = lastSql.getTableId();
    197                                        // セッションのDBTableModelを、そのまま、リクエストに入れているだけなので、実態は同じ。
    198                                        setRequestAttribute( HybsSystem.TBL_MDL_KEY, getSessionAttribute( tableId ) );
    199                                        return SKIP_BODY ;                                      // Body を評価しない
    200                                }
    201                        }
    202
    203                        // 処理が実行できない場合、エラーを出力します。
    204                        jspPrint( getResource().getLabel( errorMsg ) );
    205                        isError = true;
    206                }
    207
    208                return SKIP_BODY ;                              // Body を評価しない
    209        }
    210
    211        /**
    212         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    213         *
    214         * @og.rev 4.3.0.1 (2008/08/11) callBack パラメータの設定漏れ修正、引数から見直し
    215         * @og.rev 5.1.6.0 (2010/05/01) 帳票画面定義機能対応
    216         * @og.rev 5.1.7.0 (2010/06/01) 進む・戻るボタンでもExcel出力ボタンを出す
    217         * @og.rev 5.3.6.0 (2011/06/01) Edit機能見直し
    218         * @og.rev 5.3.7.0 (2011/07/01) Excel取込で画面IDとアドレスが異なる場合にエラーとなるバグを修正
    219         * @og.rev 5.3.7.0 (2011/07/01) 編集画面をリサイズできるように対応します。
    220         * @og.rev 5.3.7.0 (2011/07/01) PL/SQLを利用した検索でファイルダウンロードが出来るように対応します。
    221         * @og.rev 5.4.2.0 (2011/12/01) 画面リソースで画面編集機能のON/OFFを設定できるようにする。
    222         * @og.rev 5.5.2.4 (2012/05/16) nullに対する冗長な比較
    223         * @og.rev 5.5.5.2 (2012/08/20) 画面リソースのoモード対応
    224         * @og.rev 5.5.6.2 (2012/09/24) makeTagのtarget対応
    225         * @og.rev 5.6.0.2 (2013/01/19) editモードのisEditコントロール対応
    226         * @og.rev 5.7.5.0 (2014/04/04) 編集リンク自体を出すかどうかどうか(初期値:true)
    227         * @og.rev 5.7.8.1 (2014/07/18) command="RESET" 時に、ダウンロードリンクを表示
    228         * @og.rev 5.7.8.1 (2014/07/18) addDownCmnd , addUpldCmndを追加
    229         * @og.rev 6.2.0.1 (2015/03/06) 画面IDのキーを"GAMENID" に統一します。
    230         * @og.rev 6.2.2.0 (2015/03/27) ファイルの拡張子を、".xls" から、システムリソースの TABLE_WRITER_EXCEL_TYPE に変更
    231         * @og.rev 6.3.1.0 (2015/06/28) 4:個人設定可のリソースの取得方法に修正(バグFix)。TABLE_WRITER_EXCEL_TYPE
    232         * @og.rev 6.3.4.0 (2015/08/01) 14_EDIT の指定で、フォルダではなく、index.jspまで指定します。
    233         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    234         * @og.rev 6.8.1.3 (2017/08/04) 日本語のeditNameが、ネイティブモードでHTTP400 エラーになる。･･･ 5.10.0.2 (2018/06/22)
    235         * @og.rev 6.8.1.4 (2017/08/25) filename に、拡張子はつけません。
    236         * @og.rev 5.9.32.1 (2018/05/11) makeTagに、URLチェック対応のための引数を追加
    237         *
    238         * @return      後続処理の指示
    239         */
    240        @Override
    241        public int doEndTag() {
    242                debugPrint();
    243
    244                if( isError      ) { return SKIP_PAGE ; }               // ページの残りの処理を行わない。
    245                if( typeDownload ) { return EVAL_PAGE ; }               // ページの残りを評価する。
    246
    247                boolean isDownload ;
    248                // 5.7.8.1 (2014/07/18) command="RESET" 時に、ダウンロードリンクを表示
    249                if(    "NEW".equals(   command ) || "RENEW".equals( command )
    250                        || "FIRST".equals( command ) || "LAST".equals(  command )
    251                        || "PREV".equals(  command ) || "NEXT".equals(  command )
    252                        || "VIEW".equals(  command ) || "RESET".equals( command ) ) {
    253                        isDownload = true;
    254                }
    255                else if( "COPY".equals( command ) || "INSERT".equals( command ) ) {
    256                        isDownload = false;
    257                }
    258                // 5.7.8.1 (2014/07/18) addDownCmnd , addUpldCmndを追加
    259                else if( addDownCmnd != null && addDownCmnd.equals( command ) ) {
    260                        isDownload = true;
    261                }
    262                else if( addUpldCmnd != null && addUpldCmnd.equals( command ) ) {
    263                        isDownload = false;
    264                }
    265                else {
    266                        return EVAL_PAGE ;
    267                }
    268
    269                byte bitMode ;
    270                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    271                if( roles == null ) {
    272                        final GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
    273                        bitMode = guiInfo.getBitMode();
    274                }
    275                else {
    276                        final RoleMode roleMode = RoleMode.newInstance( roles );
    277                        final RoleMode userRoleMode = getUser().getRoleMode();
    278                        bitMode = userRoleMode.getAccessBitMode( roleMode );
    279                }
    280
    281                if( filename == null ) {
    282                        // 6.2.2.0 (2015/03/27) ファイルの拡張子を、".xls" から、システムリソースの TABLE_WRITER_EXCEL_TYPE に変更
    283                        // 6.3.1.0 (2015/06/28) 4:個人設定可のリソースの取得方法に修正(バグFix)
    284                        // 6.8.1.4 (2017/08/25) filename に、拡張子はつけません。
    285                        filename = getGUIInfoAttri( "LABEL" );
    286                }
    287                final String guikey = getGUIInfoAttri( "KEY" ); // 4.3.0.1 (2008/08/11)
    288                if( isDownload ) {
    289                        if( RoleMode.isDownload( bitMode ) ) {
    290                                // 4.3.0.1 (2008/08/11) callBack パラメータの設定漏れ修正、引数から見直し
    291                                // <og:link href="{@SYS.JSP}/common/fileDownload.jsp" target="_blank" useGamenId="false"
    292                                //              keys="filename,h_clms" vals="{@GUI.LABEL}.xls,{@h_clms}" >
    293                                // 5.3.7.0 (2011/07/01) PL/SQLを利用した検索でファイルダウンロードが出来るように対応します。
    294                                // 6.2.0.1 (2015/03/06) 画面IDのキーを"GAMENID" に統一します。
    295                                final String href = downloadJsp + "?command=RENEW&GAMENID=" + guikey + "&filename=" + StringUtil.urlEncode( filename ) ;
    296
    297//                              jspPrint( makeTag( downloadImg,href,"Download File", target ) );                // 5.5.6.2 (2012/09/24)
    298                                jspPrint( makeTag( downloadImg,href,"Download File", target,true ) );   // 5.9.32.1 (2018/05/11) URLチェック対応
    299
    300                                // 5.1.6.0 (2010/05/01) 帳票画面定義機能対応
    301                                // 5.3.6.0 (2011/06/01) Edit機能見直し
    302                                final GUIInfo editGui = getUser().getGUIInfo( EDIT_GAMENID );
    303                                // 5.7.5.0 (2014/04/04) 編集リンク自体を出すかどうかどうか(初期値:true)
    304                                // 6.1.0.0 (2014/12/26) refactoring:Prefer StringBuffer over += for concatenating strings
    305                                if( editGui != null && useEditLink ) {
    306                                        final String editName = getRequestValue( "editName" );
    307
    308                                        final OgBuilder buf = new OgBuilder()
    309//                                              .append( "javascript:ogOpen('" , sysJsp )                                               // 前後に分断されるので、注意
    310                                                .append( "javascript:ogOpen('" , JSP )                                                  // 前後に分断されるので、注意
    311                                                .append( "/" , editGui.getAddress() )                                                   // 6.3.4.0 (2015/08/01)
    312                                                .append( "/index.jsp?command=NEW&GAMENID=" , guikey )                   // 6.2.0.1 (2015/03/06) 画面IDのキーを"GAMENID" に統一します。
    313                                                .appendIf( editName != null                                                                             // 5.5.2.4 (2012/05/16) nullに対する冗長な比較
    314                                                                , "&editName=" , StringUtil.urlEncode( editName ) )             // 6.8.1.3 (2017/08/04) 日本語のeditNameが、ネイティブモードでHTTP400 エラーになる。
    315                                                .appendIf( RoleMode.isEdit( bitMode ) && isEdit                                 // 5.6.0.2(2013/01/09)
    316                                                                , "&edit=true" )
    317                                                .append( "&fullEdit=" , String.valueOf( RoleMode.isFullEdit( bitMode ) ) )
    318                                                .append( "',null,null,'width=800px,height=350px,top=350,left=100,resizable=yes',false);" );
    319                                        // 6.8.1.3 (2017/08/04) a href ではなく、a onClick にする。
    320//                                      final String editLink = makeTag( editImg,buf.toString(),"Edit",null );
    321                                        final String editLink = makeTag( editImg,buf.toString(),"Edit",null,false );    // 5.9.32.1 (2018/05/11) URLチェック対応
    322                                        jspPrint( editLink.replace( "href","onClick" ) );                       // 6.8.1.3 (2017/08/04) makeTag を修正したくなかった。
    323                                }
    324                        }
    325                }
    326                else {
    327                        if( RoleMode.isUpload( bitMode ) ) {
    328                                // 4.3.0.1 (2008/08/11) callBack パラメータの設定漏れ修正、引数から見直し
    329                                // <og:link href="{@SYS.JSP}/common/filePopup.jsp" keys="callBack" vals="{@GUI.KEY}/{@SESSION.JSPID}" >
    330
    331                                final String jspId  = (String)getSessionAttribute( "JSPID" );
    332                                // 5.3.7.0 (2011/07/01) Excel取込で画面IDとアドレスが異なる場合にエラーとなるバグを修正
    333                                String callBack = getGUIInfoAttri( "ADDRESS" ) + "/" + jspId + "?GAMENID=" + guikey;
    334                                callBack = StringUtil.urlEncode( callBack );
    335                                final String href = uploadJsp + "?callBack=" +  callBack;
    336
    337//                              jspPrint( makeTag( uploadImg,href,"Upload File",target ) );                     // 5.5.6.2 (2012/09/24)
    338                                jspPrint( makeTag( uploadImg,href,"Upload File",target,false ) );       // 5.9.32.1 (2018/05/11) URLチェック対応
    339                        }
    340                }
    341
    342                return EVAL_PAGE ;
    343        }
    344
    345        /**
    346         * タグリブオブジェクトをリリースします。
    347         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    348         *
    349         * @og.rev 5.7.4.1 (2014/03/15) エラーメッセージ変更
    350         * @og.rev 5.7.5.0 (2014/04/04) useEditLink 追加
    351         * @og.rev 5.7.8.1 (2014/07/18) addDownCmnd,addUpldCmnd 追加
    352         * @og.rev 5.9.32.1 (2018/05/08) URLチェック対応
    353         * @og.rev 7.3.2.3 (2021/04/09) sysJspを、static化します。
    354         */
    355        @Override
    356        protected void release2() {
    357                super.release2();
    358//              sysJsp                  = HybsSystem.sys( "JSP" );
    359                command                 = null;         // ダウンロード="NEW|RENEW|FIRST|LAST|PREV|NEXT|VIEW|RESET" 、アップロード="COPY|INSERT"
    360//              downloadImg             = sysJsp + "/image/fileDownload.gif";   // ダウンロード時のアイコン
    361//              downloadJsp             = sysJsp + "/common/fileDownload.jsp";  // ダウンロード時の呼び出しJSP
    362//              uploadImg               = sysJsp + "/image/fileUpload.gif";             // アップロード時のアイコン
    363//              uploadJsp               = sysJsp + "/common/filePopup.jsp";             // アップロード時の呼び出しJSP
    364                downloadImg             = JSP_ICON + "/fileDownload.gif";               // ダウンロード時のアイコン
    365                downloadJsp             = JSP + "/common/fileDownload.jsp";             // ダウンロード時の呼び出しJSP
    366                uploadImg               = JSP_ICON + "/fileUpload.gif";         // アップロード時のアイコン
    367                uploadJsp               = JSP + "/common/filePopup.jsp";                // アップロード時の呼び出しJSP
    368                imgWidth                = "20px";                                               // アイコン幅サイズ(px)
    369                imgHeight               = "20px";                                               // アイコン高さサイズ(px)
    370                filename                = null;                                                 // ダウンロード時ファイル名("{@GUI.LABEL}") 6.8.1.4 (2017/08/25) 拡張子はつけません。
    371                roles                   = null;                                                 // アクセスロールズ
    372                target                  = null;                                                 // ダウンロードファイルを開くターゲット
    373                errorMsg                = "ERR0042";                                    // 出力対象データが見つかりませんでした。再度検索して下さい。 5.7.4.0 (2014/03/15)
    374                typeDownload    = false;                                                // Download 処理を行うかどうか(初期値:false)
    375                isError                 = false;
    376//              editImg                 = sysJsp + "/image/edit.png";   // 編集時のアイコン
    377                editImg                 = JSP_ICON + "/edit.png";               // 編集時のアイコン
    378                isEdit                  = true;                                                 // 5.6.0.2 (2013/01/19)
    379                useEditLink             = true;                                                 // 5.7.5.0 (2014/04/04) 追加
    380                addDownCmnd             = null;                                                 // 5.7.8.1 (2014/07/18) ダウンロード時のコマンドを追加
    381                addUpldCmnd             = null;                                                 // 5.7.8.1 (2014/07/18) アップロード時のコマンドを追加
    382                useURLCheck             = HybsSystem.sysBool( "USE_FILEUD_URL_CHECK" );         // 5.9.32.1 (2018/05/11)
    383        //      urlCheckCrypt   = HybsSystem.sys( "URL_CHECK_CRYPT" );                          // 5.9.32.1 (2018/05/11)
    384        }
    385
    386        /**
    387         * リンクを作成します。
    388         *
    389         * @og.rev 4.3.0.1 (2008/08/11) callBack パラメータの設定漏れ修正、引数から見直し
    390         * @og.rev 5.5.6.2 (2012/09/24) tgt引数追加
    391         * @og.rev 6.4.2.0 (2016/01/29) alt属性にtitle属性を追記。
    392         * @og.rev 5.9.32.1 (2018/05/08) URLチェック対応
    393         *
    394         * @param       imgsrc  イメージソース
    395         * @param       href    リンクのURL
    396         * @param       alt             イメージの説明文書
    397         * @param       tgt             HTMLのtarget
    398         * @param       useChk  urlCheck対象 [true:useURLCheckの条件に応じて、ﾁｪｯｸ用URLを作成する。/false:常につけない]
    399         *
    400         * @return      リンク文字列
    401         * @og.rtnNotNull
    402         */
    403//      private String makeTag( final String imgsrc, final String href,  final String alt, final String tgt ) {                                                 // 5.5.6.2 (2012/09/24)
    404        private String makeTag( final String imgsrc, final String href,  final String alt, final String tgt, final boolean useChk ) {   // 5.9.32.1 (2018/05/08)
    405                // linkのBODY部にセットするイメージタグの作成
    406                // 6.1.1.0 (2015/01/17) Attributesの連結記述
    407                final String img = XHTMLTag.img(
    408                                new Attributes()
    409                                        .set( "width"   , imgWidth )
    410                                        .set( "height"  , imgHeight )
    411                                        .set( "src"             , imgsrc )
    412                                        .set( "alt"             , alt )
    413                                        .set( "title"   , alt )                                 // 6.4.2.0 (2016/01/29)
    414                        );
    415
    416                // 5.9.32.1 (2018/05/11) urlCheck
    417                final String tag = useURLCheck && useChk
    418                                                        ? XHTMLTag.addURLCheckKey( href, HybsSystem.URL_CHECK_KEY, getUser().getUserID(), System.currentTimeMillis() + URL_CHECK_TIME )
    419                                                        : href ;
    420
    421                // 6.1.1.0 (2015/01/17) Attributesの連結記述
    422                return XHTMLTag.link(
    423                                new Attributes()
    424//                                      .set( "href"    , href )
    425                                        .set( "href"    , tag )                                 // 5.9.32.1 (2018/05/11) urlCheck
    426                                        .set( "body"    , img )
    427                                        .set( "target"  , tgt )                                 // 5.5.6.2 (2012/09/24)
    428                        );
    429        }
    430
    431        /**
    432         * 【TAG】command を指定します。
    433         *
    434         * @og.tag
    435         * command を指定します。
    436         * ダウンロードは、"NEW|RENEW|FIRST|LAST|PREV|NEXT|VIEW|RESET" のみ有効です。
    437         * アップロードは、"COPY|INSERT" のみ有効です。
    438         * それ以外のコマンドでは、アイコンは表示されません。
    439         * 例えば、NEXT/PREV など。
    440         *
    441         * @param       cmd コマンド [NEW/RENEW/FIRST/LAST/PREV/NEXT/VIEW/RESET/COPY/INSERT]
    442         * @see         #setAddDownCmnd( String )
    443         * @see         #setAddUpldCmnd( String )
    444         * @see         #setCommand( String )
    445         */
    446        public void setCommand( final String cmd ) {
    447                command = nval( getRequestParameter( cmd ),command );
    448        }
    449
    450        /**
    451         * 【TAG】ダウンロード時のアイコンを指定します(初期値:"{&#064;SYS.JSP}/image/fileDownload.gif")。
    452         *
    453         * @og.tag
    454         * ダウンロード時に表示されるアイコンを指定します。
    455         * 初期値:"{&#064;SYS.JSP}/image/fileDownload.gif" です。
    456         *
    457         * @param       img ダウンロード時のアイコン
    458         */
    459        public void setDownloadImg( final String img ) {
    460                downloadImg = nval( getRequestParameter( img ),downloadImg );
    461        }
    462
    463        /**
    464         * 【TAG】ダウンロード時の呼び出しJSPを指定します(初期値:"{&#064;SYS.JSP}/common/fileDownload.jsp")。
    465         *
    466         * @og.tag
    467         * ダウンロード時に呼び出されるJSPファイル名を指定します。
    468         * 初期値:"{&#064;SYS.JSP}/common/fileDownload.jsp" です。
    469         *
    470         * @param       file ダウンロード時の呼び出しJSP
    471         */
    472        public void setDownloadJsp( final String file ) {
    473                downloadJsp = nval( getRequestParameter( file ),downloadJsp );
    474        }
    475
    476        /**
    477         * 【TAG】アップロード時のアイコンを指定します(初期値:"{&#064;SYS.JSP}/image/fileUpload.gif")。
    478         *
    479         * @og.tag
    480         * アップロード時に表示されるアイコンを指定します。
    481         * 初期値:"{&#064;SYS.JSP}/image/fileUpload.gif" です。
    482         *
    483         * @param       img アップロード時のアイコン
    484         */
    485        public void setUploadImg( final String img ) {
    486                uploadImg = nval( getRequestParameter( img ),uploadImg );
    487        }
    488
    489        /**
    490         * 【TAG】アップロード時の呼び出しJSPを指定します(初期値:"{&#064;SYS.JSP}/common/fileUpload.jsp")。
    491         *
    492         * @og.tag
    493         * アップロード時に呼び出されるJSPファイル名を指定します。
    494         * 初期値:"{&#064;SYS.JSP}/common/fileUpload.jsp" です。
    495         *
    496         * @param       file アップロード時の呼び出しJSP
    497         */
    498        public void setUploadJsp( final String file ) {
    499                uploadJsp = nval( getRequestParameter( file ),uploadJsp );
    500        }
    501
    502        /**
    503         * 【TAG】アイコン幅サイズ(px)を指定します(初期値:20px)。
    504         *
    505         * @og.tag
    506         * アップロード/ダウンロードのアイコンを表示する際の幅サイズ(px)を指定します。
    507         * ファイルサイズは、アップロード/ダウンロード共通です。
    508         * 初期値は、20px です。
    509         *
    510         * @param       width   アイコン幅サイズ(px)
    511         */
    512        public void setImgWidth( final String width ) {
    513                imgWidth = nval( getRequestParameter( width ),imgWidth );
    514        }
    515
    516        /**
    517         * 【TAG】アイコン高さサイズ(px)を指定します(初期値:20px)。
    518         *
    519         * @og.tag
    520         * アップロード/ダウンロードのアイコンを表示する際の高さサイズ(px)を指定します。
    521         * ファイルサイズは、アップロード/ダウンロード共通です。
    522         * 初期値は、20px です。
    523         *
    524         * @param       height  アイコン高さサイズ(px)
    525         */
    526        public void setImgHeight( final String height ) {
    527                imgHeight = nval( getRequestParameter( height ),imgHeight );
    528        }
    529
    530        /**
    531         * 【TAG】ダウンロード時ファイル名を指定します(初期値:"{&#064;GUI.LABEL}")。
    532         *
    533         * @og.tag
    534         * ダウンロード時のファイル名を指定します
    535         * 通常は、画面のラベル(言語対応)で、拡張子は付けません。ファイルの種類に応じて、拡張子を自動設定します。
    536         *
    537         * @og.rev 6.8.1.4 (2017/08/25) 拡張子はつけません。
    538         *
    539         * @param       file    ダウンロード時ファイル名 ("{&#064;GUI.LABEL}")
    540         */
    541        public void setFilename( final String file ) {
    542                filename = nval( getRequestParameter( file ),filename );
    543        }
    544
    545        /**
    546         * 【TAG】ロールズをセットします。
    547         *
    548         * @og.tag
    549         * ここで指定したロールを元に、ユーザー毎のアクセス許可がチェックされます。
    550         * アクセス許可されないと、表示されません。
    551         * このロールを指定しない場合は、画面のロールが使用されます。
    552         *
    553         * @param       rls パラメータ
    554         */
    555        public void setRoles( final String rls ) {
    556                roles = nval( getRequestParameter( rls ),roles );
    557        }
    558
    559        /**
    560         * 【TAG】ダウンロード文書を表示させるフレーム、またはウィンドウの名前を指定します。
    561         *
    562         * @og.tag フレーム名(ターゲット属性)を設定します。
    563         *
    564         * @param       name ダウンロード文書のフレーム名(ターゲット属性)
    565         */
    566        public void setTarget( final String name ) {
    567                target = nval( getRequestParameter( name ),target );
    568        }
    569
    570        /**
    571         * 【TAG】Download 処理を行うかどうか[true:実行する/false:リンク作成]を指定します(初期値:false)。
    572         *
    573         * @og.tag
    574         * Download 処理を行うには、指定の画面(呼び出し元)と、抜き出した時の
    575         * DBTableModel がマッチしているか判定します。
    576         * また、DBTableModel が存在しない、または、不備な場合(オーバーフロー)は、
    577         * 最終SQLを実行する必要があり、そもそも、抜出処理が出来ない状態では、
    578         * エラーを返す必要があります。
    579         * それら、一連のDownload 処理を行うかどうかを指定します。
    580         * true の場合、session の HybsSystem.DB_LAST_SQL_KEY に格納された
    581         * DBLastSql オブジェクトを取得し、scope が request または、overflow が
    582         * true の場合に、BODY部を実行します。(通常、queryタグを記述します。)
    583         * query の出力先は、scope を request にします。
    584         * それ以外は、tableId から取り出した DBTableModel を、scope = "request"
    585         * に(アドレスのみ)コピーします。
    586         * writeTable タグでは、scope="request" から、DBTableModel を取り出します。
    587         *
    588         * 初期値は、false(抜き出しでは無くリンク作成) です。
    589         *
    590         * @param       type    Download処理 [true:実行する/false:リンク作成]
    591         */
    592        public void setTypeDownload( final String type ) {
    593                typeDownload = nval( getRequestParameter( type ),typeDownload );
    594        }
    595
    596        /**
    597         * 【TAG】ダウンロード出来ない場合のエラーメッセージIDを指定します(初期値:ERR0042)。
    598         *
    599         * @og.tag
    600         * DBTableModel が、最後に作成された画面と、メモリ中の DBLastSql オブジェクトが
    601         * 管理している情報が異なる場合は、ダウンロード出来ません。
    602         * 同様に、DBLastSql オブジェクト 自身が作成されていない場合も出来ません。
    603         * そのようなケースに表示するエラーメッセージのメッセージIDを指定します。
    604         * 引数は、指定できません。
    605         * 初期値は、『ERR0042：出力対象データが見つかりませんでした。再度検索して下さい。』 です。
    606         *
    607         * @param       msg ダウンロード文書のフレーム名(ターゲット属性)
    608         */
    609        public void setErrorMsg( final String msg ) {
    610                errorMsg = nval( getRequestParameter( msg ),errorMsg );
    611        }
    612
    613        /**
    614         * 【TAG】編集アイコンを指定します(初期値:"{&#064;SYS.JSP}/icon/edit.png")。
    615         *
    616         * @og.tag
    617         * 編集アイコンを指定します。
    618         * 初期値:"{&#064;SYS.JSP}/icon/edit.png" です。
    619         *
    620         * @og.rev 5.1.6.0 (2010/05/01) 新規追加
    621         *
    622         * @param       img アップロード時のアイコン
    623         */
    624        public void setEditImg( final String img ) {
    625                editImg = nval( getRequestParameter( img ),editImg );
    626        }
    627
    628        /**
    629         * 【TAG】Edit画面でカラム編集タブを出すかどうか[true:出す/false:出さない]設定します(初期値:true:出す)。
    630         *
    631         * @og.tag
    632         * falseを指定するとカラム編集タブを出さない。
    633         *
    634         * @param       type    編集タブ出力 [true:出す/false:出さない]
    635         */
    636        public void setClmEdit( final String type ) {
    637                isEdit = nval( getRequestParameter( type ),isEdit );
    638        }
    639
    640        /**
    641         * 【TAG】Edit画面でカラム編集リンクを出力するかどうか[true:する/false:しない]設定します(初期値:true:する)。
    642         *
    643         * @og.tag
    644         * falseを指定するとカラム編集リンクを出さない。
    645         * 従来は、カラム編集画面の内、【表示項目設定】タブを表示しないだけでした。
    646         * この設定は、RWMODE を、 ##d , ##u , ##f の場合にも同様の設定が可能です。
    647         * カラム編集リンク自体を出さない機能は、現時点ではリソース設定できないため、
    648         * タグのパラメータとして指定できるようにします。
    649         * 基本的には、このパラメータはほとんど使われていないハズなので、
    650         * 機能を置き換えます。
    651         * 初期値は、カラム編集リンクを出力する(=true)です。
    652         *
    653         * @og.rev 5.7.5.0 (2014/04/04) 新規追加
    654         *
    655         * @param       flag    リンク出力 [true:する/false:しない]
    656         * @see         org.opengion.hayabusa.taglib.QueryButtonTag#setUseEditMenu(String)
    657         */
    658        public void setUseEditLink( final String flag ) {
    659                useEditLink = nval( getRequestParameter( flag ),useEditLink );
    660        }
    661
    662        /**
    663         * 【TAG】ダウンロード時のコマンドを追加指定できます(初期値:null)。
    664         *
    665         * @og.tag
    666         * ダウンロードリンクが表示される command は、
    667         * "NEW|RENEW|FIRST|LAST|PREV|NEXT|VIEW|RESET" のみです。
    668         * これ以外の command で、ダウンロードリンクを表示させたい場合は、
    669         * この、addDownCmnd に、記述します。
    670         * 初期値は、null(追加コマンドはない)です。
    671         *
    672         * @og.rev 5.7.8.1 (2014/07/18) 新規追加
    673         *
    674         * @param       cmd     追加するコマンド
    675         * @see         #setCommand( String )
    676         */
    677        public void setAddDownCmnd( final String cmd ) {
    678                addDownCmnd = nval( getRequestParameter( cmd ),addDownCmnd );
    679        }
    680
    681        /**
    682         * 【TAG】アップロード時のコマンドを追加指定できます(初期値:null)。
    683         *
    684         * @og.tag
    685         * アップロードリンクが表示される command は、"COPY|INSERT" のみです。
    686         * これ以外の command で、アップロードリンクを表示させたい場合は、
    687         * この、addUpldCmnd に、記述します。
    688         * 初期値は、null(追加コマンドはない)です。
    689         *
    690         * @og.rev 5.7.8.1 (2014/07/18) 新規追加
    691         *
    692         * @param       cmd     追加するコマンド
    693         * @see         #setCommand( String )
    694         */
    695        public void setAddUpldCmnd( final String cmd ) {
    696                addUpldCmnd = nval( getRequestParameter( cmd ),addUpldCmnd );
    697        }
    698
    699        /**
    700         * 【TAG】リンクアドレスにURLチェック用の確認キーを付加するかどうか[true/false]を指定します。
    701         *
    702         * @og.tag
    703         * この属性は、URLCheckFilter(org.opengion.hayabusa.filter.URLCheckFilter)と合わせて使用します。
    704         * trueが指定された場合、リンクURLのパラメーターに、URL確認用のパラメーターが出力されます。
    705         * このパラメーターを、URLCheckFilterが復号化し、正式なアクセスであるかどうかの判定を行います。
    706         *
    707         * この属性はjsp/fileDownloadに対してチェックをかける場合にtrueにする必要があります。
    708         * 通常はシステムリソースのFILEUD_URL_CHECKで設定します。
    709         *
    710         * 初期値は、 "false"(確認キーを出力しない) です。
    711         *
    712         * @og.rev 5.9.32.1 (2018/05/08) 追加
    713         *
    714         * @param       flag 暗号化するかかどうか [true:暗号化する/false:しない]
    715         * @see org.opengion.hayabusa.filter.URLCheckFilter
    716         */
    717        public void setUseURLCheck( final String flag ) {
    718                useURLCheck = nval( getRequestParameter( flag ),useURLCheck );
    719        }
    720
    721        /**
    722         * このオブジェクトの文字列表現を返します。
    723         * 基本的にデバッグ目的に使用します。
    724         *
    725         * @return このクラスの文字列表現
    726         * @og.rtnNotNull
    727         */
    728        @Override
    729        public String toString() {
    730                return ToString.title( this.getClass().getName() )
    731                                .println( "VERSION"             ,VERSION                )
    732                                .println( "command"             ,command                )
    733                                .println( "downloadImg" ,downloadImg    )
    734                                .println( "downloadJsp" ,downloadJsp    )
    735                                .println( "uploadImg"   ,uploadImg              )
    736                                .println( "uploadJsp"   ,uploadJsp              )
    737                                .println( "imgWidth"    ,imgWidth               )
    738                                .println( "imgHeight"   ,imgHeight              )
    739                                .println( "filename"    ,filename               )
    740                                .println( "roles"               ,roles                  )
    741                                .println( "target"              ,target                 )
    742                                .println( "Other..."    ,getAttributes().getAttribute() )
    743                                .fixForm().toString() ;
    744        }
    745}