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