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 java.util.Arrays;
019    import java.util.Date;
020    import java.util.LinkedHashMap;
021    import java.util.LinkedHashSet;
022    import java.util.Map;
023    import java.util.Set;
024    
025    import org.opengion.fukurou.db.DBUtil;
026    import org.opengion.fukurou.mail.MailTX;
027    import org.opengion.fukurou.transfer.TransferConfig;
028    import org.opengion.fukurou.transfer.TransferProcess;
029    import org.opengion.fukurou.util.ApplicationInfo;
030    import org.opengion.fukurou.util.HybsTimerTask;
031    import org.opengion.fukurou.util.LogWriter;
032    import org.opengion.fukurou.util.StringUtil;
033    import org.opengion.hayabusa.common.HybsSystem;
034    import org.opengion.hayabusa.common.HybsSystemException;
035    
036    /**
037     * ã€ä¼é?シスãƒ?ƒ ã€‘å„èª­å–æ–¹æ³•ã?実行方法ã«å¿œã˜ã¦ä¼é?処ç?‚’行ã†ãŸã‚ã®ãƒ??モンã§ã™ã?
038     *
039     * 読å–ã?åŠã?実行ã«ãŠã‘ã‚‹å?体的ãªå‡¦ç?«ã¤ã?¦ã¯ã€{@link org.opengion.fukurou.transfer}パッケージå†??
040     * å?®Ÿè£?‚¯ãƒ©ã‚¹ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç?ã—ã¦ä¸‹ã•ã??
041     *
042     * ãªãŠã?å??ç??実行ã«ã¤ã?¦ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã€èª­å–対象ã®å˜ä½ã«ãªã‚Šã¾ã™ã?
043     * åŒã˜èª­å–対象ã§ã€ç•°ãªã‚‹å®Ÿè¡Œæ–¹æ³•ã?実行対象を定義ã—ãŸå ´åˆã?åŒã˜ãƒ??ã‚¿ã«å¯¾ã—ã¦è¤?•°å›žå?ç?Œè¡Œã‚れã¾ã™ã?
044     * ã—ã‹ã—ã?ã“ã?å ´åˆã«ãŠã„ã¦ã‚‚ã?トランザクションã¯èª­å–対象ã®å˜ä½ã§ç”Ÿæ?ã•れるãŸã‚ã?è¤?•°å›žã?処ç??å†??
045     * 1回ã§ã‚‚エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ã€åŒã˜èª­å–対象ã§ãれã¾ã§ã«å‡¦ç?—ãŸå?ã«ã¤ã?¦ã‚‚rollbackã•れã¾ã™ã?
046     *
047     * 発生ã—ãŸã‚¨ãƒ©ãƒ¼ã‚’メールã§é€šçŸ¥ã™ã‚‹å ´åˆã?以下ã?設定を行ã†å¿?¦ãŒã‚りã¾ã™ã?
048     * [シスãƒ?ƒ ãƒªã‚½ãƒ¼ã‚¹]
049     *  COMMON_MAIL_SERVER
050     *  ERROR_MAIL_FROM_USER
051     * [ä¼é?定義マスタ]
052     *  エラーé€ä¿¡å…?
053     * ※ä¼é?å®šç¾©ãƒžã‚¹ã‚¿èª­å–æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå?åˆã?ã€ã‚·ã‚¹ãƒ?ƒ ãƒªã‚½ãƒ¼ã‚¹ã®"ERROR_MAIL_TO_USERS"ã§
054     *   設定ã•ãˆãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãƒ¡ãƒ¼ãƒ«ãŒé?ä¿¡ã•れã¾ã™ã?
055     *
056     * ※処ç?¸­ã«ä½•らã‹ã?エラーã?度ã§ã‚‚発生ã—ãŸå?åˆã?ã“ã?ãƒ??モンã¯åœæ­¢ã—ã¾ã™ã?
057     *
058     * ã“ã?クラスã¯ã€HybsTimerTask を継承ã—㟠タイマã?タスククラスã§ã™ã?
059     * startDaemon() ãŒã‚¿ã‚¤ãƒžã?タスクã«ã‚ˆã£ã¦ã€å‘¼ã³å‡ºã•れã¾ã™ã?
060     *
061     * @og.rev 5.4.1.0 (2011/11/01) ä¼é?シスãƒ?ƒ å¯¾å¿?
062     * @og.group �?モン
063     *
064     * @version  5.0
065     * @author   Hiroki Nakamura
066     * @since    JDK6.0,
067     */
068    public class Daemon_Transfer extends HybsTimerTask {
069            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
070            private static final String VERSION = "5.4.1.0 (2011/11/01)" ;
071    
072            // ä¼é?定義マスタ検索用SQL
073            private static final String GE62_SELECT =
074                    "SELECT A.KBREAD,A.READOBJ,A.READPRM,A.KBEXEC,A.EXECDBID,A.EXECOBJ,A.EXECPRM,A.ERROR_SENDTO" +
075                    " FROM GE62 A" +
076                    " WHERE A.FGJ = '1'";
077    
078            // コãƒã‚¯ã‚·ãƒ§ãƒ³ã«ã‚¢ãƒ—リケーションæƒ??を追記ã™ã‚‹ã‹ã©ã?‹æŒ?®?
079            private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
080    
081            // HTTP接続時ã®ãƒ—ロキシホスãƒ?
082            private static final String HTTP_PROXY_HOST = HybsSystem.sys( "HTTP_PROXY_HOST" );
083    
084            // HTTP接続時ã®ãƒ—ロキシãƒã?ãƒ?
085            private static final int HTTP_PROXY_PORT = HybsSystem.sysInt( "HTTP_PROXY_PORT" );
086    
087            // 呼ã³å‡ºã—å?ホストコーãƒ?
088            private static final String HFROM = HybsSystem.sys( "TRANSFER_HOST_CODE" );
089    
090            // ループカウンタã‚?4回ã«è¨­å®?
091            private static final int LOOP_COUNTER = 24;
092    
093            private boolean running = true;
094            private int loopCnt             = 0;
095    
096            private String ge62Select = null;
097            private String dmnName = null;
098    
099            private ApplicationInfo appInfo = null;
100            private boolean debug = false;
101    
102            protected final String DBID = HybsSystem.sys( "RESOURCE_DBID" );                // 5.5.5.1 (2012/08/07) リソース系DBID 付ã‘忘れ対å¿?
103    
104            /**
105             * ã“ã?タイマã?タスクã«ã‚ˆã£ã¦åˆæœŸåŒ–ã•れるアクションã§ã™ã?
106             * パラメータを使用ã—ãŸåˆæœŸåŒ–を行ã„ã¾ã™ã?
107             *
108             */
109            @Override
110            public void initDaemon() {
111                    debug = StringUtil.nval( getValue( "DEBUG" ),debug );
112    
113                    dmnName = getName();
114    
115                    StringBuilder buf = new StringBuilder();
116                    buf.append( GE62_SELECT );
117    
118                    // シスãƒ?ƒ IDã¯å¿??æŒ?®?
119                    String systemId = getValue( "SYSTEM_ID" );
120                    if( StringUtil.isNull( systemId ) ) {
121                            String errMsg = "シスãƒ?ƒ ID方法ã?å¿??æŒ?®šã§ã™ã?" ;
122                            throw new HybsSystemException( errMsg );
123                    }
124                    else {
125                            buf.append( " AND A.SYSTEM_ID='" ).append( systemId ).append( "'" );
126                    }
127    
128                    // èª­å–æ–¹æ³•ã?å¿??æŒ?®?
129                    String kbRead = getValue( "KBREAD" );
130                    if( StringUtil.isNull( kbRead ) ) {
131                            String errMsg = "èª­å–æ–¹æ³•ã?å¿??æŒ?®šã§ã™ã?" ;
132                            throw new HybsSystemException( errMsg );
133                    }
134                    else {
135                            buf.append( " AND A.KBREAD='" ).append( kbRead ).append( "'" );
136                    }
137    
138                    // ãƒ??モングループã?å¿??æŒ?®?
139                    String dmnGroup = getValue( "DMN_GRP" );
140                    if( StringUtil.isNull( dmnGroup ) ) {
141                            String errMsg = "ãƒ??モングループã?å¿??æŒ?®šã§ã™ã?" ;
142                            throw new HybsSystemException( errMsg );
143                    }
144                    else {
145                            buf.append( " AND A.DMN_GRP='" ).append( dmnGroup ).append( "'" );
146                    }
147    
148                    buf.append( " ORDER BY A.READOBJ,A.KBEXEC,A.EXECOBJ" );
149    
150                    ge62Select = buf.toString() ;
151    
152                    if( debug ) {
153                            System.out.println( "DMN_NAME=[" + dmnName + "]" );
154                            System.out.println( "QUERY=[" + ge62Select + "]" );
155                    }
156    
157                    if( USE_DB_APPLICATION_INFO ) {
158                            appInfo = new ApplicationInfo();
159                            // ユーザーID,IPアドレス,ホストå
160                            appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
161                            // ç”»é¢ID,æ“ä½?プログラãƒ?D
162                            appInfo.setModuleInfo( "TransferDaemon",dmnName,dmnName );
163                    }
164                    else {
165                            appInfo = null;
166                    }
167            }
168    
169            /**
170             * タイマã?タスクã®ãƒ??モン処ç??é–‹å§‹ã?イントã§ã™ã?
171             *
172             * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付ã‘忘れ対ç­?
173             */
174            @Override
175            protected void startDaemon() {
176                    if( loopCnt % LOOP_COUNTER == 0 ) {
177                            loopCnt = 1;
178                            System.out.println();
179                            System.out.print( toString() + " " + new Date()  + " " );
180                    }
181                    else {
182                            System.out.print( "." );
183                            loopCnt++ ;
184                    }
185    
186                    // ä¼é?DB読å?
187                    String[][] vals  = null;
188                    GE62Data ge62Data = new GE62Data();
189                    try {
190    //                      vals = DBUtil.dbExecute( ge62Select,null,appInfo );
191                            vals = DBUtil.dbExecute( ge62Select,null,appInfo,DBID );                // 5.5.5.1 (2012/08/07)
192                            if( vals != null && vals.length > 0 ) {
193                                    for( int row=0; running && row<vals.length; row++ ) {
194                                            ge62Data.addData( vals[row] );
195                                    }
196                            }
197                    }
198                    catch( Throwable ex ) {
199                            String header = "ä¼é?読å–エラー?šDMN_NAME=[" + dmnName + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "] , QUERY=[" + ge62Select + "]";
200                            String errMsg = header + HybsSystem.CR + StringUtil.stringStackTrace( ex ) ;
201                            System.out.println( errMsg );
202                            LogWriter.log( errMsg );
203                            String errorSendto = HybsSystem.sys( "ERROR_MAIL_TO_USERS" );
204                            sendMail( header, errMsg, errorSendto );
205                    }
206    
207                    // 処ç?®Ÿè¡?
208                    // 読å–対象ã®å˜ä½ã§å‡¦ç?‚’実行ã—ã¾ã™ã?(トランザクションもã“ã®å˜ä½ã«ãªã‚Šã¾ã?
209                    for( String tranKey : ge62Data.getTranSet() ) {
210                            TransferProcess proc = null;
211                            try {
212                                    proc = new TransferProcess( ge62Data.getConfSet( tranKey ) );
213                                    proc.setDmnName( dmnName );
214                                    proc.setAppInfo( appInfo );
215                                    if( debug ) {
216                                            proc.setDebug();
217                                    }
218    
219                                    proc.process();
220                            }
221                            catch( Throwable ex ) {
222                                    // エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ãƒ??ãƒ¢ãƒ³ã‚’åœæ­¢ã—ã¾ã™ã?
223                                    cancel();
224    
225                                    // æœ?¾Œã«å‡¦ç?—ãŸä¼é?設定オブジェクトを下ã«ã‚¨ãƒ©ãƒ¼ã‚’å?力ã—ã¾ã™ã?
226                                    String header = "ä¼é?エラー?šDMN_NAME=[" + dmnName + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]";
227                                    String errorSendto = null;
228                                    if( proc != null ) {                            // 5.5.2.6 (2012/05/25) findbugs対�
229                                            TransferConfig config = proc.getLastConfig();
230                                            if( config != null ) {
231                                                    header += " , CONFIG=[" + config.toString() + "]";
232                                                    errorSendto = config.getErrorSendto();
233                                            }
234                                    }
235    
236                                    String errMsg = header + HybsSystem.CR + StringUtil.stringStackTrace( ex ) ;
237                                    System.out.println( errMsg );
238                                    LogWriter.log( errMsg );
239                                    sendMail( header, errMsg, errorSendto );
240                            }
241                    }
242            }
243    
244            /**
245             * ã“ã?タイマã?タスクã®cancel() メソãƒ?ƒ‰ã‚’オーãƒã?ライドã—ã¾ã™ã?
246             * HybsTimerTaskManager#cancelTask( int ) を実行ã—ã¾ã™ã?
247             *
248             * @return      スケジュールã•れã¦ã?‚‹ 1 回以上実行ã•れãªã??åˆã« true
249             * @see java.util.TimerTask#cancel()
250             */
251            @Override
252            public boolean cancel() {
253                    running = false;
254                    return super.cancel();
255            }
256    
257            /**
258             * エラーæƒ??ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã‚’行ã„ã¾ã™ã?
259             * エラーメールã¯ã€ã‚·ã‚¹ãƒ?ƒ ãƒ‘ラメータ ã® COMMON_MAIL_SERVER(メールサーãƒã?)ã¨
260             * ERROR_MAIL_FROM_USER(エラーメール発信å…?ã¨ã€ERROR_MAIL_TO_USERS(エラーメールå—ä¿¡è€?
261             * ãŒã™ã¹ã¦è¨­å®šã•れã¦ã?‚‹å ´åˆã«ã€??ä¿¡ã•れã¾ã™ã?
262             *
263             * @param       inHeader        ヘッãƒ??メãƒ?‚»ãƒ¼ã‚¸
264             * @param       inErrMsg        エラーメãƒ?‚»ãƒ¼ã‚¸
265             * @param       errorSendto     エラーé€ä¿¡å…?
266             */
267            protected void sendMail( final String inHeader, final String inErrMsg, final String errorSendto ) {
268    
269                    String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
270                    String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
271    //              String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
272                    String[] to = StringUtil.csv2Array( errorSendto );
273    
274                    if( host != null && from != null && to.length > 0 ) {
275                            try {
276                                    MailTX tx = new MailTX( host );
277                                    tx.setFrom( from );
278                                    tx.setTo( to );
279                                    tx.setSubject( inHeader );
280                                    tx.setMessage( inErrMsg );
281                                    tx.sendmail();
282                            }
283                            catch( Throwable ex ) {
284                                    String errMsg = "エラー時メールé€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸã€? + HybsSystem.CR
285                                                            + " SUBJECT:" + inHeader                                + HybsSystem.CR
286                                                            + " HOST:" + host                                               + HybsSystem.CR
287                                                            + " FROM:" + from                                               + HybsSystem.CR
288                                                            + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
289                                                            + ex.getMessage();
290                                    LogWriter.log( errMsg );
291                                    LogWriter.log( ex );
292                            }
293                    }
294            }
295    
296            /**
297             * ä¼é?定義マスタã‹ã‚‰èª­ã¿å‡ºã—ãŸãƒ??タを管ç?—ã¾ã™ã?
298             */
299            private static class GE62Data {
300    
301                    // トランザクションを生æˆã™ã‚‹ã‚­ãƒ¼ã®ã‚»ãƒ?ƒˆ(読å–対象å˜ä½?
302                    private final Set<String> tranSet = new LinkedHashSet<String>();
303                    // トランザクションキー(読å–対象)ã«å¯¾ã™ã‚‹ã€è¨­å®šã‚ªãƒ–ジェクトã?ã‚»ãƒ?ƒˆ
304                    private final Map<String,Set<TransferConfig>> tran2ConfSet = new LinkedHashMap<String,Set<TransferConfig>>();
305    
306                    /**
307                     * GE62読å–データを追åŠ?—ã¾ã™ã?
308                     *
309                     * @param data GE62読å–データ
310                     */
311                    private void addData( final String[] data ) {
312                            String kbRead           = data[0];
313                            String readObj          = data[1];
314                            String readPrm          = data[2];
315                            String kbExec           = data[3];
316                            String execDbid         = data[4];
317                            String execObj          = data[5];
318                            String execPrm          = data[6];
319                            String errorSendto      = data[7];
320    
321                            String tranKey = readObj;
322                            tranSet.add( tranKey );
323    
324                            Set<TransferConfig> confSet = tran2ConfSet.get( tranKey );
325                            if( confSet == null ) {
326                                    confSet = new LinkedHashSet<TransferConfig>();
327                            }
328                            TransferConfig conf = new TransferConfig(
329                                                                                    kbRead, readObj, readPrm
330                                                                                    , kbExec, execDbid, execObj, execPrm
331                                                                                    , errorSendto, HFROM, HTTP_PROXY_HOST, HTTP_PROXY_PORT );
332                            confSet.add( conf );
333                            tran2ConfSet.put( tranKey, confSet );
334                    }
335    
336                    /**
337                     * トランザクション生æ?キー(読å–対象)ã®ã‚»ãƒ?ƒˆã‚’è¿”ã—ã¾ã™ã?
338                     *
339                     * @return トランザクション生æ?キー(読å–対象)ã®ã‚»ãƒ?ƒˆ
340                     */
341                    private Set<String> getTranSet() {
342                            return tranSet;
343                    }
344    
345                    /**
346                     * トランザクション生æ?キー(読å–対象)ã«å¯¾ã™ã‚‹è¨­å®šã‚ªãƒ–ジェクトã?ã‚»ãƒ?ƒˆã‚’è¿”ã—ã¾ã™ã?
347                     *
348                     * @param tranKey トランザクション生æ?キー(読å–対象)
349                     * @return 設定オブジェクトã?ã‚»ãƒ?ƒˆ
350                     */
351                    private Set<TransferConfig> getConfSet( final String tranKey ) {
352                            return tran2ConfSet.get( tranKey );
353                    }
354            }
355    }