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