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     */
016    package org.opengion.hayabusa.report2;
017    
018    import java.util.Random;
019    
020    import org.opengion.hayabusa.common.HybsSystem;
021    import org.opengion.hayabusa.common.HybsSystemException;
022    import 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     */
041    public 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 = false;
063            private String errMsg = null;
064    
065            /**
066             * 帳票処?ューを作?します?
067             *
068             * @og.rev 5.1.6.0 (2010/05/01) 要求単位にスレ?を生成するよ?します?
069             * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラ??値を?シート名として使?ど?をセ?しま?
070             */
071            public void create() {
072                    ExecQueue queue = new ExecQueue();
073                    queue.setSystemId( SYSTEM_ID );
074                    queue.setYkno( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) );
075                    queue.setListId( listId );
076                    queue.setLang( lang );
077                    queue.setOutputName( outputName );
078                    queue.setOutputType( outputType );
079                    // 5.1.6.0 (2010/05/01)
080                    queue.setThreadId( "DIRECT_" + Long.toString( RANDOM.nextLong() & 0x7fffffffffffffffL ) );
081                    queue.setTemplateName( templateName );
082                    queue.setPrinterName( printerName );
083                    queue.setFglocal( fglocal );
084                    queue.setFgcut( fgcut );
085                    queue.setUseSheetName( useSheetName );          // 5.7.6.2 (2014/05/16) PAGEBREAKカラ??値を?シート名として使?ど?をセ?しま?
086    
087                    queue.setBody( body );
088                    queue.setHeader( header );
089                    queue.setFooter( footer );
090    
091                    queue.setManager( this );
092    
093                    // 5.1.6.0 (2010/05/01)
094                    ExecThreadManager.insertQueueOnNewThread( queue );
095            }
096    
097            /**
098             * 帳票処?ータをキューにセ?します?
099             * 画面から発行する?合?、テーブルモ?を直接セ?するので?
100             * ここでは何もしません?
101             *
102             * @param       queue   ExecQueueオブジェク?
103             */
104            public void set( final ExecQueue queue ) {
105                    // 何もありません?PMD エラー回避)
106            }
107    
108            /**
109             * キューを実行中の状態に更新します?
110             * 画面から発行する?合?、実行中であることを知る?がな?め?
111             * ここでは何もしません?
112             *
113             * @param       queue   ExecQueueオブジェク?
114             */
115            public void execute( final ExecQueue queue ) {
116                    // 何もありません?PMD エラー回避)
117            }
118    
119            /**
120             * キューを完??状態に更新します?
121             *
122             * @param       queue   ExecQueueオブジェク?
123             */
124            public void complete( final ExecQueue queue ) {
125                    isEnd = true;
126            }
127    
128            /**
129             * キューをエラーの状態に更新します?
130             *
131             * @param       queue   ExecQueueオブジェク?
132             */
133            public void error( final ExecQueue queue ) {
134                    isEnd = true;
135                    errMsg = queue.getMsg();
136            }
137    
138            /**
139             * 処?完?てするまでスレ?を?状態にします?
140             * エラーが発生した?合?、例外が発生します?
141             * また?REPORT_DAEMON_TIMEOUTで?された期間処?終?な??合??
142             * タイ?ウトエラーとなります?
143             *
144             */
145            public void waitExec() {
146                    long start = System.currentTimeMillis();
147                    while( true ) {
148                            if( isEnd ) {
149                                    if( errMsg == null ) {
150                                            break;
151                                    }
152                                    else {
153                                            throw new HybsSystemException( errMsg );
154                                    }
155                            }
156    
157                            if( (int)(System.currentTimeMillis() - start) > timeout * 1000 ) {
158                                    throw new HybsSystemException( "帳票処?タイ?ウトになりました" );
159                            }
160                            try {
161                                    Thread.sleep( 100 );
162                            }
163                            catch( InterruptedException ex ) { }
164                    }
165            }
166    
167            /**
168             * 帳票IDを設定します?
169             *
170             * @param listId 帳票ID
171             */
172            public final void setListId( final String listId ) {
173                    this.listId = listId;
174            }
175    
176            /**
177             * ?を設定します?
178             *
179             * @param lang ??
180             */
181            public void setLang( final String lang ) {
182                    this.lang = lang;
183            }
184    
185            /**
186             * 出力ファイル名を設定します?
187             *
188             * @param outputName 出力ファイル?
189             */
190            public final void setOutputName( final String outputName ) {
191                    this.outputName = outputName;
192            }
193    
194            /**
195             * 実行方法を設定します?
196             *
197             * @param outputType 実行方?
198             */
199            public final void setOutputType( final String outputType ) {
200                    this.outputType = outputType;
201            }
202    
203            /**
204             * 雛形ファイル名を設定します?
205             *
206             * @param templateName 雛形ファイル?
207             */
208            public final void setTemplateName( final String templateName ) {
209                    this.templateName = templateName;
210            }
211    
212            /**
213             * 出力?のプリンタ名を設定します?
214             *
215             * @param       printerName     出力?のプリンタ?
216             */
217            public final void setPrinterName( final String printerName ) {
218                    this.printerName = printerName;
219            }
220    
221            /**
222             * ローカルリソースの使用可否を設定します?
223             *
224             * @param fglocal 使用可否[true/false]
225             */
226            public void setFglocal( final boolean fglocal ) {
227                    this.fglocal = fglocal;
228            }
229    
230            /**
231             * ペ?ジエンドカ?を行うかを設定します?
232             *
233             * @param fgcut ペ?ジエンドカ?の使用可否[true:使用/false:通常]
234             */
235            public void setFgcut( final boolean fgcut ) {
236                    this.fgcut = fgcut;
237            }
238    
239            /**
240             * PAGEBREAKカラ??値を?シート名として使?ど?をセ?しま?初期値:false)?
241             *
242             * @og.rev 5.7.6.2 (2014/05/16) 新規追?
243             *
244             * @param useSheetName PAGEBREAKカラ??シート名使用可否[true:使用/false:使用しない]
245             */
246            public void setUseSheetName( final boolean useSheetName ) {
247                    this.useSheetName = useSheetName;
248            }
249    
250            /**
251             * ボディーの??ブルモ?を設定します?
252             *
253             * @param body DBTableModelオブジェク?
254             */
255            public void setBody( final DBTableModel body ) {
256                    this.body = body;
257            }
258    
259            /**
260             * ヘッ??の??ブルモ?を設定します?
261             *
262             * @param header DBTableModelオブジェク?
263             */
264            public void setHeader( final DBTableModel header ) {
265                    this.header = header;
266            }
267    
268            /**
269             * フッターの??ブルモ?を設定します?
270             *
271             * @param footer DBTableModelオブジェク?
272             */
273            public void setFooter( final DBTableModel footer ) {
274                    this.footer = footer;
275            }
276    }