    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.plugin.daemon;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.hayabusa.report.GE50Access;
    021import org.opengion.hayabusa.report.ReportProcessing;
    022import org.opengion.fukurou.util.LogWriter;
    023import org.opengion.fukurou.util.StringUtil;
    024import org.opengion.fukurou.util.HybsTimerTask;
    025import org.opengion.fukurou.util.ApplicationInfo;
    026import org.opengion.fukurou.db.DBUtil;
    027
    028import java.util.Map;
    029import java.util.HashMap;
    030import java.util.Date;
    031
    032/**
    033 * 【レポート出力】帳票要求テーブルを監視して、帳票処理プログラムを呼び出します。
    034 * このクラスは、HybsTimerTask を継承した タイマータスククラスです。
    035 * startDaemon() がタイマータスクによって、呼び出されます。
    036 *
    037 * @og.rev 4.3.4.4 (2009/01/01) プラグイン化
    038 * @og.group デーモン
    039 *
    040 * @version  4.0
    041 * @author   Kazuhiko Hasegawa
    042 * @since    JDK5.0,
    043 */
    044public class Daemon_Report extends HybsTimerTask {
    045        //* このプログラムのVERSION文字列を設定します。   {@value} */
    046        private static final String VERSION = "5.7.3.2 (2014/02/28)" ;
    047
    048        // 3.7.0.0 (2005/01/18) 複数同時デーモン時の、同一帳票IDは処理できない。
    049        // 実行中の帳票ID をセットする、static Map
    050        private static final Map<String,String> USE_LISTID = new HashMap<String,String>();
    051
    052        // 3.8.5.0 (2006/03/06) EXCELをオープンするファイル名に要求番号を使う場合は、true
    053        private static final boolean EXCEL_NAME_USE_YKNO = HybsSystem.sysBool( "REPORT_EXCEL_NAME_USE_YKNO" );
    054
    055        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    056        private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE";
    057        private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR";
    058
    059        // 3.7.0.0 (2005/01/18) GE53 に DMN_GRP追加による、検索条件の変更
    060        // 5.1.0.0 (2009/11/04) OUTDIR ⇒ OUT_DIR , OUTFILE ⇒ OUT_FILE
    061        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    062        private static final String GE50_SELECT =
    063                "SELECT A.SYSTEM_ID,A.YKNO,A.GROUPID,A.LISTID,A.JOKEN,A."+OUT_DIR+",A."+OUT_FILE+",A.USRSET" +
    064                " FROM GE50 A,GE53 B" +
    065                " WHERE A.SYSTEM_ID = B.SYSTEM_ID" +
    066                " AND A.JOKEN = B.JOKEN" +
    067                " AND A.FGJ = '1'" +
    068                " AND B.FGJ = '1'" +
    069                " AND A.FGKAN = '1'" ;
    070
    071        private ReportProcessing  rc    = null;
    072
    073        //       3.5.4.9 (2004/02/25) メッセージ出力時のループカウント を追加
    074        private int                     loopCnt         = 0;
    075        private static final int LOOP_COUNTER = 24;             // カウンタを24回に設定
    076
    077        // 3.7.0.0 (2005/01/18) GE53 に DMN_GRP追加による、検索条件の変更
    078        private String GE_SELECT = null;
    079
    080        // 3.8.5.0 (2006/03/06) プリンタIDが、引数から渡される場合の対応
    081        private String PRTID    = null;
    082        // 3.8.5.0 (2006/03/06) デーモン名を設定します。
    083        private String DMN_NAME = null;
    084        // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加します。
    085        private boolean debug = false;          // 小文字に修正
    086
    087        // 3.8.5.3 (2006/06/30) タイマータスクがキャンセルされた場合の停止フラグ
    088        private boolean running = true;
    089
    090        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    091        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    092
    093        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    094        private ApplicationInfo appInfo;
    095        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    096
    097        /**
    098         * このタイマータスクによって初期化されるアクションです。
    099         * パラメータを使用した初期化を行います。
    100         *
    101         * @og.rev 3.6.0.7 (2004/11/12) 新規追加
    102         * @og.rev 3.7.0.0 (2005/01/18) 帳票定義マスタ(GE54)を参照するように仕様変更
    103         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    104         * @og.rev 4.0.1.0 (2007/12/19) GE50の検索順をシステムリソースで設定可能にする
    105         * @og.rev 5.7.3.2 (2014/02/28) GE53の検索条件修正
    106         */
    107        @Override
    108        public void initDaemon() {
    109
    110                // 3.7.0.0 (2005/01/18) GE50, GE54 の USRUPD に、デーモン名をセットします。
    111                // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    112
    113                // 3.8.5.0 (2006/03/06) デーモン名を設定します。
    114                DMN_NAME = getName();
    115
    116                StringBuilder buf = new StringBuilder();
    117                buf.append( GE50_SELECT );
    118
    119                // SYSTEM_ID は、指定がなければ、全件検索対象になります。
    120                String systemId = getValue( "SYSTEM_ID" );
    121                if( ! StringUtil.isNull( systemId ) ) {
    122                        buf.append( " AND A.SYSTEM_ID='" ).append( systemId ).append( "'" );
    123                }
    124
    125                // 3.8.5.0 (2006/03/06) DMN_GRP は、必須指定
    126                // 5.1.9.0 (2010/08/01) Avoid if (x != y) ..; else ..;
    127                String dmnGroup = getValue( "DMN_GRP" );
    128                if( StringUtil.isNull( dmnGroup ) ) {
    129                        String errMsg = "デーモングループは必須指定です。" ;
    130                        throw new HybsSystemException( errMsg );
    131                }
    132                else {
    133                        buf.append( " AND B.DMN_GRP='" ).append( dmnGroup ).append( "'" );
    134                }
    135
    136                // 3.8.5.0 (2006/03/06) GE50 の検索条件に、MODBASE と MODNO を使用する。
    137                // デーモン起動時に 最大数(MODBASE)と余り番号(MODNO)を渡します。
    138                // 最大数(MODBASE)を元に、検索時に、YKNOの余りを求め、これが、
    139                // 引数の余り番号(MODNO)と一致する場合のみ、処理をします。
    140                String modBase  = StringUtil.nval( getValue( "MODBASE" ),null );
    141                String modNo    = StringUtil.nval( getValue( "MODNO" ),null );
    142                if( modBase != null && modNo != null ) {
    143                        buf.append( " AND MOD(A.YKNO," ).append( modBase ).append( ")=" ).append( modNo );
    144                }
    145
    146                // 3.8.5.0 (2006/03/06) PRTID が指定されていれば、その値を使用する。なければ NULL
    147                PRTID = StringUtil.nval( getValue( "PRTID" ), null );
    148
    149                // 3.8.5.0 (2006/03/06) PRT_GRP が指定されていれば、振分条件検索時に使用する。
    150                String prtGgrp = getValue( "PRT_GRP" );
    151                if( ! StringUtil.isNull( prtGgrp ) ) {
    152                        buf.append( " AND B.PRTID='" ).append( prtGgrp ).append( "'" ); // 5.7.3.2 (2014/02/28) GE53ではPRTIDにPRI_GRPが指定されている
    153                }
    154
    155                buf.append( " ORDER BY " ); // 4.0.1.0 (2007/12/19)
    156                buf.append( HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" ) );
    157
    158                GE_SELECT = buf.toString() ;
    159
    160                // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加します。
    161                debug = StringUtil.nval( getValue( "DEBUG" ),debug ) ;
    162
    163                if( debug ) {
    164                        System.out.println( "DMN_NAME=[" + DMN_NAME + "]" );
    165                        System.out.println( "MODNO=[" + modNo + "]" );
    166                        System.out.println( "QUERY=[" + GE_SELECT + "]" );
    167                        System.out.println( "EXCEL_NAME_USE_YKNO=[" + EXCEL_NAME_USE_YKNO + "]" );
    168                }
    169
    170                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    171                if( USE_DB_APPLICATION_INFO ) {
    172                        appInfo = new ApplicationInfo();
    173                        // ユーザーID,IPアドレス,ホスト名
    174                        appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    175                        // 画面ID,操作,プログラムID
    176                        appInfo.setModuleInfo( "ReportDaemon",PRTID,DMN_NAME );
    177                }
    178                else {
    179                        appInfo = null;
    180                }
    181        }
    182
    183        /**
    184         * タイマータスクのデーモン処理の開始ポイントです。
    185         *
    186         * @og.rev 3.5.2.0 (2003/10/20) vals 変数を、ローカルに移動
    187         * @og.rev 3.5.4.8 (2004/02/23) タイムスタンプを、１０回に１回とする。
    188         * @og.rev 3.6.0.0 (2004/09/17) タイムスタンプを、２４回に１回とする。
    189         * @og.rev 3.6.1.0 (2005/01/05) tyr ～ catch を Exception から Throwable に変更。
    190         * @og.rev 3.7.0.0 (2005/01/18) 複数同時デーモンでも、同一帳票IDは処理できない為、スキップします。
    191         * @og.rev 3.7.0.4 (2005/03/18) エラー発生時に vals が null なら、HybsSystemException を throw する。
    192         * @og.rev 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    193         * @og.rev 3.8.0.0 (2005/06/07) EXCEL 取込時の完成フラグは、FG_DBIN とします。
    194         * @og.rev 3.8.0.0 (2005/06/07) rc.execute() 実行結果を boolean ではなく、文字列(FGKAN_XX)で返します。
    195         * @og.rev 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。
    196         * @og.rev 3.8.5.2 (2006/05/31) DEBUG 情報の強化
    197         * @og.rev 3.8.6.0 (2006/06/30) タイマータスクがキャンセルされた場合の処理を追加(running フラグ)
    198         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    199         * @og.rev 5.3.0.0 (2010/12/01) エラーハンドリングを修正
    200         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    201         * @og.rev 5.7.0.4 (2013/11/29) listIdをGE50Accessに渡すようにする
    202         */
    203        @Override
    204        protected void startDaemon() {
    205                if( loopCnt % LOOP_COUNTER == 0 ) {
    206                        loopCnt = 1;
    207                        System.out.println();
    208                        System.out.print( toString() + " " + new Date()  + " " );
    209                }
    210                else {
    211                        System.out.print( "." );
    212                        loopCnt++ ;
    213                }
    214
    215                // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    216                GE50Access ge50 = null ;
    217
    218                int row = 0;
    219                String[][] vals  = null;
    220                try {
    221                        vals = DBUtil.dbExecute( GE_SELECT,null,appInfo, DBID );        // 5.5.5.1 (2012/08/07)
    222                        if( vals != null && vals.length > 0 ) {
    223
    224                                // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    225                                // 毎回 オブジェクトを構築します。登録日付が初期化されます。
    226                                ge50 = new GE50Access( null,null,DMN_NAME ) ;           // 3.8.5.0 (2006/03/06)
    227
    228                                if( rc == null ) { rc = new ReportProcessing(); }
    229                                // 3.8.6.0 (2006/06/30) タイマータスクがキャンセルされた場合の処理を追加(running フラグ)
    230                                for( row=0; running && row<vals.length; row++ ) {
    231                                        // 3.7.0.0 (2005/01/18) 使用中の帳票IDのチェックと、使用時の登録
    232                                        String systemId = vals[row][0] ;
    233                                        String ykno     = vals[row][1] ;
    234                                        String listId   = vals[row][3] ;
    235                                        // 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。
    236                                        if( ! EXCEL_NAME_USE_YKNO ) {
    237                                                synchronized( USE_LISTID ) {
    238                                                        if( USE_LISTID.get( listId ) != null ) {
    239                                                                continue;       // 使用中なら、飛ばす。
    240                                                        }
    241                                                        else {
    242                                                                USE_LISTID.put( listId,"DUMMY" );
    243                                                        }
    244                                                }
    245                                        }
    246
    247                                        // デバッグ情報を出力します。
    248                                        if( debug ) {
    249                                                System.out.println();
    250                                                System.out.print( "[" + DMN_NAME + "]:[" + ykno + "] START = " );
    251                                                System.out.println( new Date() );
    252                                        }
    253
    254                                        // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    255                                        ge50.setSystemId( systemId );
    256                                        ge50.setYkno( ykno );
    257                                        ge50.updateGE50( GE50Access.FG_RUN );
    258
    259                                        ge50.setListId( listId ); // 5.7.0.4 (2013/11/29)
    260
    261                                        // system_id,ykno,groupid,listid,joken,outdir,outfile,usrset
    262                                        rc.setSystemId( systemId     );
    263                                        rc.setYkno(     ykno         );
    264                                        rc.setGroupId(  vals[row][2] );
    265                                        rc.setListId(   listId       );
    266                                        rc.setJoken(    vals[row][4] );
    267                                        rc.setPrtId(    PRTID        ); // 4.3.4.4 (2009/01/01) メソッド名変更
    268                                        rc.setOutDir(   vals[row][5] );
    269                                        rc.setOutFile(  vals[row][6] );
    270                                        rc.setDebug(    debug        ); // 3.8.5.0 (2006/03/06) DEBUGを追加。
    271
    272                                        // 3.8.0.0 (2005/06/07) 実行結果を boolean ではなく、文字列(FGKAN_XX)で返します。
    273                                        String fgkan = rc.execute();
    274                                        if( fgkan == null ) {
    275                                                fgkan = GE50Access.FG_ERR2 ;
    276                                                String errMsg = rc.getErrMsg();
    277                                                // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    278                                                ge50.insertErrorGE56( errMsg );
    279                                        }
    280
    281                                        // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    282                                        ge50.updateGE50( fgkan );
    283
    284                                        rc.clear();
    285                                        // 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。
    286                                        if( ! EXCEL_NAME_USE_YKNO ) {
    287                                                // 3.7.0.0 (2005/01/18) 使用中の帳票IDの削除
    288                                                synchronized( USE_LISTID ) {
    289                                                        USE_LISTID.remove( listId );
    290                                                }
    291                                        }
    292
    293                                        // デバッグ情報を出力します。
    294                                        if( debug ) {
    295                                                System.out.println();
    296                                                System.out.print( "[" + DMN_NAME + "]:[" + ykno + "] END = " );
    297                                                System.out.println( new Date() );
    298                                        }
    299                                }
    300                        }
    301                }
    302                // 5.3.0.0 (2010/12/01) エラーハンドリングを修正
    303                catch( Throwable ex ) {         // 3.6.1.0 (2005/01/05)
    304                        rc = null;
    305
    306                        String errMsg = StringUtil.stringStackTrace( ex ) ;
    307                        System.out.println( errMsg );
    308                        LogWriter.log( errMsg );
    309
    310                        if( ! EXCEL_NAME_USE_YKNO ) {
    311                                // 3.7.0.0 (2005/01/18) エラー発生時の、使用中の帳票IDの削除
    312                                synchronized( USE_LISTID ) {
    313                                        USE_LISTID.remove( vals[row][3] );              // listId
    314                                }
    315                        }
    316
    317                        // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。
    318                        if( ge50 != null ) {
    319                                ge50.insertErrorGE56( errMsg );
    320                                ge50.updateGE50( GE50Access.FG_ERR1 );
    321                        }
    322
    323                        // 3.7.0.4 (2005/03/18) vals が null なら、DB接続エラーが濃厚
    324                        if( vals == null ) {
    325                                errMsg += "(vals == null)" ;
    326                                System.out.println( errMsg );
    327                                LogWriter.log( errMsg );
    328                                throw new HybsSystemException( ex );
    329                        }
    330                }
    331        }
    332
    333        /**
    334         * このタイマータスクのcancel() メソッドをオーバーライドします。
    335         * HybsTimerTaskManager#cancelTask( int ) を実行します。
    336         *
    337         * @og.rev 3.8.5.3 (2006/06/30) 新規追加
    338         *
    339         * @return      スケジュールされている 1 回以上実行されない場合に true
    340         * @see java.util.TimerTask#cancel()
    341         */
    342        @Override
    343        public boolean cancel() {
    344                running = false;
    345                return super.cancel();
    346        }
    347}