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.report2; 017 018import java.io.File; 019 020import org.opengion.hayabusa.db.DBTableModel; 021 022/** 023 * 帳票処理要求を管理するキューオブジェクトです。 024 * このオブジェクトでは、帳票の定義及びデータと、処理中に発生したエラーメッセージを管理します。 025 * また、このキューを生成したオブジェクトもこのオブジェクトにセットされます。 026 * 027 * @og.group 帳票システム 028 * 029 * @version 4.0 030 * @author Hiroki.Nakamura 031 * @since JDK1.6 032 */ 033public class ExecQueue { 034 035 /** 実行方法 {@value} */ 036 protected static final String OUT_ODS_ONLY = "1"; 037 /** 実行方法 {@value} */ 038 protected static final String OUT_PRINT_ONLY = "2"; 039 /** 実行方法 {@value} */ 040 protected static final String OUT_ODS_PRINT = "3"; 041 /** 実行方法 {@value} */ 042 protected static final String OUT_ODS_PDF = "P"; 043 /** 実行方法 {@value} */ 044 protected static final String OUT_ODS_PRINT_PDF = "Q"; 045 /** 実行方法 {@value} */ 046 protected static final String OUT_ODS_EXCEL = "E"; 047 /** 実行方法 {@value} */ 048 protected static final String OUT_ODS_ODS = "S"; // 4.3.3.4 (2008/11/01) 追加 049 /** 実行方法 {@value} */ 050 protected static final String IN_INPUT_ONLY = "5"; 051 /** 実行方法 {@value} */ 052 protected static final String IN_EXEC_ONLY = "6"; 053 /** 実行方法 {@value} */ 054 protected static final String IN_INPUT_EXEC = "7"; 055 /** 実行方法 {@value} */ 056 protected static final String RFID_PRINT = "A"; 057 /** 実行方法 {@value} */ 058 protected static final String RFID_ALLPRINT = "B"; 059 /** 実行方法 {@value} */ 060 protected static final String RFID_ALLERASE = "C"; 061 /** 実行方法 {@value} */ 062 protected static final String RFID_SEQERASE = "D"; 063 064 /** 最大シート数 {@value} */ 065 protected static final int MAX_SHEETS_PER_FILE = 256; // 5.1.2.0 (2010/01/01) 066 067 private String ykno = null; 068 private String systemId = null; 069 private DBTableModel body = null; 070 private DBTableModel header = null; 071 private DBTableModel footer = null; 072 private String listId = null; 073 private String pdfPasswd = null; 074 private String lang = null; 075 private String threadId = null; 076 private String templateName = null; 077 private String outputType = null; 078 private String printerName = null; 079 private String outputName = null; 080 private boolean fglocal = false; 081 private boolean fgcut = false; 082 private QueueManager manager = null; 083 private String prgdir = null; // 4.3.3.0 (2008/10/01) 板金RFID対応。 084 private String prgfile = null; // 4.3.3.0 (2008/10/01) 085 private String prtid = null; // 4.3.3.0 (2008/10/01) 086 087 private int pageCnt = 0; // 5.1.2.0 (2010/01/01) 処理したページ数 088 private int rowCnt = 0; // 5.1.2.0 (2010/01/01) 処理した行数 089 private boolean isDataEnd = false; // 5.1.2.0 (2010/01/01) 全データが処理されたか (メソッド名と同じ変数名変更) 090 091 private boolean useSheetName = false; // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 092 093 private final StringBuilder errMsg = new StringBuilder(); 094 095 /** 096 * 要求NOをセットします。 097 * 098 * @param ykno 要求NO 099 */ 100 public void setYkno( final String ykno ) { 101 this.ykno = ykno; 102 } 103 104 /** 105 * 要求NOを取得します。 106 * 107 * @return 要求NO 108 */ 109 public String getYkno() { 110 return ykno; 111 } 112 113 /** 114 * システムIDをセットします。 115 * 116 * @param systemId システムID 117 */ 118 public void setSystemId( final String systemId ) { 119 this.systemId = systemId; 120 } 121 122 /** 123 * システムIDを取得します。 124 * 125 * @return StringシステムID 126 */ 127 public String getSystemId() { 128 return systemId; 129 } 130 131 /** 132 * ボディー部分のDBTableModelをセットします。 133 * 134 * @param body DBTableModelオブジェクト 135 */ 136 public void setBody( final DBTableModel body ) { 137 this.body = body; 138 } 139 140 /** 141 * ボディー部分のDBTableModelを取得します。 142 * 143 * @return ボディー部分のDBTableModelオブジェクト 144 */ 145 public DBTableModel getBody() { 146 return body; 147 } 148 149 /** 150 * ヘッダー部分のDBTableModelをセットします。 151 * 152 * @param header DBTableModelオブジェクト 153 */ 154 public void setHeader( final DBTableModel header ) { 155 this.header = header; 156 } 157 158 /** 159 * ヘッダー部分のDBTableModelを取得します。 160 * 161 * @return ヘッダー部分のDBTableModelオブジェクト 162 */ 163 public DBTableModel getHeader() { 164 return header; 165 } 166 167 /** 168 * フッター部分のDBTableModelをセットします。 169 * 170 * @param footer DBTableModelオブジェクト 171 */ 172 public void setFooter( final DBTableModel footer ) { 173 this.footer = footer; 174 } 175 176 /** 177 * フッター部分のDBTableModelを取得します。 178 * 179 * @return フッター部分のDBTableModelオブジェクト 180 */ 181 public DBTableModel getFooter() { 182 return footer; 183 } 184 185 /** 186 * 帳票IDをセットします。 187 * 188 * @param listId 帳票ID 189 */ 190 public void setListId( final String listId ) { 191 this.listId = listId; 192 } 193 194 /** 195 * 帳票IDを取得します。 196 * 197 * @return 帳票ID 198 */ 199 public String getListId() { 200 return listId; 201 } 202 203 /** 204 * PDFパスワードをセットします。 205 * 206 * @param pdfPasswd PDFパスワード 207 */ 208 public void setPdfPasswd( final String pdfPasswd ) { 209 this.pdfPasswd = pdfPasswd; 210 } 211 212 /** 213 * PDFパスワードを取得します。 214 * 215 * @return PDFパスワード 216 */ 217 public String getPdfPasswd() { 218 return pdfPasswd; 219 } 220 221 /** 222 * 言語をセットします。 223 * 224 * @param lang 言語 225 */ 226 public void setLang( final String lang ) { 227 this.lang = lang; 228 } 229 230 /** 231 * 言語を取得します。 232 * 233 * @return 言語 234 */ 235 public String getLang() { 236 return lang; 237 } 238 239 /** 240 * 雛形ファイル名をセットします。 241 * 242 * @param templateName 雛形ファイル名 243 */ 244 public void setTemplateName( final String templateName ) { 245 this.templateName = templateName; 246 } 247 248 /** 249 * 雛形ファイル名を取得します。 250 * 251 * @return 帳票雛形ファイル名 252 */ 253 public String getTemplateName() { 254 return templateName; 255 } 256 257 /** 258 * 実行方法をセットします。 259 * 260 * @param outputType 実行方法 261 */ 262 public void setOutputType( final String outputType ) { 263 this.outputType = outputType; 264 } 265 266 /** 267 * 出力タイプを取得します。 268 * 269 * @return 出力タイプ 270 */ 271 public String getOutputType() { 272 return outputType; 273 } 274 275 /** 276 * プリンター名をセットします。 277 * 278 * @param printerName プリンター名 279 */ 280 public void setPrinterName( final String printerName ) { 281 this.printerName = printerName; 282 } 283 284 /** 285 * プリンター名を取得します。 286 * 287 * @return プリンタ名 288 */ 289 public String getPrinterName() { 290 return printerName; 291 } 292 293 /** 294 * 処理要求を処理するスレッドIDをセットします。 295 * 296 * @param threadId スレッドID 297 */ 298 public void setThreadId( final String threadId ) { 299 this.threadId = threadId; 300 } 301 302 /** 303 * 処理要求を処理するスレッドIDを取得します。 304 * 305 * @return スレッドID 306 */ 307 public String getThreadId() { 308 return threadId; 309 } 310 311 /** 312 * 出力ファイル名をセットします。 313 * 314 * @param outputName 出力ファイル名 315 */ 316 public void setOutputName( final String outputName ) { 317 this.outputName = outputName; 318 } 319 320 /** 321 * 出力ファイル名を設定します。 322 * GE50に設定されていない場合は第四引数(要求番号)を利用する。 323 * その場合、タイプに応じた拡張子が自動設定される。 324 * 325 * ".xls" : OUT_ODS_EXCEL 326 * ".pdf" : OUT_ODS_PDF , OUT_ODS_PRINT_PDF 327 * ".ods" : OUT_ODS_ODS 328 * ".xml" : RFID_PRINT , RFID_ALLPRINT , RFID_ALLERASE , RFID_SEQERASE 329 * 330 * @og.rev 4.3.3.4 (2008/11/01) ODS出力対応 331 * @og.rev 5.4.3.0 (2011/12/26) RFIDデフォルト対応 332 * @og.rev 5.4.4.1 (2012/02/03) RFID拡張子変更 333 * 334 * @param outputDir 出力ディレクトリ名 335 * @param outputFile 出力ファイル名 336 * @param type タイプ 337 * @param yokyu 要求番号(ファイル名が指定されていない場合のファイル名) 338 * 339 */ 340 public void setOutputName( final String outputDir, final String outputFile, final String type, final String yokyu ){ 341 StringBuilder filePath = new StringBuilder(); 342 filePath.append( outputDir + File.separator ); 343 344 if( outputFile == null || outputFile.length() == 0 ){ // ファイル名が指定されていない場合は要求番号を利用する。 345 if( OUT_ODS_EXCEL.equals( type ) ){ 346 filePath.append( yokyu ); 347 filePath.append( ".xls" ); 348 } 349 else if( OUT_ODS_PDF.equals( type ) || OUT_ODS_PRINT_PDF.equals( type ) ){ 350 filePath.append( yokyu ); 351 filePath.append( ".pdf" ); 352 } 353 // 4.3.3.4 (2008/11/01) 追加 354 else if( OUT_ODS_ODS.equals ( type ) ){ 355 filePath.append( yokyu ); 356 filePath.append( ".ods" ); 357 } 358 // 5.4.3.0 (2011/12/26) 追加 359 // 5.4.4.2 (2012/02/03) .txtではなく.xml 360 else if( ExecQueue.RFID_PRINT.equals( type ) || ExecQueue.RFID_ALLPRINT.equals( type ) 361 || ExecQueue.RFID_ALLERASE.equals( type ) || ExecQueue.RFID_SEQERASE.equals( type ) ) { 362 filePath.append( yokyu ); 363 filePath.append( ".xml" ); //txt-xml 364 } 365 } 366 else { 367 filePath.append( outputFile ); 368 } 369 370 this.outputName = filePath.toString(); 371 } 372 373 /** 374 * 出力ファイル名を取得します。 375 * 376 * @og.rev 5.1.2.0 (2010/01/01) 256シートを超える場合に対応。2ファイル目以降は、_1、_2・・・をファイル名の後ろにつける 377 * 378 * @return 出力先ファイル名 379 */ 380 public String getOutputName() { 381 if( pageCnt <= MAX_SHEETS_PER_FILE ) { 382 return outputName; 383 } 384 else { 385 StringBuilder fileName = new StringBuilder(); 386 387 int idx = outputName.lastIndexOf( '.' ); 388 String name = outputName.substring( 0, idx ); 389 String suffix = outputName.substring( idx ); 390 int addNo = (int)Math.ceil( (double)pageCnt/(double)MAX_SHEETS_PER_FILE ) - 1; 391 392 fileName.append( name ).append( "_" ).append( addNo ).append( suffix ); 393 394 return fileName.toString(); 395 } 396 } 397 398 /** 399 * 実行ファイルディレクトリを指定します。 400 * 401 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 402 * 403 * @param dir ディレクトリ 404 */ 405 public void setPrgDir( final String dir ) { 406 this.prgdir = dir; 407 } 408 409 /** 410 * 実行ファイルディレクトリを取得します。 411 * 412 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 413 * 414 * @return プログラムディレクトリ 415 */ 416 public String getPrgDir() { 417 return prgdir; 418 } 419 420 /** 421 * 実行ファイル名をセットします。 422 * 423 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 424 * @param file ファイル名 425 */ 426 public void setPrgFile( final String file ) { 427 this.prgfile = file; 428 } 429 430 /** 431 * 実行ファイル名を取得します。 432 * 433 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 434 * 435 * @return プログラムファイル名 436 */ 437 public String getPrgFile() { 438 return prgfile; 439 } 440 441 /** 442 * プリンタIDをセットします。 443 * 444 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 445 * @param id プリンタID 446 */ 447 public void setPrtId( final String id ) { 448 this.prtid = id; 449 } 450 451 /** 452 * プリンタIDを取得します。 453 * 454 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 455 * 456 * @return プリンタID 457 */ 458 public String getPrtId() { 459 return prtid; 460 } 461 462 /** 463 * ローカルリソース使用フラグをセットします(初期値:false)。 464 * 465 * @param fglocal ローカルリソース使用フラグ[true:使用する/false:使用しない] 466 */ 467 public void setFglocal( final boolean fglocal ) { 468 this.fglocal = fglocal; 469 } 470 471 /** 472 * ローカルリソース使用フラグを取得します。 473 * 474 * @return ロールリソース使用フラグ[true:使用する/false:使用しない] 475 */ 476 public boolean isFglocal() { 477 return fglocal; 478 } 479 480 /** 481 * ページエンドカットフラグをセットします(初期値:false)。 482 * 483 * @param fgcut ページエンドカットの使用可否[true:使用/false:通常] 484 */ 485 public void setFgcut( final boolean fgcut ) { 486 this.fgcut = fgcut; 487 } 488 489 /** 490 * ページエンドカットフラグを取得します。 491 * 492 * @return ページエンドカットフラグ 493 */ 494 public boolean isFgcut() { 495 return fgcut; 496 } 497 498 /** 499 * PAGEBREAKカラムの値を、シート名として使うかどうかをセットします(初期値:false)。 500 * 501 * @og.rev 5.7.6.2 (2014/05/16) 新規追加 502 * 503 * @param useSheetName PAGEBREAKカラムのシート名使用可否[true:使用/false:使用しない] 504 */ 505 public void setUseSheetName( final boolean useSheetName ) { 506 this.useSheetName = useSheetName; 507 } 508 509 /** 510 * PAGEBREAKカラムの値を、シート名として使うかどうかを取得します。 511 * 512 * @og.rev 5.7.6.2 (2014/05/16) 新規追加 513 * 514 * @return PAGEBREAKカラムのシート名使用可否[true:使用/false:使用しない] 515 */ 516 public boolean isUseSheetName() { 517 return useSheetName; 518 } 519 520 /** 521 * キューマネージャーをセットします。 522 * 523 * @param manager キューマネージャー 524 */ 525 public void setManager( final QueueManager manager ) { 526 this.manager = manager; 527 } 528 529 /** 530 * 帳票処理データをセットします。 531 * 既にテーブルモデルがセットされている場合は、再セットしません。 532 * 533 */ 534 public void setData() { 535 if( body == null && manager != null ) { 536 manager.set( this ); 537 } 538 } 539 540 /** 541 * キューを実行中の状態に更新します。 542 * 543 */ 544 public void setExecute() { 545 if( manager != null ) { 546 manager.execute( this ); 547 } 548 } 549 550 /** 551 * キューを完了済の状態に更新します。 552 * 553 */ 554 public void setComplete() { 555 if( manager != null ) { 556 manager.complete( this ); 557 } 558 } 559 560 /** 561 * キューをエラーの状態に更新します。 562 */ 563 public void setError() { 564 if( manager != null ) { 565 manager.error( this ); 566 } 567 } 568 569 /** 570 * エラーメッセージをセットします。 571 * 572 * @param msg エラーメッセージ 573 */ 574 public void addMsg( final String msg ) { 575 errMsg.append( msg ); 576 } 577 578 /** 579 * エラーメッセージを取得します。 580 * 581 * @return エラーメッセージ 582 */ 583 public String getMsg() { 584 return errMsg.toString(); 585 } 586 587 /** 588 * 処理したページ数を引数の分だけカウントアップします。 589 * 590 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 591 * 592 * @param pgs カウントアップするページ数 593 */ 594 public void addExecPageCnt( final int pgs ) { 595 pageCnt += pgs; 596 } 597 598 /** 599 * 処理したページ数を返します。 600 * 601 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 602 * 603 * @return 処理したページ数 604 */ 605 public int getExecPagesCnt() { 606 return pageCnt; 607 } 608 609 /** 610 * 処理した行数をセットします。 611 * 612 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 613 * 614 * @param rws 処理した行数 615 */ 616 public void setExecRowCnt( final int rws ) { 617 rowCnt = rws; 618 } 619 620 /** 621 * 処理した行数を返します。 622 * 623 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 624 * 625 * @return 処理した行数 626 */ 627 public int getExecRowCnt() { 628 return rowCnt; 629 } 630 631 /** 632 * 全ての行が処理されたかをセットします(初期値:false)。 633 * 634 * これは、処理結果が、256シートを超えていた場合、再度残りのデータについて 635 * 処理を行うかどうかの判定するために、利用します。 636 * 637 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 638 * 639 * @param flag 全ての行が処理されたか 640 */ 641 public void setEnd( final boolean flag ) { 642 isDataEnd = flag; 643 } 644 645 /** 646 * 全ての行が処理されているかを返します。 647 * 648 * これは、処理結果が、256シートを超えていた場合、再度残りのデータについて 649 * 処理を行うかどうかの判定するために、利用します。 650 * 651 * @og.rev 5.1.2.0 (2010/01/01) 新規追加 652 * 653 * @return 全ての行が処理されたか 654 */ 655 public boolean isEnd() { 656 return isDataEnd; 657 } 658}