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