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