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