    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}