    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.hayabusa.report;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.fukurou.util.LogWriter;
    020import org.opengion.fukurou.util.StringUtil;
    021import org.opengion.fukurou.util.ApplicationInfo;
    022import org.opengion.fukurou.db.DBUtil;
    023
    024/**
    025 * 【DB登録】EXCEL取込機能の最終処理である、テンポラリテーブルから各種アプリ側の
    026 * 本番テーブルへのデータ取込処理のための、PL/SQL をコールします。
    027 * 実際の呼び出しは、{ call 帳票IDP.帳票ID( 結果(STATUS),内容(ERR_CODE),PGID,要求番号 ) }
    028 * という PL/SQL を Call します。
    029 * 第１引数、第２引数は、OUT属性で、結果(STATUS)とエラー時の内容(ERR_CODE)を返します。
    030 * 第３引数は、起動元PGIDです。 第４引数は、処理を行う要求番号です。
    031 * 結果(STATUS)は、正常ならば、0 を返してください。
    032 *
    033 * @og.rev 3.8.0.0 (2005/06/07) 新規追加
    034 * @og.group 帳票システム
    035 *
    036 * @version  4.0
    037 * @author   Kazuhiko Hasegawa
    038 * @since    JDK5.0,
    039 */
    040public class ProgramRun {
    041
    042        private final StringBuilder errMsg = new StringBuilder();
    043        private static final String CR     = HybsSystem.CR ;
    044
    045        private final String    SYSTEM_ID       ;
    046        private final String    YKNO            ;
    047        private final String    LISTID          ;
    048        private final boolean   DEBUG           ;       // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加
    049
    050        private String          sqlCmd  = null;
    051
    052        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    053        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    054
    055        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    056        private final ApplicationInfo appInfo;
    057
    058        /**
    059         * コンストラクター
    060         *
    061         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    062         *
    063         * @param system_id システムID
    064         * @param ykno      要求番号
    065         * @param listId    帳票ID
    066         * @param debug デバッグフラグ言語
    067         */
    068        public ProgramRun( final String system_id, final String ykno, final String listId, final boolean debug ) {
    069                SYSTEM_ID       = system_id;
    070                YKNO            = ykno;
    071                LISTID          = listId;
    072                DEBUG           = debug;
    073
    074                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    075                if( USE_DB_APPLICATION_INFO ) {
    076                        appInfo = new ApplicationInfo();
    077                        // ユーザーID,IPアドレス,ホスト名
    078                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    079                        // 画面ID,操作,プログラムID
    080                        appInfo.setModuleInfo( "ProgramRun",YKNO,LISTID );
    081                }
    082                else {
    083                        appInfo = null;
    084                }
    085        }
    086
    087        /**
    088         * レポート出力処理を実行します。
    089         *
    090         * @return 結果 [true:正常/false:異常]
    091         */
    092        public boolean execute() {
    093                System.out.print( "ProgramRun [" + SYSTEM_ID + "]... " );
    094                boolean flag;
    095
    096                try {
    097                        flag = makeSQLCommand();
    098                        if( flag ) { System.out.print( " MK SQL," ); }
    099
    100                        if( flag ) {
    101                                flag = programRun();
    102                                if( flag ) { System.out.print( " PG RUN," ); }
    103                        }
    104                        System.out.println( " End." );
    105                }
    106                catch( Throwable ex ) {
    107                        errMsg.append( "ProgramRun Execute Error! " ).append( CR ) ;
    108                        errMsg.append( "==============================" ).append( CR );
    109                        errMsg.append( StringUtil.stringStackTrace( ex ) ) ;
    110                        errMsg.append( CR ) ;
    111                        flag = false;
    112                }
    113
    114                return flag ;
    115        }
    116
    117        /**
    118         * PLSQL の call コマンドの文字列を作成します。
    119         * { call 帳票ID+P.帳票ID( 結果(STATUS),内容(ERR_CODE),PGID,要求番号 ) } に対応する
    120         * { call 帳票IDP.帳票ID( ?,?,?,? ) } 文字列を作成します。
    121         *
    122         * @return 結果 [true:正常/false:異常]
    123         */
    124        private boolean makeSQLCommand() {
    125                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
    126
    127                buf.append( "{ call " ).append( LISTID );
    128                buf.append( "P." ).append( LISTID );
    129                buf.append( "( ?,?,?,? ) }" );
    130
    131                sqlCmd = buf.toString();
    132                if( DEBUG ) {
    133                        System.out.println();
    134                        System.out.println( sqlCmd );
    135                }
    136
    137                return true;
    138        }
    139
    140        /**
    141         * 実際のPL/SQL コール処理を行います。
    142         * { call 帳票IDP.帳票ID( 結果(STATUS),内容(ERR_CODE),PGID,要求番号 ) }
    143         * という PL/SQL を Call します。
    144         * 第１引数、第２引数は、OUT属性で、結果(STATUS)とエラー時の内容(ERR_CODE)を
    145         * 返してください。第３引数は、起動元PGIDです。
    146         * 結果(STATUS)は、正常ならば、0 を返してください。
    147         *
    148         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    149         *
    150         * @return 結果 [true:正常/false:異常]
    151         */
    152        private boolean programRun() {
    153
    154                String[] args = new String[] { "ProgRUN",YKNO };
    155                String[] rtn = DBUtil.dbCallExecute( sqlCmd,args,appInfo );     // 3.8.7.0 (2006/12/15)
    156
    157                boolean flag = false;
    158                if( rtn != null && rtn.length == 2 ) {
    159                        String rtnCode = rtn[0];
    160                        String rtnMsg  = rtn[1];
    161                        if( "0".equals( rtnCode ) ) {           // 正常
    162                                flag = true;
    163                        }
    164                        else {
    165                                errMsg.append( "PL/SQL=[" ).append( sqlCmd ).append( "] " );
    166                                errMsg.append( "YKNO=[" ).append( YKNO ).append( "] " );
    167                                errMsg.append( "LISTID=[" ).append( LISTID ).append( "] " );
    168                                errMsg.append( rtnCode ).append( ":" ).append( rtnMsg );
    169                                errMsg.append( CR );
    170                                LogWriter.log( errMsg.toString() );
    171                        }
    172                }
    173                return flag;
    174        }
    175
    176        /**
    177         * エラーが存在した場合に、エラーメッセージを返します。
    178         *
    179         * @return エラーメッセージ String
    180         */
    181        public String getErrMsg() {
    182                return errMsg.toString();
    183        }
    184}