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.ArrayList;
019    import java.util.Date;
020    import java.util.HashMap;
021    import java.util.LinkedHashMap;
022    import java.util.LinkedHashSet;
023    import java.util.List;
024    import java.util.Map;
025    import java.util.Set;
026    
027    import org.opengion.fukurou.db.DBUtil;
028    import org.opengion.fukurou.db.Transaction;
029    import org.opengion.fukurou.db.TransactionReal;
030    import org.opengion.fukurou.transfer.TransferConfig;
031    import org.opengion.fukurou.transfer.TransferExec;
032    import org.opengion.fukurou.util.ApplicationInfo;
033    import org.opengion.fukurou.util.LogWriter;
034    import org.opengion.fukurou.util.StringUtil;
035    import org.opengion.hayabusa.common.HybsSystem;
036    import org.opengion.hayabusa.common.HybsSystemException;
037    
038    /**
039     * ã€ä¼é?シスãƒ?ƒ ã€‘æ—§ä¼é?DB(CB01)を監視ã—ã¦ã€å®Ÿè¡Œæ–¹æ³•ã«å¿œã˜ãŸå?ç??ログラãƒ?‚’呼ã³å‡ºã—ã¾ã™ã?
040     *
041     * ã“ã?ãƒ??モンã¯ã€ä¼é?定義マスタã®èª­å–方法ãŒã€æ—§ä¼é?DB読å?CB01)ã®å®šç¾©ã‚’対象ã¨ã—ã¦å®Ÿè¡Œã•れã¾ã™ã?
042     * 読å–対象ã¯ã€æ—§ä¼é?DB(CB01)ã§ã€ãƒ‡ãƒ¼ã‚¿ã‚³ãƒ¼ãƒ‰ã?é€ã‚Šå…ˆã?ãƒ?‚­ã‚¹ãƒˆç¨®åˆ¥ã€çжæ³?'1'ã‚’æ¡ä»¶ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã?
043     * ä¼é?定義マスタ上ã§ã¯ã€èª­å–対象ã«ã¦ã€ä»¥ä¸‹ã?å½¢å¼ã§å®šç¾©ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?
044     *   (ãƒ??タコーãƒ? (é€ã‚Šå…? (ãƒ?‚­ã‚¹ãƒˆç¨®åˆ¥)   ä¾?:"3 D9 B119"
045     * 処ç?®Ÿè¡Œå¾Œã?ã€èª­ã¿å–ã£ãŸã?ãƒ?ƒ€ãƒ¼ãƒ??ã‚¿ã®çжæ³ã‚’'2'ã«æ›´æ–°ã—ã¾ã™ã?
046     * ä½?—ã€èª­å–パラメーターã«"NOUPDATE"を指定ã—ãŸå?åˆã?処ç?¾Œã?æ›´æ–°ã¯è¡Œã‚れã¾ã›ã‚“ã€?
047     * ã¾ãŸã?エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ヘッãƒ??ãƒ??ã‚¿ã®çжæ³ã‚’'9'ã«æ›´æ–°ã—ã¾ã™ã?
048     *
049     * トランザクションã¯ã€èª­å–対象ã®å˜ä½ã«ãªã‚Šã¾ã™ã?
050     * åŒã˜èª­å–対象ã§ã€ç•°ãªã‚‹å®Ÿè¡Œæ–¹æ³•ã?実行対象を定義ã—ãŸå ´åˆã?åŒã˜ãƒ??ã‚¿ã«å¯¾ã—ã¦è¤?•°å›žå?ç?Œè¡Œã‚れã¾ã™ã?
051     * ã—ã‹ã—ã?ã“ã?å ´åˆã«ãŠã„ã¦ã‚‚ã?トランザクションã¯èª­å–対象ã®å˜ä½ã§ç”Ÿæ?ã•れるãŸã‚ã?è¤?•°å›žã?処ç??å†??
052     * 1回ã§ã‚‚エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ã€åŒã˜èª­å–対象ã§ãれã¾ã§ã«å‡¦ç?—ãŸå?ã«ã¤ã?¦ã‚‚rollbackã•れã¾ã™ã?
053     *
054     * ã¾ãŸã?ã“ã?ä¼é?ãƒ??モン(èª­å–æ–¹æ³?ã¯ã€æ—§ä¼é?DB(CB01)ã«å¯¾ã™ã‚‹ã‚¯ã‚¨ãƒªå›žæ•°ã‚’減らã™ãŸã‚ã?æ—§ä¼é?DB(CB01)ã¨
055     * ä¼é?定義マスタ(GE62)ã‚’JOINã—ã¦ä¸?‹¬ã§ãƒ??ã‚¿ã‚’å–å¾—ã—ã¦ã?¾ã™ã?
056     * ã“ã?ãŸã‚ã€ä»–ã?ä¼é?ãƒ??モン(èª­å–æ–¹æ³?ã¨ã¯èª­å–部åˆ??実è£?–¹æ³•ãŒç•°ãªã£ã¦ã?¾ã™ã?
057     * 具体的ã«ã¯ã€{@link org.opengion.fukurou.transfer.TransferRead}インターフェースを利用ã›ãšã«ã€?
058     * ã“ã?ãƒ??モン自体ã«èª­å–åŠã³ã‚¹ãƒ??タス更新ã®å‡¦ç?‚’実è£?—ã¦ã?¾ã™ã?
059     *
060     * ※処ç?¸­ã«ä½•らã‹ã?エラーã?度ã§ã‚‚発生ã—ãŸå?åˆã?ã“ã?ãƒ??モンã¯åœæ­¢ã—ã¾ã™ã?
061     *
062     * ã“ã?クラスã¯ã€HybsTimerTask を継承ã—㟠タイマã?タスククラスã§ã™ã?
063     * startDaemon() ãŒã‚¿ã‚¤ãƒžã?タスクã«ã‚ˆã£ã¦ã€å‘¼ã³å‡ºã•れã¾ã™ã?
064     *
065     * @og.rev 5.4.1.0 (2011/11/01) ä¼é?シスãƒ?ƒ å¯¾å¿?
066     * @og.group �?モン
067     *
068     * @version  5.0
069     * @author   Hiroki Nakamura
070     * @since    JDK6.0,
071     */
072    public class Daemon_Transfer_CB01 extends Daemon_Transfer {
073            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
074            private static final String VERSION = "5.4.1.0 (2011/11/01)" ;
075    
076            // 実行方法ã«å¯¾å¿œã™ã‚‹å®Ÿè£?‚¯ãƒ©ã‚¹ã®åŸºæº–å
077            private static final String EXEC_CLS_BASE = "org.opengion.fukurou.transfer.TransferExec_" ;
078    
079            // ä¼é?ãƒ??ã‚¿å–得用SQL(クエリ回数を減らã™ãŸã‚æ—§ä¼é?DBã¨ä¼é?定義マスタをJOINã—ã¦æ¤œç´¢)
080            private static final String GE62CB01_SELECT =
081                    "SELECT B.KBREAD,B.READOBJ,B.READPRM,B.KBEXEC,B.EXECDBID,B.EXECOBJ,B.EXECPRM,B.ERROR_SENDTO,A.HTCNO" +
082                    " FROM CB01 A,GE62 B" +
083                    " WHERE A.HCDD = SUBSTR(B.READOBJ,1,INSTR(B.READOBJ,' ',1,1)-1)" + // "3 D9 B119"ã®"3"
084                    " AND A.HTO    = RPAD(SUBSTR(B.READOBJ,INSTR(B.READOBJ,' ',1,1)+1,INSTR(B.READOBJ,' ',1,2)-INSTR(B.READOBJ,' ',1,1)-1),8)" + // "3 D9 B119"ã®"D9"
085                    " AND A.HSYU   = RPAD(SUBSTR(B.READOBJ,INSTR(B.READOBJ,' ',1,2)+1),4)" +  // "3 D9 B119"ã®"B119"
086                    " AND A.HCDJ = '1'" +
087                    " AND B.FGJ = '1'";
088    
089            // コãƒã‚¯ã‚·ãƒ§ãƒ³ã«ã‚¢ãƒ—リケーションæƒ??を追記ã™ã‚‹ã‹ã©ã?‹æŒ?®?
090            private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
091    
092            // HTTP接続時ã®ãƒ—ロキシホスãƒ?
093            private static final String HTTP_PROXY_HOST = HybsSystem.sys( "HTTP_PROXY_HOST" );
094    
095            // HTTP接続時ã®ãƒ—ロキシãƒã?ãƒ?
096            private static final int HTTP_PROXY_PORT = HybsSystem.sysInt( "HTTP_PROXY_PORT" );
097    
098            // 呼ã³å‡ºã—å?ホストコーãƒ?
099            private static final String HFROM = HybsSystem.sys( "TRANSFER_HOST_CODE" );
100    
101            // ループカウンタã‚?4回ã«è¨­å®?
102            private static final int LOOP_COUNTER = 24;
103    
104            private boolean running = true;
105            private int loopCnt             = 0;
106    
107            private String ge62Cb01Select = null;
108            private String dmnName = null;
109    
110            private ApplicationInfo appInfo = null;
111            private boolean debug = false;
112    
113            /**
114             * ã“ã?タイマã?タスクã«ã‚ˆã£ã¦åˆæœŸåŒ–ã•れるアクションã§ã™ã?
115             * パラメータを使用ã—ãŸåˆæœŸåŒ–を行ã„ã¾ã™ã?
116             *
117             */
118            @Override
119            public void initDaemon() {
120                    debug = StringUtil.nval( getValue( "DEBUG" ),debug );
121    
122                    dmnName = getName();
123    
124                    StringBuilder buf = new StringBuilder();
125                    buf.append( GE62CB01_SELECT );
126    
127                    // シスãƒ?ƒ IDã¯å¿??æŒ?®?
128                    String systemId = getValue( "SYSTEM_ID" );
129                    if( StringUtil.isNull( systemId ) ) {
130                            String errMsg = "シスãƒ?ƒ ID方法ã?å¿??æŒ?®šã§ã™ã?" ;
131                            throw new HybsSystemException( errMsg );
132                    }
133                    else {
134                            buf.append( " AND B.SYSTEM_ID='" ).append( systemId ).append( "'" );
135                    }
136    
137                    // èª­å–æ–¹æ³•ã?å¿??æŒ?®?
138                    String kbRead = getValue( "KBREAD" );
139                    if( StringUtil.isNull( kbRead ) ) {
140                            String errMsg = "èª­å–æ–¹æ³•ã?å¿??æŒ?®šã§ã™ã?" ;
141                            throw new HybsSystemException( errMsg );
142                    }
143                    else {
144                            buf.append( " AND B.KBREAD='" ).append( kbRead ).append( "'" );
145                    }
146    
147                    // ãƒ??モングループã?å¿??æŒ?®?
148                    String dmnGroup = getValue( "DMN_GRP" );
149                    if( StringUtil.isNull( dmnGroup ) ) {
150                            String errMsg = "ãƒ??モングループã?å¿??æŒ?®šã§ã™ã?" ;
151                            throw new HybsSystemException( errMsg );
152                    }
153                    else {
154                            buf.append( " AND B.DMN_GRP='" ).append( dmnGroup ).append( "'" );
155                    }
156    
157                    buf.append( " ORDER BY A.HTC" );
158    
159                    ge62Cb01Select = buf.toString() ;
160    
161                    if( debug ) {
162                            System.out.println( "DMN_NAME=[" + dmnName + "]" );
163                            System.out.println( "QUERY=[" + ge62Cb01Select + "]" );
164                    }
165    
166                    if( USE_DB_APPLICATION_INFO ) {
167                            appInfo = new ApplicationInfo();
168                            // ユーザーID,IPアドレス,ホストå
169                            appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
170                            // ç”»é¢ID,æ“ä½?プログラãƒ?D
171                            appInfo.setModuleInfo( "TransferDaemon",dmnName,dmnName );
172                    }
173                    else {
174                            appInfo = null;
175                    }
176            }
177    
178            /**
179             * タイマã?タスクã®ãƒ??モン処ç??é–‹å§‹ã?イントã§ã™ã?
180             *
181             */
182            @Override
183            protected void startDaemon() {
184                    if( loopCnt % LOOP_COUNTER == 0 ) {
185                            loopCnt = 1;
186                            System.out.println();
187                            System.out.print( toString() + " " + new Date()  + " " );
188                    }
189                    else {
190                            System.out.print( "." );
191                            loopCnt++ ;
192                    }
193    
194                    // ä¼é?DB読å?
195                    String[][] vals  = null;
196                    GE62CB01Data ge62Cb01Data = new GE62CB01Data();
197                    try {
198                            vals = DBUtil.dbExecute( ge62Cb01Select,null,appInfo );
199                            if( vals != null && vals.length > 0 ) {
200                                    for( int row=0; running && row<vals.length; row++ ) {
201                                            ge62Cb01Data.addData( vals[row] );
202                                    }
203                            }
204                    }
205                    catch( Throwable ex ) {
206                            String header = "ä¼é?読å–エラー?šDMN_NAME=[" + dmnName + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "] , QUERY=[" + ge62Cb01Select + "]";
207                            String errMsg = header + HybsSystem.CR + StringUtil.stringStackTrace( ex ) ;
208                            System.out.println( errMsg );
209                            LogWriter.log( errMsg );
210                            String errorSendto = HybsSystem.sys( "ERROR_MAIL_TO_USERS" );
211                            sendMail( header, errMsg, errorSendto );
212                    }
213    
214                    // 処ç?®Ÿè¡?
215                    // 読å–対象ã®å˜ä½ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’生æˆã—ã¾ã™ã?
216                    for( String tranKey : ge62Cb01Data.getTranSet() ) {
217                            Transaction tran = null;
218                            TransferConfig conf = null;
219                            String[] htcnoArr = null;
220                            boolean isUpdate = true;
221                            try {
222                                    tran = new TransactionReal( appInfo );
223    
224                                    // 読å–対象+実行方æ³?実行対象ã®å˜ä½ã§å‡¦ç?‚’行ã„ã¾ã™ã?
225                                    for( String confKey : ge62Cb01Data.getExecKeySet( tranKey ) ) {
226                                            conf = ge62Cb01Data.getConfig( confKey );
227                                            htcnoArr = ge62Cb01Data.getHtcno( confKey );
228    
229                                            // ãƒ?ƒãƒ?‚°æƒ??ã‚’å?力ã—ã¾ã™ã?
230                                            if( debug ) {
231                                                    System.out.println();
232                                                    System.out.print( " START = " + new Date() );
233                                                    System.out.print( "[" + dmnName + "]:[" + StringUtil.array2csv( htcnoArr ) + "]:[" + conf.toString() + "]" );
234                                            }
235    
236                                            // ä¼é?ãƒ??タを読ã¿å‡ºã—ã¾ã™ã?
237                                            String[] val = read( htcnoArr, tran );
238                                            // 実行方法ã?オブジェクトを生æ?ã—ã¾ã™ã?
239                                            TransferExec exec = (TransferExec)StringUtil.newInstance( EXEC_CLS_BASE + conf.getKbExec() );
240                                            // 処ç?‚’実行ã—ã¾ã™ã?
241                                            exec.execute( val, conf, tran );
242    
243                                            // ãƒ?ƒãƒ?‚°æƒ??ã‚’å?力ã—ã¾ã™ã?
244                                            if( debug ) {
245                                                    System.out.println();
246                                                    System.out.print( " END = " + new Date() );
247                                                    System.out.print( "[" + dmnName + "]:[" + StringUtil.array2csv( htcnoArr ) + "]:[" + conf.toString() + "]" );
248                                            }
249    
250                                            // 対象ã¨ãªã‚‹ã?スタã®å†??読å–パラメーターã«?‘ã¤ã§ã‚?NOUPDATE"ãŒæŒ‡å®šã•れã¦ã?‚‹å ´åˆã?ã€CB01ã®çжæ³ã‚’æ›´æ–°ã—ãªã?
251                                            if( "NOUPDATE".equalsIgnoreCase( conf.getReadPrm() ) ) {
252                                                    isUpdate = false;
253                                            }
254                                    }
255    
256                                    // 対象ã¨ãªã‚‹ã?スタã®å†??読å–パラメーターã«?‘ã¤ã§ã‚?NOUPDATE"ãŒæŒ‡å®šã•れã¦ã?‚‹å ´åˆã?ã€CB01ã®çжæ³ã‚’æ›´æ–°ã—ãªã?
257                                    if( isUpdate ) {
258                                            complete( htcnoArr, tran );
259                                    }
260                            }
261                            catch( Throwable ex ) {
262                                    // エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ãƒ??ãƒ¢ãƒ³ã‚’åœæ­¢ã—ã¾ã™ã?
263                                    cancel();
264    
265                                    if( tran != null ) {
266                                            tran.rollback();
267                                            tran.close();
268                                            tran = null; // エラー発生時ã¯ã€æŽ¥ç¶šã‚’終äº?—ã¾ã™ã?(次ã®çŠ¶æ³æ›´æ–°ã§ãƒ?ƒƒãƒ‰ãƒ­ãƒ?‚¯ã«ãªã‚‹ãŸã‚?
269                                    }
270    
271                                    if( htcnoArr != null && htcnoArr.length > 0 ) {
272                                            error( htcnoArr ); // エラー発生時ã¯CB01>状態を9:ã‚¨ãƒ©ãƒ¼ã«æ›´æ–°
273                                    }
274    
275                                    String header = "ä¼é?エラー?šDMN_NAME=[" + dmnName + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]";
276                                    String errorSendto = null;
277                                    if( htcnoArr != null && htcnoArr.length > 0 ) {
278                                            header += " , HTCNO=[" + StringUtil.array2csv( htcnoArr ) + "]";
279                                    }
280                                    if( conf != null ) {
281                                            header += " , CONFIG=[" + conf.toString() + "]";
282                                            errorSendto = conf.getErrorSendto();
283                                    }
284    
285                                    String errMsg = header + HybsSystem.CR + StringUtil.stringStackTrace( ex ) ;
286                                    System.out.println( errMsg );
287                                    LogWriter.log( errMsg );
288                                    sendMail( header, errMsg, errorSendto );
289                            }
290                            finally {
291                                    if( tran != null ) { tran.close(); }
292                            }
293                    }
294            }
295    
296            /**
297             * ã“ã?タイマã?タスクã®cancel() メソãƒ?ƒ‰ã‚’オーãƒã?ライドã—ã¾ã™ã?
298             * HybsTimerTaskManager#cancelTask( int ) を実行ã—ã¾ã™ã?
299             *
300             * @return      スケジュールã•れã¦ã?‚‹ 1 回以上実行ã•れãªã??åˆã« true
301             * @see java.util.TimerTask#cancel()
302             */
303            @Override
304            public boolean cancel() {
305                    running = false;
306                    return super.cancel();
307            }
308    
309            /**
310             * CB01を読ã¿è¾¼ã¿ãƒ??ã‚¿ã‚’é?列ã§è¿”ã—ã¾ã™ã?
311             *
312             * @param htcnoArr 読å–対象ã®é€šç•ªNO(é…å?)
313             * @param tran トランザクション
314             *
315             * @return ãƒ??ã‚¿(é…å?)
316             */
317            private String[] read( final String[] htcnoArr, final Transaction tran ) {
318                    if( htcnoArr == null || htcnoArr.length == 0 ) { return new String[0]; }
319    
320                    String htcnos = StringUtil.array2csv( htcnoArr );
321                    StringBuilder buf = new StringBuilder();
322                    buf.append( "SELECT A.HTEXT" );
323                    buf.append( " FROM CB01 A" );
324                    buf.append( " WHERE A.HCDJ = '5'" );
325                    buf.append( " AND A.HTCNO IN (" );
326                    buf.append( htcnos );
327                    buf.append( ") ORDER BY A.HTC, A.HTCNO" );
328    
329                    String[][] vals = DBUtil.dbExecute( buf.toString(),null,tran );
330                    String[] rtn = new String[vals.length];
331                    for( int i=0; i<vals.length; i++ ) {
332                            rtn[i] = vals[i][0];
333                    }
334                    return rtn;
335            }
336    
337            /**
338             * CB01ã®ãƒ˜ãƒƒãƒ??ãƒ??ã‚¿ã®çжæ³ã‚’2:抜å?済ã¿ã«æ›´æ–°ã—ã¾ã™ã?
339             *
340             * @param htcnoArr 更新対象ã®é€šç•ªNO(é…å?)
341             * @param tran トランザクション
342             */
343            private void complete( final String[] htcnoArr, final Transaction tran ) {
344                    if( htcnoArr == null || htcnoArr.length == 0 ) { return; }
345    
346                    String htcnos = StringUtil.array2csv( htcnoArr );
347                    StringBuilder buf = new StringBuilder();
348                    buf.append( "UPDATE CB01 A" );
349                    buf.append( " SET A.HCDJ = '2'" );
350                    buf.append( " WHERE A.HCDJ = '1'" );
351                    buf.append( " AND A.HTCNO IN (" );
352                    buf.append( htcnos );
353                    buf.append( ")" );
354    
355                    DBUtil.dbExecute( buf.toString(),null,tran );
356            }
357    
358            /**
359             * CB01ã®ãƒ˜ãƒƒãƒ??ãƒ??ã‚¿ã®çжæ³ã‚’9:ã‚¨ãƒ©ãƒ¼ã«æ›´æ–°ã—ã¾ã™ã?
360             *
361             * @param htcnoArr 更新対象ã®é€šç•ªNO(é…å?)
362             */
363            private void error( final String[] htcnoArr ) {
364                    if( htcnoArr == null || htcnoArr.length == 0 ) { return; }
365    
366                    String htcnos = StringUtil.array2csv( htcnoArr );
367                    StringBuilder buf = new StringBuilder();
368                    buf.append( "UPDATE CB01 A" );
369                    buf.append( " SET A.HCDJ = '9'" );
370                    buf.append( " WHERE A.HCDJ in ('1','2')" ); // æ—¢ã«å®Ÿè¡ŒPGã§æŠœå?済ã¿ã«æ›´æ–°ã•れã¦ã?‚‹å¯èƒ½æ€§ãŒã‚ã‚?
371                    buf.append( " AND A.HTCNO IN (" );
372                    buf.append( htcnos );
373                    buf.append( ")" );
374    
375                    DBUtil.dbExecute( buf.toString(),null,appInfo ); // エラー更新ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’å?ã‘ã¦å‡¦ç?™ã‚?
376            }
377    
378            /**
379             * ä¼é?定義マスタåŠã?æ—§ä¼é?DBã‹ã‚‰èª­ã¿å‡ºã—ãŸãƒ??タを管ç?—ã¾ã™ã?
380             */
381            private static class GE62CB01Data {
382    
383                    // トランザクションを生æˆã™ã‚‹ã‚­ãƒ¼ã®ã‚»ãƒ?ƒˆ(読å–対象å˜ä½?
384                    private final Set<String> tranSet = new LinkedHashSet<String>();
385                    // トランザクションキー(読å–対象)ã«å¯¾ã™ã‚‹ã€å?ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã®ã‚»ãƒ?ƒˆ
386                    private final Map<String,Set<String>> tran2ExecKeySet = new LinkedHashMap<String,Set<String>>();
387                    // 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã«å¯¾ã™ã‚‹è¨­å®šã‚ªãƒ–ジェクトã?マッピング
388                    private final Map<String,TransferConfig> execKey2Conf = new HashMap<String,TransferConfig>();
389                    // 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã«å¯¾ã™ã‚‹é€šç•ªNO(é…å?)ã®ãƒžãƒƒãƒ”ング
390                    private final Map<String,List<String>> execKey2HtcnoArr = new LinkedHashMap<String,List<String>>();
391    
392                    /**
393                     * GE62åŠã?CB01読å–データを追åŠ?—ã¾ã™ã?
394                     *
395                     * @param data GE62åŠã?CB01読å–データ
396                     */
397                    private void addData( final String[] data ) {
398                            String kbRead           = data[0];
399                            String readObj          = data[1];
400                            String readPrm          = data[2];
401                            String kbExec           = data[3];
402                            String execDbid         = data[4];
403                            String execObj          = data[5];
404                            String execPrm          = data[6];
405                            String errorSendto      = data[7];
406                            String htcno            = data[8];
407    
408                            String tranKey = readObj;
409                            tranSet.add( tranKey );
410    
411                            // 読å–対象 + 実行方æ³?+ 実行対象 å˜ä½ã«å‡¦ç?¯¾è±¡é€šç•ªNOを集ç´?™ã‚?
412                            String execKey = readObj + kbExec + execObj;
413                            Set<String> execKeySet = tran2ExecKeySet.get( tranKey );
414                            if( execKeySet == null ) {
415                                    execKeySet = new LinkedHashSet<String>();
416                            }
417                            execKeySet.add( execKey );
418                            tran2ExecKeySet.put( tranKey, execKeySet );
419    
420                            // ä¼é?設定オブジェクトã?マッãƒ?
421                            TransferConfig conf = execKey2Conf.get( execKey );
422                            if( conf == null ) {
423                                    conf = new TransferConfig(
424                                                                    kbRead, readObj, readPrm
425                                                                    , kbExec, execDbid, execObj, execPrm
426                                                                    , errorSendto, HFROM, HTTP_PROXY_HOST, HTTP_PROXY_PORT );
427                                    execKey2Conf.put( execKey, conf );
428                            }
429    
430                            // 通番NOã®ãƒžãƒƒãƒ?
431                            List<String> htcnoArr = execKey2HtcnoArr.get( execKey );
432                            if( htcnoArr == null ) {
433                                    htcnoArr = new ArrayList<String>();
434                            }
435                            htcnoArr.add( htcno );
436                            execKey2HtcnoArr.put( execKey, htcnoArr );
437                    }
438    
439                    /**
440                     * トランザクション生æ?キー(読å–対象)ã®ã‚»ãƒ?ƒˆã‚’è¿”ã—ã¾ã™ã?
441                     *
442                     * @return トランザクション生æ?キー(読å–対象)ã®ã‚»ãƒ?ƒˆ
443                     */
444                    private Set<String> getTranSet() {
445                            return tranSet;
446                    }
447    
448                    /**
449                     * トランザクション生æ?キー(読å–対象)ã«å¯¾ã™ã‚‹å‡¦ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã®ã‚»ãƒ?ƒˆã‚’è¿”ã—ã¾ã™ã?
450                     *
451                     * @param tranKey トランザクション生æ?キー(読å–対象)
452                     * @return トランザクション生æ?キー(読å–対象)ã«å¯¾ã™ã‚‹å‡¦ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã®ã‚»ãƒ?ƒˆ
453                     */
454                    private Set<String> getExecKeySet( final String tranKey ) {
455                            return tran2ExecKeySet.get( tranKey );
456                    }
457    
458                    /**
459                     * 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã«å¯¾ã™ã‚‹è¨­å®šã‚ªãƒ–ジェクトを返ã—ã¾ã™ã?
460                     *
461                     * @param execKey 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)
462                     * @return 設定オブジェク�
463                     */
464                    private TransferConfig getConfig( final String execKey ) {
465                            return execKey2Conf.get( execKey );
466                    }
467    
468                    /**
469                     * 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)ã«å¯¾ã™ã‚‹é€šç•ªNO(é…å?)ã‚’è¿”ã—ã¾ã™ã?
470                     *
471                     * @param execKey 処ç?‚­ãƒ¼(読å–対象+実行方æ³?実行対象)
472                     * @return 通番NO(é…å?)
473                     */
474                    private String[] getHtcno( final String execKey ) {
475                            List<String> lst = execKey2HtcnoArr.get( execKey );
476                            if( lst == null ) { return new String[0]; }
477    //                      else { return lst.toArray( new String[0] ); }
478                            else { return lst.toArray( new String[lst.size()] ); }
479                    }
480            }
481    }