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