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