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}