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}