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.util.Random;
019
020import org.opengion.hayabusa.common.HybsSystem;
021import org.opengion.hayabusa.common.HybsSystemException;
022import org.opengion.hayabusa.db.DBTableModel;
023
024/**
025 * 画面から直接キューを作成するためのクラスです。
026 * 各種設定値を直接指定することでDBのマスタ設定を行うことなく帳票出力を行います。
027 * 現時点では、出力系の処理しか対応していません。
028 *
029 * ここで登録されたキューは、別スレッドで処理されるため、#create()メソッドを呼び出した後は、
030 * #waitExec()メソッドを呼び出し、処理の終了に同期させる必要があります。
031 * エラーが発生した場合は、HybsSystemExceptionを発生します。
032 *
033 * また、処理のタイムアウトは、システムリソースのREPORT_DAEMON_TIMEOUTで設定します。
034 *
035 * @og.group 帳票システム
036 *
037 * @version  4.0
038 * @author   Hiroki.Nakamura
039 * @since    JDK1.6
040 */
041public class QueueManager_DIRECT implements QueueManager {
042
043        private final int timeout = HybsSystem.sysInt( "REPORT_DAEMON_TIMEOUT" );
044
045        private static final String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
046        private static final Random RANDOM = new Random();
047
048        private String listId           ;
049        private String outputName       ;
050        private String lang                     ;
051        private String outputType       ;
052        private String templateName     ;
053        private String printerName      ;
054        private boolean fglocal         ;
055        private boolean fgcut           ;
056        private boolean useSheetName;   // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。
057
058        private DBTableModel body       ;
059        private DBTableModel header     ;
060        private DBTableModel footer     ;
061
062        private boolean isEnd   ;
063        private String errMsg   ;
064
065        /**
066         * デフォルトコンストラクター
067         *
068         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
069         */
070        public QueueManager_DIRECT() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
071
072        /**
073         * 帳票処理キューを作成します。
074         *
075         * @og.rev 5.1.6.0 (2010/05/01) 要求単位にスレッドを生成するようにします。
076         * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうかをセットします
077         */
078        @Override       // QueueManager
079        public void create() {
080                final ExecQueue queue = new ExecQueue();
081                queue.setSystemId( SYSTEM_ID );
082                queue.setYkno( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) );
083                queue.setListId( listId );
084                queue.setLang( lang );
085                queue.setOutputName( outputName );
086                queue.setOutputType( outputType );
087                // 5.1.6.0 (2010/05/01)
088                queue.setThreadId( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) );
089                queue.setTemplateName( templateName );
090                queue.setPrinterName( printerName );
091                queue.setFglocal( fglocal );
092                queue.setFgcut( fgcut );
093                queue.setUseSheetName( useSheetName );          // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうかをセットします
094
095                queue.setBody( body );
096                queue.setHeader( header );
097                queue.setFooter( footer );
098
099                queue.setManager( this );
100
101                // 5.1.6.0 (2010/05/01)
102                ExecThreadManager.insertQueueOnNewThread( queue );
103        }
104
105        /**
106         * 帳票処理データをキューにセットします。
107         * 画面から発行する場合は、テーブルモデルを直接セットするので、
108         * ここでは何もしません。
109         *
110         * @param       queue   ExecQueueオブジェクト
111         */
112        @Override       // QueueManager
113        public void set( final ExecQueue queue ) {
114                // 何もありません。(PMD エラー回避)
115        }
116
117        /**
118         * キューを実行中の状態に更新します。
119         * 画面から発行する場合は、実行中であることを知る必要がないため、
120         * ここでは何もしません。
121         *
122         * @param       queue   ExecQueueオブジェクト
123         */
124        @Override       // QueueManager
125        public void execute( final ExecQueue queue ) {
126                // 何もありません。(PMD エラー回避)
127        }
128
129        /**
130         * キューを完了済の状態に更新します。
131         *
132         * @param       queue   ExecQueueオブジェクト
133         */
134        @Override       // QueueManager
135        public void complete( final ExecQueue queue ) {
136                isEnd = true;
137        }
138
139        /**
140         * キューをエラーの状態に更新します。
141         *
142         * @param       queue   ExecQueueオブジェクト
143         */
144        @Override       // QueueManager
145        public void error( final ExecQueue queue ) {
146                isEnd = true;
147                errMsg = queue.getMsg();
148        }
149
150        /**
151         * 処理が完了してするまでスレッドを待ち状態にします。
152         * エラーが発生した場合は、例外が発生します。
153         * また、REPORT_DAEMON_TIMEOUTで指定された期間処理が終了しない場合は、
154         * タイムアウトエラーとなります。
155         *
156         */
157        public void waitExec() {
158                final long start = System.currentTimeMillis();
159                while( true ) {
160                        if( isEnd ) {
161                                if( errMsg == null ) {
162                                        break;
163                                }
164                                else {
165                                        throw new HybsSystemException( errMsg );
166                                }
167                        }
168
169                        if( (int)(System.currentTimeMillis() - start) > timeout * 1000 ) {
170                                throw new HybsSystemException( "帳票処理でタイムアウトになりました" );
171                        }
172//                      try {
173//                              Thread.sleep( 100 );
174//                      }
175//                      catch( final InterruptedException ex ) { }
176                        try { Thread.sleep( 100 ); } catch( final InterruptedException ignored ) {}     // 8.5.4.2 (2024/01/12) PMD 7.0.0 EmptyCatchBlock
177                }
178        }
179
180        /**
181         * 帳票IDを設定します。
182         *
183         * @param listId 帳票ID
184         */
185        public final void setListId( final String listId ) {
186                this.listId = listId;
187        }
188
189        /**
190         * 言語を設定します。
191         *
192         * @param lang 言語
193         */
194        public void setLang( final String lang ) {
195                this.lang = lang;
196        }
197
198        /**
199         * 出力ファイル名を設定します。
200         *
201         * @param outputName 出力ファイル名
202         */
203        public final void setOutputName( final String outputName ) {
204                this.outputName = outputName;
205        }
206
207        /**
208         * 実行方法を設定します。
209         *
210         * @param outputType 実行方法
211         */
212        public final void setOutputType( final String outputType ) {
213                this.outputType = outputType;
214        }
215
216        /**
217         * 雛形ファイル名を設定します。
218         *
219         * @param templateName 雛形ファイル名
220         */
221        public final void setTemplateName( final String templateName ) {
222                this.templateName = templateName;
223        }
224
225        /**
226         * 出力先のプリンタ名を設定します。
227         *
228         * @param       printerName     出力先のプリンタ名
229         */
230        public final void setPrinterName( final String printerName ) {
231                this.printerName = printerName;
232        }
233
234        /**
235         * ローカルリソースの使用可否を設定します。
236         *
237         * @param fglocal 使用可否[true/false]
238         */
239        public void setFglocal( final boolean fglocal ) {
240                this.fglocal = fglocal;
241        }
242
243        /**
244         * ページエンドカットを行うかを設定します。
245         *
246         * @param fgcut ページエンドカットの使用可否[true:使用/false:通常]
247         */
248        public void setFgcut( final boolean fgcut ) {
249                this.fgcut = fgcut;
250        }
251
252        /**
253         * PAGEBREAKカラムの値を、シート名として使うかどうかをセットします(初期値:false)。
254         *
255         * @og.rev 5.7.6.2 (2014/05/16) 新規追加
256         *
257         * @param useSheetName PAGEBREAKカラムのシート名使用可否[true:使用/false:使用しない]
258         */
259        public void setUseSheetName( final boolean useSheetName ) {
260                this.useSheetName = useSheetName;
261        }
262
263        /**
264         * ボディーのテーブルモデルを設定します。
265         *
266         * @param body DBTableModelオブジェクト
267         */
268        public void setBody( final DBTableModel body ) {
269                this.body = body;
270        }
271
272        /**
273         * ヘッダーのテーブルモデルを設定します。
274         *
275         * @param header DBTableModelオブジェクト
276         */
277        public void setHeader( final DBTableModel header ) {
278                this.header = header;
279        }
280
281        /**
282         * フッターのテーブルモデルを設定します。
283         *
284         * @param footer DBTableModelオブジェクト
285         */
286        public void setFooter( final DBTableModel footer ) {
287                this.footer = footer;
288        }
289}