    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                                        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}