    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;
    023import org.opengion.fukurou.mail.MailTX ;
    024
    025import java.util.Arrays;
    026
    027/**
    028 * 帳票要求テーブル(GE50)と、エラーテーブル(GE56)に対して、データ書込みを行います。
    029 *
    030 * このクラスでは、４つの機能を実装しています。
    031 *
    032 * ●要求番号採番機能： makeYkno()
    033 *   新たな要求番号を採番します(シーケンスより取得)
    034 *   採番後、内部の要求番号(ykno)もこの値に再セットされます。
    035 * ●帳票要求テーブルデータセット機能： insertGE50( final String fgkan )
    036 *   内部変数にセットされている値を利用して、データ登録を行います。
    037 *   繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、
    038 *   このメソッドを呼び出してください。
    039 *   なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    040 * ●完成フラグ設定機能： updateGE50( final String fgkan )
    041 *   内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    042 *   なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    043 * ●エラーメッセージ登録機能： insertErrorGE56( final String inErrMsg )
    044 *   エラー発生時に、エラーメッセージを登録します。
    045 *   内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    046 *   なお、このメソッドは、要求テーブルの完成フラグは、なにもしませんので、
    047 *   完成フラグ設定機能と併用してください。
    048 *   また、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
    049 *   ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
    050 *   がすべて設定されている場合に、エラー情報のメール送信を行います。
    051 *
    052 * @og.rev 3.8.0.0 (2005/06/07) 新規追加
    053 * @og.group 帳票システム
    054 *
    055 * @version  4.0
    056 * @author   Kazuhiko Hasegawa
    057 * @since    JDK5.0,
    058 */
    059public class GE50Access {
    060        /** 完成フラグのフラグ定義(登録) {@value} */
    061        public static final String FG_SET  = "1";       // 登録
    062        /** 完成フラグのフラグ定義(済み) {@value} */
    063        public static final String FG_OK   = "2";       // 済み
    064        /** 完成フラグのフラグ定義(実行中) {@value} */
    065        public static final String FG_RUN  = "3";       // 実行中
    066        /** 完成フラグのフラグ定義(手動) {@value} */
    067        public static final String FG_HAND = "4";       // 手動
    068        /** 完成フラグのフラグ定義(印刷待ち) {@value} */
    069        public static final String FG_WAIT = "5";       // 印刷待ち
    070        /** 完成フラグのフラグ定義(取込済) {@value} */
    071        public static final String FG_DBIN = "6";       // 取込済  Ver 3.8.0.0
    072        /** 完成フラグのフラグ定義(デーモンエラー) {@value} */
    073        public static final String FG_ERR1 = "7";       // デーモンエラー
    074        /** 完成フラグのフラグ定義(アプリエラー) {@value} */
    075        public static final String FG_ERR2 = "8";       // アプリエラー
    076
    077        // GE50 の要求番号のシーケンスを取得します。
    078        private static final String GE50_SEQ = "SELECT GE50_SEQUENCE.NEXTVAL FROM DUAL" ;
    079
    080        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    081        private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE";
    082        private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR";
    083
    084        // GE50 に要求データを設定します。
    085        // 5.0.3.0 (2009/11/04) OUTFILE ⇒ OUT_FILE , OUTDIR ⇒ OUT_DIR
    086        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
    087        private static final String GE50_INSERT =
    088                "INSERT INTO GE50" +
    089                " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,"+OUT_DIR+","+OUT_FILE+",COMMENTS," +
    090                "  FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD,DMN_NAME,DMN_HOST )" +
    091                " VALUES" +
    092                "  (?,?,?,?,?,?,?,SUBSTRB(?,1,100)," +
    093                "  '1',?,?,?,?,?,?,? )" ;
    094
    095        // GE50 の完成フラグを設定するSQL文です。
    096        // 3.8.0.4 (2005/08/08) PGUPD も更新するように変更
    097        private static final String GE50_UPDATE =
    098                "UPDATE GE50 SET FGKAN = ? , DYUPD = ? , DMN_NAME = ? , DMN_HOST = ? " +
    099                " WHERE FGJ = '1'" +
    100                " AND   SYSTEM_ID = ?" +
    101                " AND   YKNO  = ?" ;
    102
    103        // GE56 のエラー情報を書き込むためのSQL文です。
    104        private static final String GE56_ERRMSG =
    105                "INSERT INTO GE56" +
    106                "        ( FGJ,SYSTEM_ID,YKNO,ERRMSG,DYSET,DYUPD,USRSET,USRUPD,PGUPD )" +
    107                " VALUES ( '1',?        ,?   ,?     ,?    ,?    ,?     ,?     ,?      )" ;
    108
    109        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    110        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    111
    112        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    113        private final ApplicationInfo appInfo;
    114        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    115
    116        private final String USRSET ;
    117        private final String PGUPD ;
    118        private final String DMN_NAME ;         // 3.8.5.0 (2006/03/02)
    119
    120        private String systemId = null;
    121        private String ykno             = null;
    122        private String listid   = null;
    123        private String joken    = null;
    124        private String outdir   = null;
    125        private String outfile  = null;
    126        private String comments = null;
    127
    128        /**
    129         * ユーザーとプログラムIDを指定して、オブジェクトを構築します。
    130         * このオブジェクトを構築した時刻を、DYSET、DYUPD にセットします。
    131         * つまり、このオブジェクトで登録する一連のデータは、すべて同一時刻での登録になります。
    132         *
    133         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    134         *
    135         * @param       usrset  ユーザー
    136         * @param       prgupd  プログラムID
    137         * @param       dmnName 更新デーモン名
    138         */
    139        public GE50Access( final String usrset, final String prgupd ,final String dmnName) {
    140                USRSET   = substr( usrset, 10, "UNNONE" ) ;
    141                PGUPD   = substr( prgupd, 10, "UNNONE" ) ;
    142                DMN_NAME = substr( dmnName,50, "UNNONE" ) ;
    143
    144                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    145                if( USE_DB_APPLICATION_INFO ) {
    146                        appInfo = new ApplicationInfo();
    147                        // ユーザーID,IPアドレス,ホスト名
    148                        appInfo.setClientInfo( USRSET,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    149                        // 画面ID,操作,プログラムID
    150                        appInfo.setModuleInfo( "GE50Access",null,DMN_NAME );
    151                }
    152                else {
    153                        appInfo = null;
    154                }
    155        }
    156
    157        /**
    158         * systemId をセットします。
    159         *
    160         * @param systemId システムID
    161         */
    162        public void setSystemId ( final String systemId ) { this.systemId = systemId; }
    163
    164        /**
    165         * systemId を取得します。
    166         *
    167         * @return      システムID
    168         */
    169        public String getSystemId() { return systemId; }
    170
    171        /**
    172         * listid をセットします。
    173         *
    174         * @param listid 帳票ID
    175         */
    176        public void setListId( final String listid ) { this.listid = listid; }
    177
    178        /**
    179         * joken をセットします。
    180         *
    181         * @param joken 振分条件
    182         */
    183        public void setJoken( final String joken ) { this.joken = joken; }
    184
    185        /**
    186         * outdir をセットします。
    187         *
    188         * @param outdir 出力DIR
    189         */
    190        public void setOutDir( final String outdir ) { this.outdir = outdir; }
    191
    192        /**
    193         * outfile をセットします。
    194         *
    195         * @param outfile 出力ファイル
    196         */
    197        public void setOutFile( final String outfile ) { this.outfile = outfile; }
    198
    199        /**
    200         * comments をセットします。
    201         *
    202         * @param comments コメント
    203         */
    204        public void setComments( final String comments ) { this.comments = comments; }
    205
    206        /**
    207         * ykno をセットします。
    208         *
    209         * @param ykno 要求番号
    210         */
    211        public void setYkno( final String ykno ) { this.ykno = ykno; }
    212
    213        /**
    214         * ykno を取得します。
    215         *
    216         * @return      要求番号
    217         */
    218        public String getYkno() { return ykno; }
    219
    220        /**
    221         * 新たな要求番号を採番します(シーケンスより取得)
    222         * 採番後、内部の要求番号(ykno)もこの値に再セットされます。
    223         *
    224         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    225         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    226         *
    227         * @return      要求番号
    228         */
    229        public String makeYkno() {
    230                try {
    231                        String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo, DBID );      // 5.5.5.1 (2012/08/07)
    232                        ykno = vals[0][0].trim();
    233                }
    234                catch( RuntimeException ex ) {
    235                        String errMsg = "要求番号の採番に失敗しました。" + HybsSystem.CR
    236                                                + " SQL=" + GE50_SEQ + HybsSystem.CR
    237                                                + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
    238                        LogWriter.log( errMsg );
    239                        LogWriter.log( ex );
    240                }
    241                return ykno ;
    242        }
    243
    244        /**
    245         * 帳票要求テーブルにデータをセットします。
    246         * 内部変数にセットされている値を利用して、データ登録を行います。
    247         * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、
    248         * このメソッドを呼び出してください。
    249         * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    250         *
    251         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    252         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    253         *
    254         * @param fgkan 完成フラグ
    255         */
    256        public void insertGE50( final String fgkan ) {
    257                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    258
    259                // GE50_INSERT の引数
    260                String[] args = new String[] {
    261                                                        systemId,       // SYSTEM_ID
    262                                                        ykno ,          // YKNO
    263                                                        StringUtil.nval( listid,"NO_LIST" ),            // LISTID
    264                                                        StringUtil.nval( joken,"NO_JOKEN" ),            // JOKEN
    265                                                        fgkan,          // FGKAN
    266                                                        StringUtil.nval( outdir,"" ),           // OUT_DIR
    267                                                        StringUtil.nval( outfile,"" ),          // OUT_FILE
    268                                                        StringUtil.nval( comments,"" ),         // COMMENTS
    269                                                        DYSET,                                  // DYSET
    270                                                        DYSET,                                  // DYUPD
    271                                                        USRSET,                                 // USRSET
    272                                                        USRSET,                                 // USRUPD
    273                                                        PGUPD,                                  // PGUPD
    274                                                        DMN_NAME,                               // DMN_NAME
    275                                                        HybsSystem.HOST_NAME    // DMN_HOST
    276                                                } ;
    277
    278                try {
    279                        DBUtil.dbExecute( GE50_INSERT,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    280                }
    281                catch( RuntimeException ex ) {
    282                        String errMsg = "帳票要求テーブルデータセットに失敗しました。" + HybsSystem.CR
    283                                                + " SQL=" + GE50_INSERT + HybsSystem.CR
    284                                                + ex.getMessage();                                                      // 5.1.8.0 (2010/07/01) errMsg 修正
    285                        LogWriter.log( errMsg );
    286                        LogWriter.log( ex );
    287                }
    288        }
    289
    290        /**
    291         * 処理終了後に完成フラグを設定します。
    292         * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    293         * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。
    294         *
    295         * @og.rev 3.8.0.4 (2005/08/08) PGUPDを追加
    296         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    297         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    298         *
    299         * @param fgkan 完成フラグ
    300         */
    301        public void updateGE50( final String fgkan ) {
    302                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    303
    304                String[] args = new String[] {
    305                                                        fgkan,                                          // FGKAN
    306                                                        DYSET,                                          // DYUPD
    307                                                        DMN_NAME,                                       // DMN_NAME
    308                                                        HybsSystem.HOST_NAME,           // DMN_HOST
    309                                                        systemId,                                       // SYSTEM_ID
    310                                                        ykno                                            // YKNO
    311                                                } ;
    312
    313                try {
    314                        DBUtil.dbExecute( GE50_UPDATE,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    315                }
    316                catch( RuntimeException ex ) {
    317                        String errMsg = "完成フラグ設定に失敗しました。" + HybsSystem.CR
    318                                                + " SQL=" + GE50_UPDATE + HybsSystem.CR
    319                                                + ex.getMessage();                                                      // 5.1.8.0 (2010/07/01) errMsg 修正
    320                        LogWriter.log( errMsg );
    321                        LogWriter.log( ex );
    322                }
    323        }
    324
    325        /**
    326         * エラー発生時に、エラーメッセージを登録します。
    327         * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。
    328         *
    329         * @og.rev 3.8.5.3 (2006/06/30) エラーメッセージを 4000Byte以下にする。
    330         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    331         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    332         *
    333         * @param       inErrMsg        エラーメッセージ
    334         */
    335        public void insertErrorGE56( final String inErrMsg ) {
    336
    337                String outErrMsg = (inErrMsg == null) ? "" : inErrMsg.trim();
    338                if( outErrMsg.length() > 2000 ) {
    339                        String code = HybsSystem.sys( "DB_ENCODE" );
    340                        byte[] byteValue = StringUtil.makeByte( outErrMsg,code );
    341                        if( byteValue.length > 4000 ) {
    342                                outErrMsg = StringUtil.makeString( byteValue,0,4000,code );
    343                        }
    344                }
    345                String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02)
    346
    347                String[] args = new String[] {
    348                                                                systemId,
    349                                                                ykno,
    350                                                                outErrMsg ,             // ERRMSG
    351                                                                DYSET,                  // DYSET
    352                                                                DYSET,                  // DYUPD
    353                                                                USRSET,                 // USRSET
    354                                                                USRSET,                 // USRUPD
    355                                                                PGUPD };                // PGUPD
    356
    357                try {
    358                        DBUtil.dbExecute( GE56_ERRMSG,args,appInfo, DBID );     // 5.5.5.1 (2012/08/07)
    359                }
    360                catch( RuntimeException ex ) {
    361                        String errMsg = "エラーメッセージテーブルセットに失敗しました。" + HybsSystem.CR
    362                                                + " SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "]" + HybsSystem.CR
    363                                                + " SQL=" + GE56_ERRMSG + HybsSystem.CR
    364                                                + ex.getMessage();                      // 5.1.8.0 (2010/07/01) errMsg 修正
    365                        LogWriter.log( errMsg );
    366                        LogWriter.log( ex );
    367                }
    368                sendMail( outErrMsg );          // 3.8.0.4 (2005/08/08)
    369        }
    370
    371        /**
    372         * substring を補完する簡易メソッド
    373         *
    374         * substring で、文字をカットする場合、文字列長が、カットする文字数より
    375         * 長い必要があります。ここでは、最大長に制限をかけることが目的なので
    376         * 入力文字長が指定文字数より小さいケースがあります。そのチェックを
    377         * 簡易的に実行できるように、このメソッドで処理します。
    378         *
    379         * @param       in      入力文字
    380         * @param       len     最大文字数
    381         * @param       defVal  NULL 時の初期値
    382         *
    383         * @return 指定の文字数でカットされた新しい文字列
    384         */
    385        private String substr( final String in, final int len, final String defVal ) {
    386                String rtn = in;
    387                if( in == null ) {
    388                        rtn = defVal;
    389                }
    390                else if( in.length() > len ) {
    391                        rtn = in.substring( 1,len );
    392                }
    393
    394                return rtn ;
    395        }
    396
    397        /**
    398         * エラー情報のメール送信を行います。
    399         * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
    400         * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
    401         * がすべて設定されている場合に、送信されます。
    402         *
    403         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
    404         * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み
    405         *
    406         * @param       inErrMsg        エラーメッセージ
    407         */
    408        private void sendMail( final String inErrMsg ) {
    409
    410                String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
    411                String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
    412                String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
    413                String   match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29)
    414
    415                if( host != null && from != null && to.length > 0 ) {
    416                        if( match_txt == null || match_txt.length() == 0
    417                                        || listid == null || listid.length() == 0
    418                                        || listid.matches( match_txt ) ){       // 5.7.0.4 (2013/11/29)
    419                                // 3.8.5.0 (2006/03/02) DMN_NAME、DMN_HOST 追加
    420                                // 5.7.0.4 (2013/11/29) listid追加
    421                                String subject = "SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "] , "
    422                                                           + "DMN_NAME=[" + DMN_NAME + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]"
    423                                                           + "LISTID=[" + listid +"]";
    424                                try {
    425                                        MailTX tx = new MailTX( host );
    426        //                              tx.setHost( host );
    427                                        tx.setFrom( from );
    428                                        tx.setTo( to );
    429                                        tx.setSubject( "帳票エラー：" + subject );
    430                                        tx.setMessage( inErrMsg );
    431                                        tx.sendmail();
    432                                }
    433                                catch( Throwable ex ) {
    434                                        String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR
    435                                                                + " SUBJECT:" + subject                                 + HybsSystem.CR
    436                                                                + " HOST:" + host                                               + HybsSystem.CR
    437                                                                + " FROM:" + from                                               + HybsSystem.CR
    438                                                                + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
    439                                                                + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
    440                                        LogWriter.log( errMsg );
    441                                        LogWriter.log( ex );
    442                                }
    443                        }
    444                }
    445        }
    446}