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.fukurou.transfer;
017
018import java.util.Date;
019import java.util.HashSet;
020import java.util.Set;
021
022import org.opengion.fukurou.db.ConnectionFactory;
023import org.opengion.fukurou.db.Transaction;
024import org.opengion.fukurou.db.TransactionReal;
025import org.opengion.fukurou.util.ApplicationInfo;
026import org.opengion.fukurou.util.LogWriter;
027import org.opengion.fukurou.util.StringUtil;
028
029/**
030 * 伝送処理を実行するためのクラスです。
031 *
032 * 伝送デーモンでセットされた読取方法、実行方法の基づき伝送処理を実行します。
033 * 伝送処理は以下のフローで実行されます。
034 *
035 * @データの読み取り
036 *  読取方法に対応する各実装クラスの処理を呼び出しデータを読み取ります。
037 * A処理実行
038 *  実行方法に対応する各実装クラスの処理を呼び出し@で取得したデータに対して処理を実行します。
039 * B終了処理
040 *  @、Aが正常終了した場合,読取方法のクラスで定義された終了処理を実行します。
041 *  @、Aでエラーが発生した場合、読取方法のクラスで定義されたエラー処理を実行します。
042 *
043 * @og.group 伝送システム
044 *
045 * @version  5.0
046 * @author   Hiroki.Nakamura
047 * @since    JDK1.6
048 */
049public class TransferProcess {
050
051        // 実行方法に対応する実装クラスの基準名
052        private static final String READ_CLASS_BASE = "org.opengion.fukurou.transfer.TransferRead_" ;
053
054        // 実行方法に対応する実装クラスの基準名
055        private static final String EXEC_CLASS_BASE = "org.opengion.fukurou.transfer.TransferExec_" ;
056
057        // 実行対象の伝送セットオブジェクトのセット
058        private final Set<TransferConfig> configSet;
059
060        // 最後に実行した伝送設定オブジェクト
061        private TransferConfig config = null;
062
063        // 実行デーモン名
064        private String dmnName = null;
065
066        // DB接続情報記録
067        private ApplicationInfo appInfo;
068
069        // デバッグ情報を出力するかどうか
070        private boolean isDebug = false;
071
072        /**
073         * コンストラクタです。
074         *
075         * @param configSet 伝送設定オブジェクトのセット
076         */
077        public TransferProcess( final Set<TransferConfig> configSet ) {
078                this.configSet = configSet;
079        }
080        
081        /**
082         * デーモン名をセットします。
083         *
084         * @param dmnName デーモン名
085         */
086        public void setDmnName( final String dmnName ) {
087                this.dmnName = dmnName;
088        }
089
090        /**
091         * DB接続情報をセットします。
092         *
093         * @param appInfo DB接続情報
094         */
095        public void setAppInfo( final ApplicationInfo appInfo ) {
096                this.appInfo = appInfo;
097        }
098
099        /**
100         * デバッグ情報を出力します。
101         */
102        public void setDebug() {
103                isDebug = true;
104        }
105
106        /**
107         * 最後に実行した伝送設定オブジェクトを返します。
108         *
109         * @return 伝送設定オブジェクト
110         */
111        public TransferConfig getLastConfig() {
112                return config;
113        }
114
115        /**
116         * 伝送処理を実行します。
117         */
118        public void process() {
119                Transaction tran = new TransactionReal( appInfo );
120                TransferRead read = null;
121                TransferExec exec = null;
122                try {
123                        for( TransferConfig c : configSet ) {
124                                config = c;
125
126                                // デバッグ情報を出力します。
127                                if( isDebug ) {
128                                        System.out.println();
129                                        System.out.print( " START = " + new Date() );
130                                        System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" );
131                                        System.out.println();
132                                }
133
134                                // 読取方法のオブジェクトを生成し、伝送プロセスにセットします。
135                                read = (TransferRead)StringUtil.newInstance( READ_CLASS_BASE + config.getKbRead() );
136
137                                // 実行方法のオブジェクトを生成し、伝送プロセスにセットします。
138                                exec = (TransferExec)StringUtil.newInstance( EXEC_CLASS_BASE + config.getKbExec() );
139
140                                String[] vals = read.read( config, tran );
141                                exec.execute( vals, config, tran );
142                                read.complete( config, tran );
143
144                                // デバッグ情報を出力します。
145                                if( isDebug ) {
146                                        System.out.println();
147                                        System.out.print( " END   = " + new Date() );
148                                        System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" );
149                                        System.out.println();
150                                }
151                        }
152                }
153                catch( Throwable ex ) {
154                        if( tran != null ) {
155                                tran.rollback();
156                                tran.close();
157                                tran = null; // エラー発生時は、接続を終了します。(次の状況更新でデッドロックになるため)
158                        }
159
160                        if( read != null ) {
161                                read.error( config, appInfo );
162                        }
163
164                        throw new RuntimeException( ex );
165                }
166                finally {
167                        if( tran != null ) { tran.close(); }
168                }
169        }
170
171        /**
172         * 実行用のメインメソッド
173         *
174         * Usage: java org.opengion.hayabusa.transfer.TransferProcess
175         *  -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]
176         *  -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]
177         *  -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]
178         *  [-debug=true/false]
179         *  
180         * @og.rev 5.8.3.2 (2015/01/30) debug追加
181         * @og.rev 5.8.4.2 (2015/02/28) 修正
182         *
183         * @param       args    コマンド引数配列
184         */
185        public static void main( final String[] args ) {
186                boolean debug   = false; // 5.8.3.2 (2015/01/30) 
187                try {
188                        if( args.length < 5 ) {
189                                LogWriter.log( "Usage: java org.opengion.hayabusa.transfer.TransferProcess" );
190                                LogWriter.log( "   -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]" );
191                                LogWriter.log( "   -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]" );
192                                LogWriter.log( "   -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]" );
193                                return;
194                        }
195
196                        String kbRead   = null;
197                        String readObj  = null;
198                        String readPrm  = null;
199                        String kbExec   = null;
200                        String execObj  = null;
201                        String execPrm  = null;
202                        String dbConfig = null;
203                        String execDbid = null;
204                        String hfrom    = null;
205                        
206
207                        for( int i=0; i<args.length; i++ ) {
208                                String arg = args[i];
209                                if( arg.startsWith( "-kbRead=" ) ) {
210                                        kbRead = arg.substring( 8 );
211                                }
212                                else if( arg.startsWith( "-readObj=" ) ) {
213                                        readObj = arg.substring( 9 );
214                                }
215                                else if( arg.startsWith( "-readPrm=" ) ) {
216                                        readPrm = arg.substring( 9 );
217                                }
218                                else if( arg.startsWith( "-kbExec=" ) ) {
219                                        kbExec = arg.substring( 8 );
220                                }
221                                else if( arg.startsWith( "-execObj=" ) ) {
222                                        execObj = arg.substring( 9 );
223                                }
224                                else if( arg.startsWith( "-execPrm=" ) ) {
225                                        execPrm = arg.substring( 9 );
226                                }
227                                else if( arg.startsWith( "-DBConfig=" ) ) {
228                                        dbConfig = arg.substring( 10 );
229                                }
230                                else if( arg.startsWith( "-execDbid=" ) ) {
231                                        execDbid = arg.substring( 10 );
232                                }
233                                else if( arg.startsWith( "-hfrom=" ) ) {
234                                        hfrom = arg.substring( 7 );
235                                }
236                                else if( arg.startsWith( "-debug=" ) ) { // 5.8.3.2 (2015/01/30) 
237                                        if( "true".equals(arg.substring( 7 )) ){ debug = true; }  // 5.8.4.2 (2015/02/28)
238                                }
239                        }
240
241                        if(     kbRead == null || kbRead.length() == 0
242                        ||      readObj == null || readObj.length() == 0
243                        ||      kbExec == null || kbExec.length() == 0
244                        ||      execObj == null || execObj.length() == 0
245                        ||      dbConfig == null || dbConfig.length() == 0 ) {
246                                LogWriter.log( "以下のパラメーターは必須です。" );
247                                LogWriter.log( "-kbRead=読取方法 -readObj=読取対象" );
248                                LogWriter.log( "-kbExec=実行方法 -execObj=実行対象" );
249                                LogWriter.log( "-DBConfig=DBConfig.xml" );
250                        }
251
252//                      HybsSystem.setInitialData( new HashMap<String,String>() );
253
254                        // DBID接続情報の取得先の設定
255                        ConnectionFactory.init( null,dbConfig );
256
257                        // 伝送設定オブジェクト
258                        TransferConfig config = new TransferConfig(
259                                                                                kbRead, readObj, readPrm
260                                                                                , kbExec, execDbid, execObj, execPrm
261                                                                                , null, hfrom, null, -1 );
262                        Set<TransferConfig> configSet = new HashSet<TransferConfig>();
263                        configSet.add( config );
264
265                        // 伝送処理を実行します。
266                        TransferProcess proc = new TransferProcess( configSet ); 
267                        if( debug ){ // 5.8.3.2 (2015/01/30)
268                                proc.setDebug();
269                        }
270                        
271
272                        System.out.println( "EXEC START Config=[" + config.toString() + "]" );
273                        proc.process();
274                        System.out.println( "EXEC END   Config=[" + config.toString() + "]" );
275                }
276                catch( Throwable ex ) {
277                        ex.printStackTrace();
278                        // 5.8.3.2 (2015/01/30)
279                        if( debug ){
280                                System.out.println( ex.toString() );
281                        }
282                        // 異常終了の場合
283                        System.exit( 1 );
284                }
285
286                // 正常終了の場合
287                System.exit( 0 );
288        }
289}