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