001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import static org.opengion.fukurou.util.StringUtil.*; 019 020import java.io.File; 021import java.io.IOException; 022import java.io.ObjectInputStream; 023import java.io.ObjectOutputStream; 024 025import org.opengion.fukurou.model.FileOperation; 026import org.opengion.fukurou.util.FileUtil; 027import org.opengion.fukurou.util.Shell; 028import org.opengion.fukurou.util.StringUtil ; 029import org.opengion.hayabusa.common.HybsSystem; 030import org.opengion.hayabusa.common.HybsSystemException; 031import org.opengion.hayabusa.db.DBTableModel; 032import org.opengion.hayabusa.io.HybsFileOperationFactory; 033import org.opengion.hayabusa.report.DBTableReport; 034 035/** 036 * 検索結果の DBTableModelオブジェクトをレポート形式に変換するタグです。 037 * 038 * データ(DBTableModel)と、コントローラ(DBTableReport クラス)を与えて、 039 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示させることが 040 * 可能です。 041 * 042 * @og.formSample 043 * ●形式:<og:report fileURL="[・・・]" listId="[・・・]" ・・・ /> 044 * ●body:なし 045 * 046 * ●Tag定義: 047 * <og:report 048 * listId ○【TAG】帳票IDを指定します(必須)。 049 * fileURL 【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します 050 * programFile 【TAG】HTMLファイルをEXCEL変換する場合に使用するBATファイルを指定します 051 * outFileURL 【TAG】出力HTMLファイルの保存してあるディレクトリを指定します 052 * outFilename ○【TAG】ファイルを作成するときの出力ファイル名をセットします(必須)。 053 * headerKeys 【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します 054 * headerVals 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します 055 * footerKeys 【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します 056 * footerVals 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します 057 * pageEndCut 【TAG】ボディー部(繰り返し部)がなくなったときに、それ以降を表示するかどうか[true/false]を指定します(初期値:true) 058 * reportClass 【TAG】実際に書き出すクラス名の略称(DBTableReport_**** の ****)をセットします(初期値:HTML) 059 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 060 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session) 061 * tableId 【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID 062 * storageType 【TAG】生成した帳票の出力先ストレージタイプを指定します。 063 * bucketName 【TAG】生成した帳票の出力先バケット名を指定します。 064 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 065 * /> 066 * 067 * ●使用例 068 * 069 * 070 * @og.rev 5.10.9.0 (2019/03/01) oota クラウドストレージ対応を追加。(Fileクラスを拡張) 071 * 072 * @og.group その他出力 073 * 074 * @version 4.0 075 * @author Kazuhiko Hasegawa 076 * @since JDK5.0, 077 */ 078public class ReportTableTag extends CommonTagSupport { 079 //* このプログラムのVERSION文字列を設定します。 {@value} */ 080 private static final String VERSION = "4.0.0.0 (2007/11/28)" ; 081 082 private static final long serialVersionUID = 400020071128L ; // 4.0.0.0 (2007/11/28) 083 084 // 印刷時に使用するテンポラリフォルダ名 085 private final String REPORT_URL = 086 nval( HybsSystem.sys( "REPORT_FILE_URL" ) , 087 HybsSystem.sys( "FILE_URL" ) + "REPORT/" ) ; 088 089 // 3.8.0.4 (2005/08/08) 印刷時に使用するシステムID 090 private static final String SYSTEM_ID =HybsSystem.sys( "SYSTEM_ID" ); 091 092 // 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更 093 private final int TIMEOUT = HybsSystem.sysInt( "REPORT_DAEMON_TIMEOUT" ); 094 095 private final String BASE_URL = HybsSystem.sys( "FILE_URL" ); 096 097 private String[] headerKeys = null; // 固定部の{@KEY} の KEY 部分を指定する。カンマで複数指定できる。 098 private String[] headerVals = null; // 固定部のKEY に対応する値を指定する。 {@KEY} に置き換わる。 099 private String[] footerKeys = null; // 繰り返し部の終了後に表示する key 部分を指定する。カンマで複数指定できる。 100 private String[] footerVals = null; // 繰り返し部の終了後に表示する key に対する値を指定する。 101 private boolean pageEndCut = true; // ボディー部(繰り返し部)がなくなったときに、それ以降のページを出力するか指定する。 102 private String fileURL = BASE_URL; // 雛型のHTMLファイルの保存してある ディレクトリを指定します。 103 private String outFileURL = BASE_URL; // 出力HTMLファイルの保存してある ディレクトリを指定します。 104 private String outFilename = null; // 出力HTMLファイル名を指定します。 ディレクトリ名を含んでも構いません。 105 private String reportClass = "HTML"; 106 107 private transient DBTableModel table = null; 108 private String tableId = HybsSystem.TBL_MDL_KEY ; 109 // 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更 110 private String listId = null ; // 雛型のHTMLファイル名を指定します。 111 private String programFile = null; // HTMLファイルのEXCEL化を行うバッチファイルを指定します。 112// private boolean direct = false; 113// private static final String disposition = "inline"; // 固定 114 private String storageType = null; // 5.10.9.0 (2019/03/01) ADD 115 private String bucketName = null; // 5.10.9.0 (2019/03/01) ADD 116 117 /** 118 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 119 * 120 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 121 * @og.rev 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更 122 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 123 * @og.rev 4.0.0.0 (2007/11/28) メソッドの戻り値をチェックします。 124 * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加。 125 * 126 * @return 後続処理の指示 127 */ 128 @Override 129 public int doEndTag() { 130 debugPrint(); 131 132// int rtnCode = EVAL_PAGE; 133 final int rtnCode; 134 135 table = (DBTableModel)getObject( tableId ); 136 if( table == null || table.getRowCount() == 0 ) { 137 rtnCode = SKIP_PAGE ; // ページの残りの処理を行わない。 138 } 139 else { 140 141// try { 142 synchronized( ReportTableTag.class ) { 143 String reportDir = HybsSystem.url2dir( REPORT_URL ) + SYSTEM_ID + HybsSystem.FS + listId ; 144 // String ykno = HybsSystem.getDate( "yyyyMMddHHmmss" ); 145 String ykno = String.valueOf( Math.round( Math.random() * 1000000 ) ) ; 146 147 create( reportDir,ykno ) ; 148 149 // 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。 150 if( programFile != null && "HTML".equalsIgnoreCase( reportClass ) ) { 151 String htmlFile = reportDir + HybsSystem.FS + ykno ; 152 String cmd = makeShellCommand( htmlFile,listId ); 153 programRun( cmd ); 154 } 155 156 if( outFilename != null ) { 157 File xlsFile = new File( reportDir,ykno + ".xls" ); 158 File outDir = new File( HybsSystem.url2dir( outFileURL ) ); 159// if( !outDir.exists() ) { outDir.mkdirs(); } 160 if( !outDir.exists() && !outDir.mkdirs() ) { 161 String errMsg = "所定のフォルダを作成できませんでした。[" + outDir + "]" ; 162 throw new RuntimeException( errMsg ); 163 } 164 File outFile = new File( outDir,outFilename ); 165 // File outFile = new File( outFileURL,outFilename ); 166 FileUtil.copy( xlsFile , outFile ); 167 168 // 5.10.9.0 (2019/03/01) ADD クラウドストレージ指定の場合は、作成されたファイルをアップロードします。 169 FileOperation cloudFile = HybsFileOperationFactory.create(storageType, bucketName, outDir, outFilename); 170 if(!cloudFile.isLocal()) { 171 FileUtil.copy( outFile, cloudFile); 172 outFile.delete(); 173 } 174 175// String msg = getResource().getMessage( "MSG0003" ) // MSG0003=ファイルの登録が完了しました。 176 String msg = getResource().getLabel( "MSG0003" ) // MSG0003=ファイルの登録が完了しました。 177 + HybsSystem.BR 178// + getResource().getMessage( "MSG0022" ) // MSG0022=ファイル名 179 + getResource().getLabel( "MSG0022" ) // MSG0022=ファイル名 180 + ":" + outFile.getAbsolutePath() ; 181 jspPrint( msg ); 182 183// if( direct ) { 184// directLoad( outFile.getAbsolutePath(),outFilename ); 185// directLoad( xlsFile.getAbsolutePath(),outFilename ); 186// } 187 } 188// else { 189// String redirectUrl = StringUtil.urlAppend( sys( "CONTEXT_URL" ), 190// REPORT_URL + SYSTEM_ID + "/" + 191// listId + "/" + ykno + ".xls" ) ; 192// HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 193// response.sendRedirect( response.encodeRedirectURL( redirectUrl ) ); 194// } 195 } 196// } 197// catch(IOException ex) { 198// String errMsg = "Error in ReportTableTag: " + toString(); 199// throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 200// } 201 rtnCode = EVAL_PAGE ; 202 } 203 204 return( rtnCode ); 205 } 206 207 /** 208 * タグリブオブジェクトをリリースします。 209 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 210 * 211 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 212 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 213 * @og.rev 3.1.3.0 (2003/04/10) REPORT_ENCODE(帳票エンコーディング)を利用するように修正。 214 * @og.rev 3.8.0.4 (2005/08/08) filename 削除、listId ,programFile 追加 , 215 * @og.rev 5.10.9.0 (2019/03/01) storageType,bucketNameを追加。 216 * 217 */ 218 @Override 219 protected void release2() { 220 super.release2(); 221 headerKeys = null; 222 headerVals = null; 223 footerKeys = null; 224 footerVals = null; 225 pageEndCut = true; 226 fileURL = BASE_URL; 227 outFileURL = BASE_URL; 228 outFilename = null; // 出力ファイル名 229 reportClass = "HTML"; 230 table = null; 231 tableId = HybsSystem.TBL_MDL_KEY ; 232 listId = null ; // 3.8.0.4 (2005/08/08) 233 programFile = null ; // 3.8.0.4 (2005/08/08) 234// direct = false; 235 storageType = null; // 5.10.9.0 (2019/03/01) ADD 236 bucketName = null; // 5.10.9.0 (2019/03/01) ADD 237 } 238 239 /** 240 * TableWriter の実オブジェクトを生成して,PrintWriter に書き込みます。 241 * 242 * @og.rev 3.1.3.0 (2003/04/10) REPORT_ENCODE(帳票エンコーディング)を利用するように修正。 243 * @og.rev 3.5.4.3 (2004/01/05) HTMLDBTableReport のクラス名変更。 244 * @og.rev 3.6.0.0 (2004/09/17) メソッド名の変更。setInputFile ⇒ setTemplateFile 245 * @og.rev 3.8.0.0 (2005/06/07) setTemplateFile メソッドの引数を String ⇒ File に変更 246 * @og.rev 3.8.0.4 (2005/08/08) 帳票出力に準拠した方式に変更 247 * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更 248 * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加。 249 * 250 * @param reportDir 出力ディレクトリ名 251 * @param ykno 要求番号 252 */ 253 private void create( final String reportDir,final String ykno ) { 254 255 String className = "org.opengion.hayabusa.report.DBTableReport_" + reportClass ; 256 DBTableReport report = (DBTableReport)HybsSystem.newInstance( className ); // 3.5.5.3 (2004/04/09) 257 258 String MODELDIR = HybsSystem.url2dir( fileURL ) ; 259 260 File templateFile = null; 261 File firstTemplateFile = null; 262 263 // 本来は、各クラス中で処理すべき。そのためのオブジェクト指向なのだから。 264 if( "HTML".equalsIgnoreCase( reportClass ) ) { 265 // 5.10.9.0 (2019/03/01) MODIFY クラウドストレージ利用の場合の処理を追加。 266 templateFile = FileUtil.checkFile( MODELDIR, listId + ".html" , 1 ); 267 firstTemplateFile = FileUtil.checkFile( MODELDIR, listId + "_FIRST.html" ,1 ); 268 } 269 else if( "Excel".equalsIgnoreCase( reportClass ) ) { 270 // 5.10.9.0 (2019/03/01) MODIFY クラウドストレージ利用の場合の処理を追加。 271 templateFile = FileUtil.checkFile( MODELDIR, listId + ".xls" , 1 ); 272 } 273 else { 274 String errMsg = "リポートクラスがサポート外です。[" + reportClass + "]" 275 + "クラスは、HTML、Excel のみサポートされています。" ; 276 throw new RuntimeException( errMsg ); 277 } 278 279 FileUtil.copy( templateFile,new File( reportDir ) ); 280 281 report.setDBTableModel( table ); 282 report.setTemplateFile( templateFile ); // 3.6.0.0 (2004/09/17) 283 report.setFirstTemplateFile( firstTemplateFile ); // 3.6.0.0 (2004/09/17) 284 report.setOutputDir( reportDir ); 285 report.setOutputFileKey( ykno ); 286 report.setHeaderKeys( headerKeys ); 287 report.setHeaderVals( headerVals ); 288 report.setFooterKeys( footerKeys ); 289 report.setFooterVals( footerVals ); 290 report.setPageEndCut( pageEndCut ); 291 report.setResourceManager( getResource() ); // 4.0.0 (2005/01/31) 292 report.setListId( listId ); // 3.6.1.0 (2005/01/05) 293 report.writeReport(); 294 } 295 296 /** 297 * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します 298 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 299 * 300 * @og.tag 301 * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に 302 * 渡す場合に、通常は、session を利用します。その場合の登録キーです。 303 * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、 304 * この tableId 属性を利用して、メモリ空間を分けます。 305 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 306 * 307 * @param id sessionに登録する時の ID 308 */ 309 public void setTableId( final String id ) { 310 tableId = nval( getRequestParameter( id ), tableId ); 311 } 312 313 /** 314 * 【TAG】帳票IDを指定します。 315 * 316 * @og.tag 317 * 雛形ファイルは、帳票ID.html となります。また、ファーストページ対応の場合は、 318 * 帳票ID_FIRST.html になります。 319 * なお、filename 属性が指定された場合は、そちらが優先されます。 320 * 321 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 322 * 323 * @param listId 帳票ID 324 */ 325 public void setListId( final String listId ) { 326 this.listId = nval( getRequestParameter( listId ), this.listId ); 327 } 328 329 /** 330 * 【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します。 331 * 332 * @og.tag 333 * カンマで複数指定できます。 334 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 335 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 336 * 337 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 338 * 339 * @param hKeys 固定部の key 340 */ 341 public void setHeaderKeys( final String hKeys ) { 342 headerKeys = getCSVParameter( hKeys ); 343 } 344 345 /** 346 * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。 347 * 348 * @og.tag 349 * カンマで複数指定で、リクエスト情報でも設定できます。 350 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 351 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 352 * 353 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 354 * 355 * @param hVals 固定部の値 356 */ 357 public void setHeaderVals( final String hVals ) { 358 headerVals = getCSVParameter( hVals ); 359 } 360 361 /** 362 * 【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します。 363 * 364 * @og.tag 365 * カンマで複数指定できます。 366 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 367 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 368 * 369 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 370 * 371 * @param ftKeys 繰り返し部の終了後に表示する key 372 */ 373 public void setFooterKeys( final String ftKeys ) { 374 footerKeys = getCSVParameter( ftKeys ); 375 } 376 377 /** 378 * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。 379 * 380 * @og.tag 381 * カンマで複数指定で、リクエスト情報でも設定できます。 382 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 383 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 384 * 385 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 386 * @og.rev 3.8.1.2 (2005/12/19) footer 関連の値とpageEndCut の関係を解除します。 387 * 388 * @param ftVals 繰り返し部の終了後に表示する値 389 */ 390 public void setFooterVals( final String ftVals ) { 391 footerVals = getCSVParameter( ftVals ); 392 } 393 394 /** 395 * 【TAG】ボディー部(繰り返し部)がなくなったときに、それ以降を表示するかどうか[true/false]を指定します(初期値:true)。 396 * 397 * @og.tag 398 * true では、それ以降を出力しません。 399 * 初期値は "true" (なくなった時点で、出力しない。)です。 400 * 401 * @og.rev 3.8.1.2 (2005/12/19) footer 関連の値とpageEndCut の関係を解除します。 402 * 403 * @param peCut 繰り返し部の終了後に継続処理するかどうか (true:処理しない/false:処理する) 404 */ 405 public void setPageEndCut( final String peCut ) { 406 pageEndCut = nval( getRequestParameter( peCut ),pageEndCut ); 407 } 408 409 /** 410 * 【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します。 411 * 412 * @og.tag 413 * この属性で指定されるディレクトリのファイルを読み取ります。 414 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 415 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 416 * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。 417 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 418 * さらに、各個人ID別のフォルダを作成して、そこを操作します。 419 * 420 * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用 421 * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。 422 * 423 * @param url 雛型のHTMLファイルのディレクトリ 424 */ 425 public void setFileURL( final String url ) { 426 String furl = nval( getRequestParameter( url ),null ); 427 if( furl != null ) { 428 char ch = furl.charAt( furl.length()-1 ); 429 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; } 430 fileURL = StringUtil.urlAppend( fileURL,furl ); 431 } 432 } 433 434 /** 435 * 【TAG】HTMLファイルをEXCEL変換する場合に使用するBATファイルを指定します。 436 * 437 * @og.tag 438 * ファイルは、フルパスで指定してください。 439 * 指定がない場合は、変換処理は行いません。 440 * 通常は、dbdef2/def/Script/runExcelPrint.bat を呼び出してください。 441 * 初期値は、null(変換処理しない)です。 442 * 443 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 444 * 445 * @param programFile プログラムファイル名 446 */ 447 public void setProgramFile( final String programFile ) { 448 this.programFile = nval( getRequestParameter( programFile ),this.programFile ); 449 } 450 451 /** 452 * 【TAG】出力HTMLファイルの保存してあるディレクトリを指定します。 453 * 454 * @og.tag 455 * この属性で指定されるディレクトリにファイルを出力します。 456 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 457 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 458 * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。 459 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 460 * さらに、各個人ID別のフォルダを作成して、そこに出力します。 461 * 462 * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。 463 * 464 * @param url 出力HTMLファイルのディレクトリ 465 */ 466 public void setOutFileURL( final String url ) { 467 String furl = nval( getRequestParameter( url ),null ); 468 if( furl != null ) { 469 char ch = furl.charAt( furl.length()-1 ); 470 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; } 471 outFileURL = StringUtil.urlAppend( outFileURL,furl ); 472 } 473 } 474 475 /** 476 * 【TAG】ファイルを作成するときの出力ファイル名をセットします。 477 * 478 * @og.tag ファイルを作成するときの出力ファイル名をセットします。 479 * 480 * @param filename 出力ファイル名 481 */ 482 public void setOutFilename( final String filename ) { 483 this.outFilename = nval( getRequestParameter( filename ),this.outFilename ); 484 } 485 486 /** 487 * 【TAG】実際に書き出すクラス名の略称(DBTableReport_**** の ****)をセットします(初期値:HTML)。 488 * 489 * @og.tag 490 * これは、org.opengion.hayabusa.report 以下の DBTableReport_**** クラスの **** を 491 * 与えます。これらは、DBTableReport インターフェースを継承したサブクラスです。 492 * 初期値は、"HTML" です。 493 * 属性クラス定義の {@link org.opengion.hayabusa.report.DBTableReport DBTableReport} を参照願います。 494 * 495 * @param reportClass クラス名(の略称) 496 * @see org.opengion.hayabusa.report.DBTableReport DBTableReportのサブクラス 497 */ 498 public void setReportClass( final String reportClass ) { 499 this.reportClass = nval( getRequestParameter( reportClass ),this.reportClass ); 500 } 501 502 /** 503 * 【TAG】結果をダイレクトにEXCEL起動するかどうか[true/false]を指定します(初期値:false[ファイル])。 504 * 505 * @og.tag 結果をダイレクトに EXCEL ファイルとして出力するかどうかをセットします。 506 * 507 * @param flag ダイレクト(true)/ ファイル(その他) 508 */ 509// public void setDirect( final String flag ) { 510// direct = nval( getRequestParameter( flag ),direct ); 511// } 512 513 /** 514 * シェルコマンドの文字列を作成します。 515 * 516 * 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。 517 * 518 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 519 * @og.rev 3.8.0.8 (2005/10/03) デーモングループのデフォルト値設定 520 * 521 * @param htmlFile パーサ済みのHTMLファイル(拡張子なし) 522 * @param listId 雛形ファイル(帳票ID) 523 * 524 * @return シェルコマンドの文字列 525 */ 526 private String makeShellCommand( final String htmlFile,final String listId ) { 527 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 528 529 buf.append( programFile ).append( " " ); // 実行するコマンド 530 buf.append( "\"" ); 531 buf.append( htmlFile ).append( "_*.html\" " ); // 入力HTMLファイル 532 buf.append( "\"xls\" " ); // プリンタ名 533 // ダミーファイルを指定する必要がある。 534 buf.append( "\"" ); 535 buf.append( htmlFile ).append( ".xls\" " ); // ダミー出力ファイル 536 buf.append( listId ); // モデルファイル名 537 buf.append( " NULL" ); // ダミーデーモングループ 538 539 return buf.toString(); 540 } 541 542 /** 543 * 実際のレポート出力処理を行います。 544 * 545 * 処理クラス(reportClass)が HTML の場合は、Shell を起動して、VBS で EXCEL化が必要。 546 * 547 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 548 * 549 * @param shellCmd シェルを実行するコマンド文字列 550 */ 551 private void programRun( final String shellCmd ) { 552 Shell shell = new Shell(); 553 shell.setCommand( shellCmd,true ); // BATCHプロセスで実行する 554 shell.setWait( true ); // プロセスの終了を待つ 555 shell.setTimeout( TIMEOUT ); // 3.6.1.0 (2005/01/05) Shell の タイムアウトを設定 556 557 int rtnCode = shell.exec(); // 0 は正常終了を示す 558 559 if( rtnCode != 0 ) { 560 String errMsg = "Shell Command exequte Error." + HybsSystem.CR 561 + "==============================" 562 + shellCmd + HybsSystem.CR 563 + shell.getStdoutData() + HybsSystem.CR 564 + shell.getStderrData() + HybsSystem.CR ; 565 throw new HybsSystemException( errMsg ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 566 } 567 } 568 569 /** 570 * Excel ファイルをダイレクトで返す forward 処理を行います。 571 * 572 * @og.rev 4.0.0.0 (2007/06/11) 新規追加 573 * 574 * @param fwdUrl 実際に転送するファイルアドレス 575 * @param fname 転送で返すファイル名 576 */ 577// private void directLoad( final String fwdUrl,final String fname ) { 578// HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 579// 580// try { 581// String url = response.encodeRedirectURL( fwdUrl ); // 3.5.4.9 (2004/02/25) 582// String filename = StringUtil.urlEncode( fname ); 583// 584// (response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" ); 585// response.sendRedirect( url ); 586// // pageContext.forward( url ); 587// } catch(IOException ex) { 588// String errMsg = "フォワードでIOエラーが発生しました。" + toString(); 589// throw new HybsSystemException( errMsg,ex ); 590//// } catch( ServletException ex) { 591//// String errMsg = "フォワードでServletエラーが発生しました。" + toString(); 592//// throw new HybsSystemException( errMsg,ex ); 593// } 594// } 595 596 /** 597 * タグの名称を、返します。 598 * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。 599 * 600 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 601 * 602 * @return タグの名称 603 */ 604 @Override 605 protected String getTagName() { 606 return "report" ; 607 } 608 609 /** 610 * シリアライズ用のカスタムシリアライズ書き込みメソッド 611 * 612 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 613 * @serialData 一部のオブジェクトは、シリアライズされません。 614 * 615 * @param strm ObjectOutputStreamオブジェクト 616 * @throws IOException 入出力エラーが発生した場合 617 */ 618 private void writeObject( final ObjectOutputStream strm ) throws IOException { 619 strm.defaultWriteObject(); 620 } 621 622 /** 623 * シリアライズ用のカスタムシリアライズ読み込みメソッド 624 * 625 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 626 * 627 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 628 * @serialData 一部のオブジェクトは、シリアライズされません。 629 * 630 * @param strm ObjectInputStreamオブジェクト 631 * @see #release2() 632 * @throws IOException シリアライズに関する入出力エラーが発生した場合 633 * @throws ClassNotFoundException クラスを見つけることができなかった場合 634 */ 635 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 636 strm.defaultReadObject(); 637 } 638 639 /** 640 * 【TAG】保存先のストレージタイプを設定します。 641 * 642 * @og.tag 643 * ファイルを保存先の、ストレージタイプを設定します。 644 * 未設定の場合は、システムリソースの「CLOUD_TARGET」が参照されます。 645 * 自身のサーバを指定する場合は、「default」を設定してください。 646 * 647 * @og.rev 5.10.9.0 (2019/03/01) 新規追加 648 * 649 * @param storage 保存先ストレージタイプ 650 */ 651 public void setStorageType( final String storage ) { 652 storageType = nval( getRequestParameter(storage), storageType ); 653 } 654 655 /** 656 * 【TAG】バケット名を設定します。 657 * 658 * @og.tag 659 * バケット名を指定します。 660 * クラウドストレージ利用時のみ有効です。 661 * 未設定の場合は、システムリソースの「CLOUD_BUKET」が参照されます。 662 * 663 * @og.rev 5.10.9.0 (2019/03/01) 新規追加 664 * 665 * @param bucket バケット名 666 */ 667 public void setBucketName( final String bucket ) { 668 bucketName = nval( getRequestParameter(bucket), bucketName ); 669 } 670 671 /** 672 * このオブジェクトの文字列表現を返します。 673 * 基本的にデバッグ目的に使用します。 674 * 675 * @og.rev 5.10.9.0 (2019/03/01) storageType, bucketNameを出力対象に追加。 676 * 677 * @return このクラスの文字列表現 678 */ 679 @Override 680 public String toString() { 681 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 682 .println( "VERSION" ,VERSION ) 683 .println( "headerKeys" ,headerKeys ) 684 .println( "headerVals" ,headerVals ) 685 .println( "footerKeys" ,footerKeys ) 686 .println( "footerVals" ,footerVals ) 687 .println( "pageEndCut" ,pageEndCut ) 688 .println( "fileURL" ,fileURL ) 689 .println( "outFileURL" ,outFileURL ) 690 .println( "outFilename" ,outFilename ) 691 .println( "reportClass" ,reportClass ) 692 .println( "tableId" ,tableId ) 693 .println( "listId" ,listId ) 694 .println( "programFile" ,programFile ) 695 .println( "REPORT_FILE_URL" ,REPORT_URL ) 696 .println( "SYSTEM_ID" ,SYSTEM_ID ) 697 .println( "TIMEOUT" ,TIMEOUT ) 698 .println( "BASE_URL" ,BASE_URL ) 699 .println( "storageType" ,storageType ) 700 .println( "bucketName" ,bucketName ) 701 .println( "Other..." ,getAttributes().getAttribute() ) 702 .fixForm().toString() ; 703 } 704}