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