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