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 * ②処理実行
038 *  実行方法に対応する各実装クラスの処理を呼び出し①で取得したデータに対して処理を実行します。
039 * ③終了処理
040 *  ①、②が正常終了した場合,読取方法のクラスで定義された終了処理を実行します。
041 *  ①、②でエラーが発生した場合、読取方法のクラスで定義されたエラー処理を実行します。
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                                }
132
133                                // 読取方法のオブジェクトを生成し、伝送プロセスにセットします。
134                                read = (TransferRead)StringUtil.newInstance( READ_CLASS_BASE + config.getKbRead() );
135
136                                // 実行方法のオブジェクトを生成し、伝送プロセスにセットします。
137                                exec = (TransferExec)StringUtil.newInstance( EXEC_CLASS_BASE + config.getKbExec() );
138
139                                String[] vals = read.read( config, tran );
140                                exec.execute( vals, config, tran );
141                                read.complete( config, tran );
142
143                                // デバッグ情報を出力します。
144                                if( isDebug ) {
145                                        System.out.println();
146                                        System.out.print( " END   = " + new Date() );
147                                        System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" );
148                                }
149                        }
150                }
151                catch( Throwable ex ) {
152                        if( tran != null ) {
153                                tran.rollback();
154                                tran.close();
155                                tran = null; // エラー発生時は、接続を終了します。(次の状況更新でデッドロックになるため)
156                        }
157
158                        if( read != null ) {
159                                read.error( config, appInfo );
160                        }
161
162                        throw new RuntimeException( ex );
163                }
164                finally {
165                        if( tran != null ) { tran.close(); }
166                }
167        }
168
169        /**
170         * 実行用のメインメソッド
171         *
172         * Usage: java org.opengion.hayabusa.transfer.TransferProcess
173         *  -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]
174         *  -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]
175         *  -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]
176         *
177         * @param       args    コマンド引数配列
178         */
179        public static void main( final String[] args ) {
180                try {
181                        if( args.length < 5 ) {
182                                LogWriter.log( "Usage: java org.opengion.hayabusa.transfer.TransferProcess" );
183                                LogWriter.log( "   -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]" );
184                                LogWriter.log( "   -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]" );
185                                LogWriter.log( "   -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]" );
186                                return;
187                        }
188
189                        String kbRead   = null;
190                        String readObj  = null;
191                        String readPrm  = null;
192                        String kbExec   = null;
193                        String execObj  = null;
194                        String execPrm  = null;
195                        String dbConfig = null;
196                        String execDbid = null;
197                        String hfrom    = null;
198
199                        for( int i=0; i<args.length; i++ ) {
200                                String arg = args[i];
201                                if( arg.startsWith( "-kbRead=" ) ) {
202                                        kbRead = arg.substring( 8 );
203                                }
204                                else if( arg.startsWith( "-readObj=" ) ) {
205                                        readObj = arg.substring( 9 );
206                                }
207                                else if( arg.startsWith( "-readPrm=" ) ) {
208                                        readPrm = arg.substring( 9 );
209                                }
210                                else if( arg.startsWith( "-kbExec=" ) ) {
211                                        kbExec = arg.substring( 8 );
212                                }
213                                else if( arg.startsWith( "-execObj=" ) ) {
214                                        execObj = arg.substring( 9 );
215                                }
216                                else if( arg.startsWith( "-execPrm=" ) ) {
217                                        execPrm = arg.substring( 9 );
218                                }
219                                else if( arg.startsWith( "-DBConfig=" ) ) {
220                                        dbConfig = arg.substring( 10 );
221                                }
222                                else if( arg.startsWith( "-execDbid=" ) ) {
223                                        execDbid = arg.substring( 10 );
224                                }
225                                else if( arg.startsWith( "-hfrom=" ) ) {
226                                        hfrom = arg.substring( 7 );
227                                }
228                        }
229
230                        if(     kbRead == null || kbRead.length() == 0
231                                ||      readObj == null || readObj.length()     == 0
232                                ||      kbExec  == null || kbExec.length()      == 0
233                                ||      execObj == null || execObj.length() == 0
234                                ||      dbConfig== null || dbConfig.length()== 0 ) {
235                                                LogWriter.log( "以下のパラメーターは必須です。" );
236                                                LogWriter.log( "-kbRead=読取方法 -readObj=読取対象" );
237                                                LogWriter.log( "-kbExec=実行方法 -execObj=実行対象" );
238                                                LogWriter.log( "-DBConfig=DBConfig.xml" );
239                        }
240
241                        // DBID接続情報の取得先の設定
242                        ConnectionFactory.init( null,dbConfig );
243
244                        // 伝送設定オブジェクト
245                        TransferConfig config = new TransferConfig(
246                                                                                kbRead, readObj, readPrm
247                                                                                , kbExec, execDbid, execObj, execPrm
248                                                                                , null, hfrom, null, -1 );
249                        Set<TransferConfig> configSet = new HashSet<TransferConfig>();
250                        configSet.add( config );
251
252                        // 伝送処理を実行します。
253                        TransferProcess proc = new TransferProcess( configSet );
254
255                        System.out.println( "EXEC START Config=[" + config.toString() + "]" );
256                        proc.process();
257                        System.out.println( "EXEC END   Config=[" + config.toString() + "]" );
258                }
259                catch( Throwable ex ) {
260                        ex.printStackTrace();
261                        // 異常終了の場合
262                        System.exit( 1 );
263                }
264
265                // 正常終了の場合
266                System.exit( 0 );
267        }
268}