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 * このクラスでは、4つの機能を実装しています。
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}